ucos-II 任务调度源码分析(三)

ucos-II并不像linux等操作系统一样提供中断程序处理的框架,更合理的说法是用户必须在自己的中断服务程序中适配ucos的任务调度机制。这个适配就是在OSIntEnter和OSIntExit。ucos-II在中断机制中考虑如下两点设计:

  1. 中断是可以嵌套的,但所有嵌套的中断必须一次处理完;
  2. 当所有嵌套的中断处理完成后,选择优先级最高的任务执行,而非被中断的任务;

ucos-II中中断的例子(STC单片机串口中断):

复制代码
SerialISR:
    USING 0
    CLR EA
    LCALL_? OSIntEnter
    LCALL_? serial
    LCALL_? OSIntExit
    SETB EA
    POPALL
    RETI
复制代码

函数OSIntEnter中全局变量OSIntNesting++,表示中断的嵌套程度;

函数OSIntExit完成如下工作:

  1. 如果OSIntNesting为0,即所有的嵌套中断都已经完成,调用OS_SchedNew,获取当前最高优先级的就绪任务;
  2. 如果获取到任务不是当前的任务,调用OSIntCtxSw(定义在OS_CPU_A.ASM中),找到待执行任务的SP进行切换;(其中的机制与普通任务调度的原理一样,见ucos-II 任务调度(二))。

      注:堆栈指针需要SP=SP-4,退回OSIntEnter和OSIntExit两个函数对堆栈的影像。

 

 

posted @   Fredric_2013  阅读(595)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示