文档详情

UCOSII 详解part3.pdf

发布:2017-05-22约3.16万字共21页下载文档
文本预览下载声明
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();
显示全部
相似文档