删除任务

来源:互联网 发布:js 二维数组匹配 编辑:程序博客网 时间:2024/04/27 13:10
  1. 有时候删除任务是很有必要的。删除任务,是说任务将返回并处于休眠状态(参看3.02,任务状态),并不是说任务的代码被删除了,只是任务的代码不再被µC/OS-Ⅱ调用。通过调用OSTaskDel()就可以完成删除任务的功能(如程序清单 L4.11所示)。OSTaskDel()一开始应确保用户所要删除的任务并非是空闲任务,因为删除空闲任务是不允许的[L4.11(1)]。不过,用户可以删除statistic任务[L4.11(2)]。接着,OSTaskDel()还应确保用户不是在ISR例程中去试图删除一个任务,因为这也是不被允许的[L4.11(3)]。调用此函数的任务可以通过指定OS_PRIO_SELF参数来删除自己[L4.11(4)]。接下来OSTaskDel()会保证被删除的任务是确实存在的[L4.11(3)]。如果指定的参数是OS_PRIO_SELF的话,这一判断过程(任务是否存在)自然是可以通过的,但笔者不准备为这种情况单独写一段代码,因为这样只会增加代码并延长程序的执行时间。程序清单 L 4.11  删除任务  
  2. INT8U OSTaskDel (INT8U prio)  
  3. {  
  4.     OS_TCB   *ptcb;  
  5.     OS_EVENT *pevent;  
  6.   
  7.     if (prio == OS_IDLE_PRIO) { (1)  
  8.         return (OS_TASK_DEL_IDLE);  
  9.     }  
  10.     if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {    (2)  
  11.         return (OS_PRIO_INVALID);  
  12.     }  
  13.     OS_ENTER_CRITICAL();  
  14.     if (OSIntNesting > 0) {  (3)  
  15.         OS_EXIT_CRITICAL();  
  16.         return (OS_TASK_DEL_ISR);  
  17.     }  
  18.     if (prio == OS_PRIO_SELF) { (4)  
  19.         Prio = OSTCBCur->OSTCBPrio;  
  20.     }  
  21.     if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) {   (5)  
  22.         if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {  (6)  
  23.             OSRdyGrp &= ~ptcb->OSTCBBitY;  
  24.         }  
  25.         if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) {   (7)  
  26.             if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {  
  27.                 pevent->OSEventGrp &= ~ptcb->OSTCBBitY;  
  28.             }  
  29.         }  
  30.         Ptcb->OSTCBDly  = 0; (8)  
  31.         Ptcb->OSTCBStat = OS_STAT_RDY;   (9)  
  32.         OSLockNesting++;    (10)  
  33.         OS_EXIT_CRITICAL(); (11)  
  34.         OSDummy();  (12)        OS_ENTER_CRITICAL();  
  35.         OSLockNesting--;    (13)  
  36.         OSTaskDelHook(ptcb);    (14)  
  37.         OSTaskCtr--;  
  38.         OSTCBPrioTbl[prio] = (OS_TCB *)0;   (15)  
  39.         if (ptcb->OSTCBPrev == (OS_TCB *)0) {    (16)  
  40.             ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;  
  41.             OSTCBList                  = ptcb->OSTCBNext;  
  42.         } else {  
  43.             ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;  
  44.             ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;  
  45.         }  
  46.         ptcb->OSTCBNext = OSTCBFreeList; (17)  
  47.         OSTCBFreeList   = ptcb;  
  48.         OS_EXIT_CRITICAL();  
  49.         OSSched();  (18)  
  50.         return (OS_NO_ERR);  
  51.     } else {  
  52.         OS_EXIT_CRITICAL();  
  53.         return (OS_TASK_DEL_ERR);  
  54.     }  
  55. }  
  56.   
0 0
原创粉丝点击