ucosii的任务状态转换图

ucosiii任务状态转换图

任哲的图

1、为了及时响应事件,我们用中断而不是轮询寄存器的标志的方式,来判断是否有外部事件发生
例如,为了判断按键是否按下,可以轮询GPIO输入数据寄存器,或者GPIO->EXTI->NVIC->ISR中断函数
2、为了及时处理事件,我们在中断里最多只是做简单的处理,复杂的处理需要中断给某个任务发一个信号,通知某个任务专门处理这个事件
退出中断时,就可能会从当前的任务,切换到一个处理按键事件的任务
中断退出时,可能返回原来的任务,也可能去运行优先级更高的按键任务来及时处理按键事件,所以ucosiii的图,更清楚地表明了这个概念:
无新高级任务则返回原任务:Interrupted->Running
有新高级任务则运行高级任务:Interrupted->Ready(等按键任务运行完了,本任务还有机会继续运行)
本篇博客,我也以ucoiii的图,来分析任务状态的转换。
任务转换时,影响TCB里的任务状态,也影响全局变量就绪表。
五个状态说明

| 节点(图上的圆圈) |
说明 |
| Dormant冬眠态 | a task that resides in memory but has not been made available to µC/OS-III. Dormant-> :OSTaskCreate 操作系统可以调度rom里的task代码 ->Dormant :OSTaskDel 操作系统不能调度rom里的task代码 |
| Ready 就绪态 | 一个任务一厢情愿地说自己准备好了;就绪表里很多任务都说自己准备好了。 pending->ready->running the newly readied task will run immediately if it is the most important task. 往往一个任务被就绪后,会立马进行一次调度,变成running态,因为按照实时的原则 一个高优先级的任务就绪后,我们希望能立马运行,如下面的两个例子中的任务2。 【中断级调度,被动让出cpu】OSTimeTick+OSIntExit OS_CPU_SysTickHandler->OSTimeTick: if (ptcb->OSTCBDly == 0u)某个任务延时到了,变成就绪状态 OSIntExit:退出滴答中断时,发现有就绪的高优先级任务,会切换过去 任务1(running到intrrrupted到ready)->任意位置发生定时器中断->切换到任务2(pending到ready到running) 【任务级切换,主动让出cpu】OSTaskResume+OS_TASK_SW: 任务1(running到ready)->在特定位置调用OSTaskResume->切换到任务2(pending到ready到running) |

最低0.47元/天 解锁文章
2186

被折叠的 条评论
为什么被折叠?



