天天看點

ucos-ii 中OSTaskResume函數了解

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);

繼續閱讀