ucosii任务状态转换图

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值