ucos-ii 中OSTaskResume函數理解

來源:互聯網
上載者:User

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 {

            OS_EXIT_CRITICAL();

        }

        return (OS_NO_ERR);

    }

    OS_EXIT_CRITICAL();

    return (OS_TASK_NOT_SUSPENDED);

}

#endif

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.