OSTaskResume() 的傳回值為下述之一:
* OS_NO_ERR:函數調用成功。
* OS_TASK_RESUME_PRIO:要喚醒的任務不存在。
* OS_TASK_NOT_SUSPENDED:要喚醒的任務不在挂起狀态。
* OS_PRIO_INVALID:參數指定的優先級大于或等于OS_LOWEST_PRIO。
#if OS_TASK_SUSPEND_EN > 0
INT8U OSTaskResume (INT8U prio)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_TCB *ptcb; //建立臨時變量ptcb,用來指向任務控制塊
#if OS_ARG_CHK_EN > 0
if (prio >= OS_LOWEST_PRIO) { //檢查優先級的有效性
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
//獲得該優先級的任務控制塊,并判斷是否存在。如果不存在,傳回OS_TASK_RESUME_PRIO
if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {
OS_EXIT_CRITICAL();
return (OS_TASK_RESUME_PRIO);
}
(說明:
在uCOS_II.H中定義的:
#define OS_STAT_RDY 0x00 /* Ready to run 00000000
#define OS_STAT_SEM 0x01 /* Pending on semaphore 00000001
#define OS_STAT_MBOX 0x02 /* Pending on mailbox 00000010
#define OS_STAT_Q 0x04 /* Pending on queue 00000100
#define OS_STAT_SUSPEND 0x08 /* Task is suspended 00001000
#define OS_STAT_MUTEX 0x10 /* Pending on mutual exclusion semaphore 00010000
#define OS_STAT_FLAG 0x20 /* Pending on event flag group 00100000
)
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != 0x00) { //判斷是否是被挂起的任務
if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) &&
(ptcb->OSTCBDly == 0)) {
(說明:後3位置0,即将其轉為OS_STAT_RDY狀态,并且,任務沒有被删除時,修改OSRdyGrp和OSRdyTbl[]的值,将其變為就緒任務。其中OSTCBY、OSTCBBitX是任務控制塊的元素。OSTCBY=priority>>3;OSTCBX=priority&0x07;OSTCBBitY=OSMapTbl[priority>>3];OSTCBBitX=OSMapTbl[priority&0x07]))
OSRdyGrp |= ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
OS_EXIT_CRITICAL();
OS_Sched(); //任務切換
} else {
}
return (OS_NO_ERR);
OS_EXIT_CRITICAL();
return (OS_TASK_NOT_SUSPENDED);