恢复任务,OSTaskResume()

来源:互联网 发布:c语言教材 编辑:程序博客网 时间:2024/06/03 22:41
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. 在上一节中曾提到过,被挂起的任务只有通过调用OSTaskResume()才能恢复。OSTaskResume()函数的代码如程序清单 L4.17所示。因为OSTaskSuspend()不能挂起空闲任务,所以必须得确认用户的应用程序不是在恢复空闲任务[L4.17(1)]。注意,这个测试也可以确保用户不是在恢复优先级为OS_PRIO_SELF的任务(OS_PRIO_SELF被定义为0xFF,它总是比OS_LOWEST_PRIO大)。  
  2.     要恢复的任务必须是存在的,因为用户要需要操作它的任务控制块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)]。  
  3.   
  4. 程序清单 L 4.17 OSTaskResume().  
  5. INT8U OSTaskResume (INT8U prio)  
  6. {  
  7.     OS_TCB   *ptcb;  
  8.   
  9.   
  10.     If (prio >= OS_LOWEST_PRIO) {                                              (1)  
  11.         return (OS_PRIO_INVALID);  
  12.     }  
  13.     OS_ENTER_CRITICAL();  
  14.     If ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {                         (2)  
  15.         OS_EXIT_CRITICAL();  
  16.         return (OS_TASK_RESUME_PRIO);  
  17.     } else {  
  18.         if (ptcb->OSTCBStat & OS_STAT_SUSPEND) {                            (3)  
  19.             if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) &&    (4)  
  20.                  (ptcb->OSTCBDly  == 0)) {                                    (5)  
  21.                 OSRdyGrp               |= ptcb->OSTCBBitY;                    (6)  
  22.                 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;  
  23.                 OS_EXIT_CRITICAL();  
  24.                 OSSched();                                                   (7)  
  25.             } else {                OS_EXIT_CRITICAL();  
  26.             }  
  27.             return (OS_NO_ERR);  
  28.         } else {  
  29.             OS_EXIT_CRITICAL();  
  30.             return (OS_TASK_NOT_SUSPENDED);  
  31.         }  
  32.     }  

0 0