1.中断
系统收到中断请求后,若CPU处于中断允许状态,则中止当前任务,转去运行中断子程序。中断子程序运行结束后,返回被中止的任务继续运行或者转向优先级更高的任务。UCOSIII支持中断嵌套,即高优先级的中断可以打断低优先级的中断,在UCOSIII中使用OSIntNestingCtr来记录中断嵌套次数,最大支持250级的中断嵌套,每进入一次中断服务函数OSIntNestingCtr就会加1,当退出中断服务函数的时候OSIntNestingCtr就会减1。
一般操作流程:
中断预处理:
- 进入中断时先关中断,之后将CPU寄存器保存到任务堆栈内,这些对C程序员是透明的;
- 通过OSIntEnter()函数,递增OSIntNestingCtr值,表示多一层嵌套的中断;
- 若此中断为第一层中断,还应保存此时的堆栈指针值;
- 清除中断请求标志位;
中断处理:
- 重新开中断(根据实际需要来选择);
- 进行相关的处理,但原则上应该尽量精简,最好只是发布信息,实际工作由相关任务来做;
中断后处理:
- 调用OSIntExit()函数:递减OSIntNestingCtr,若退为0,表示已经没有中断,系统内核判断是否使某个高优先级任务就绪;
- 若有高优先级任务就绪,此时中断不会返回之前任务,而是直接执行高优先级任务ÿ