恢复任务,OSTaskResume()
2017-03-13 10:08
288 查看
在上一节中曾提到过,被挂起的任务只有通过调用OSTaskResume()才能恢复。OSTaskResume()函数的代码如程序清单 L4.17所示。因为OSTaskSuspend()不能挂起空闲任务,所以必须得确认用户的应用程序不是在恢复空闲任务[L4.17(1)]。注意,这个测试也可以确保用户不是在恢复优先级为OS_PRIO_SELF的任务(OS_PRIO_SELF被定义为0xFF,它总是比OS_LOWEST_PRIO大)。 要恢复的任务必须是存在的,因为用户要需要操作它的任务控制块OS_TCB[L4.17(2)],并且该任务必须是被挂起的[L4.17(3)]。OSTaskResume()是通过清除OSTCBStat域中的OS_STAT_SUSPEND位来取消挂起的[L4.17(4)]。要使任务处于就绪状态,OS_TCBDly域必须为0[L4.17(5)],这是因为在OSTCBStat中没有任何标志表明任务正在等待延时的期满。只有当以上两个条件都满足的时候,任务才处于就绪状态[L4.17(6)]。最后,任务调度程序会检查被恢复的任务拥有的优先级是否比调用本函数的任务的优先级高[L4.17(7)]。 程序清单 L 4.17 OSTaskResume(). INT8U OSTaskResume (INT8U prio) { OS_TCB *ptcb; If (prio >= OS_LOWEST_PRIO) { (1) return (OS_PRIO_INVALID); } OS_ENTER_CRITICAL(); If ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) { (2) OS_EXIT_CRITICAL(); return (OS_TASK_RESUME_PRIO); } else { if (ptcb->OSTCBStat & OS_STAT_SUSPEND) { (3) if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) && (4) (ptcb->OSTCBDly == 0)) { (5) OSRdyGrp |= ptcb->OSTCBBitY; (6) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; OS_EXIT_CRITICAL(); OSSched(); (7) } else { OS_EXIT_CRITICAL(); } return (OS_NO_ERR); } else { OS_EXIT_CRITICAL(); return (OS_TASK_NOT_SUSPENDED); } } }
相关文章推荐
- 恢复任务,OSTaskResume()
- UC/OS基础知识之任务的挂起和恢复
- UC/OS II 任务管理(5)之任务删除、阻塞和恢复
- 改变任务的优先级,OSTaskChangePrio()
- uC/OS-II的任务管理(在文件OS_task.C中)
- uC /OS-II中任务的挂起和恢复
- 任务控制块(Task Control Blocks, OS_TCBs)
- 【iCore3 双核心板_ uC/OS-III】例程三:任务的挂起与恢复
- uC/OS-II 学习笔记之:任务挂起与恢复,调度器上锁与解锁!
- 任务内建消息队列——OSTaskQ???()
- 让处在延时期的任务结束延时,OSTimeDlyResume()
- 任务控制块(Task Control Blocks, OS_TCBs)
- 删除任务,OSTaskDel()
- 请求删除任务,OSTaskDelReq()
- 使一个任务进入等待某事件发生状态, OSEventTaskWait()
- 挂起任务,OSTaskSuspend()
- 挂起任务,OSTaskSuspend()
- 获得有关任务的信息,OSTaskQuery()
- 建立任务,OSTaskCreate()源码解析
- 建立任务,OSTaskCreate()