UCOSII 详解part3.pdf
文本预览下载声明
2.6.2 OSTaskSuspend流程分析
根据对代码的分析,给出流程,如图2.20所示。
开始,参数prio为任
务 先级
是否是挂起 自己?
否
是
是
参数及控制
块检查
Self=FALSE
Self=TRUE
是否正确?
在就绪表中删除
就绪标志
在控制块中的OSTCBStat
设置挂起标志
否
否 Self==TRUE?
是
进行任务调度
返回
图2.20 任务挂起的流程
2.6.3 OSTaskResume代码解析
通过前面两节的学习,可知函数OSTaskSuspend用来暂时停止一个任务的执行,将任务
状态转换为阻塞态。那么处于阻塞态的任务要想得到运行,必须先恢复到就绪态。这个恢复
被挂起的任务的函数就是OSTaskResume,它和OSTaskSuspend正好是一对函数。
在OSTaskSuspend挂起一个任务的时候,要修改就绪表和就绪组,取消任务的就绪标志
;那么当恢复一个任务的时候,应该加上就绪标志。另外,对于挂起的标志,是在任务控制
块中的OSTCBStat从低到高的第4位,因此,如果恢复一个任务,应该看这一位是否已经被
置位,如果没有被置位,那么恢复操作也应该是无效的。最后,如果一切正常,再将该位进
行复位。
程序2.26给出了OSTaskResume代码的详细解析。
嵌入式实时操作系统μC/OS原理与实践
程序2.26 OSTaskResume代码解析
INT8U OSTaskResume (INT8U prio)
{
OS_TCB *ptcb;
#if OS_ARG_CHK_EN 0u
if (prio = OS_LOWEST_PRIO) { /*检查优先级有效性*/
return (OS_ERR_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
ptcb = OSTCBPrioTbl[prio];
if (ptcb == (OS_TCB *)0) { /*被挂起的任务必须存在*/
OS_EXIT_CRITICAL();
显示全部