學習中遇到ostasksuspend該怎么用
時(shi)間:2018-03-02 來源:未知(zhi)
做過單(dan)片機的(de)(de)(de),相(xiang)比都用(yong)過51、STM32等等系列,當今比較(jiao)主流的(de)(de)(de)單(dan)片機以STM32系列的(de)(de)(de)為(wei)主,當在用(yong)STM32單(dan)片機一(yi)(yi)(yi)段時間(jian)之后就會手癢(yang)癢(yang)去(qu)嘗試使用(yong)一(yi)(yi)(yi)下操作系統,那么(me)就一(yi)(yi)(yi)定(ding)會接觸(chu)到uC/OS-II,說到uC/OS-II那么(me)就一(yi)(yi)(yi)定(ding)會有任務(wu)這樣的(de)(de)(de)概(gai)念(nian)。
任務(wu)在創建后將從睡眠態轉換到就緒態,就緒的(de)任務(wu)如(ru)果調用OSTaskSuspend將被(bei)阻塞(sai),也就是被(bei)剝奪(duo)CPU的(de)使用權而(er)暫時中止運行,轉到阻塞(sai)狀態。通過OSTaskSuspend將任務(wu)轉到阻塞(sai)態被(bei)稱為(wei)掛起任務(wu)。
被掛(gua)起的任務(wu)不能運行,知(zhi)道其他任務(wu)以該(gai)任務(wu)的優先(xian)級作為參數(shu)調(diao)用OSTaskResume來恢(hui)復它,才能將該(gai)任務(wu)的狀態重新設置(zhi)為就緒狀態。當(dang)該(gai)任務(wu)是就緒的高(gao)優先(xian)級的任務(wu)時,又可以得到調(diao)度而重新占領CPU,回到運行態。
一個任務如果無事可做,且優先級又較高(gao),長期占有(you)CPU,那么其他的(de)任務將(jiang)得不到(dao)運行而“餓死”。因此,任務在不需要運行的(de)時(shi)候應該放(fang)棄CPU,掛起就是其中的(de)一種策略(lve),除此之(zhi)外(wai)還有(you)任務延時(shi)等(deng)策略(lve)。

由(you)上圖可知,在(zai)運(yun)行(xing)過程的(de)任(ren)務因(yin)為調用(yong)OSTaskSuspend而被掛(gua)起到(dao)阻(zu)塞(sai)態(tai)。阻(zu)塞(sai)態(tai)的(de)任(ren)務因(yin)為其他任(ren)務以該任(ren)務的(de)優先級(ji)作為參數調用(yong)OSTaskResume而得到(dao)恢復,恢復到(dao)就緒態(tai)。就緒的(de)任(ren)務在(zai)優先級(ji)變(bian)為高(gao)的(de)情況下終得到(dao)了運(yun)行(xing)。
值得注意的(de)(de)(de)是(shi),掛起(qi)一個任(ren)務并非將其轉換(huan)掛起(qi)態,而是(shi)阻(zu)塞態。任(ren)務因為中斷(duan)失去CPU控制權才(cai)會轉換(huan)為掛起(qi)態,掛起(qi)態的(de)(de)(de)任(ren)務在中斷(duan)結束后直接回到運行態。這(zhe)兩(liang)者是(shi)有明(ming)顯的(de)(de)(de)區(qu)別的(de)(de)(de)。
函數OSTaskSuspend用來暫時(shi)停止一個(ge)任(ren)務的(de)(de)執(zhi)行(xing),將任(ren)務轉(zhuan)換為(wei)阻塞態。如(ru)果傳遞給OSTaskSuspend的(de)(de)參數是OS_PRIO_SELF,則將阻塞自己,如(ru)果prio是其他任(ren)務的(de)(de)優先(xian)級(ji),則將阻塞其他的(de)(de)就緒任(ren)務。
根(gen)據該函數(shu)執(zhi)行過程中的各種情(qing)況(kuang),返回值包括:
OS_ERR_NONE:如果成功掛起一個(ge)任務
OS_ERR_TASK_SUSPEND_IDLE:如果(guo)試圖阻塞(sai)空(kong)閑任務(wu)。
OS_ERR_PRIO_INVALID:非法的優先級
OS_ERR_TASK_SUSPEND_PRIO:要掛起的任務不存(cun)在(zai)
OS_ERR_TASK_NOT_EXITS:要掛起使用(yong)互斥信號量的任務。
另外有一點需要(yao)(yao)特別注(zhu)(zhu)意的(de)是,如(ru)果掛起了一個任(ren)(ren)務,那么要(yao)(yao)注(zhu)(zhu)意這個任(ren)(ren)務是否在等(deng)待某些事(shi)件(jian)的(de)發生,需要(yao)(yao)防止(zhi)在事(shi)件(jian)發生的(de)時候阻(zu)塞了的(de)任(ren)(ren)務因為事(shi)件(jian)的(de)發生而(er)運行。
調用時(shi)(shi)要十(shi)分小心,如果你(ni)(ni)想掛起一個(ge)等待事(shi)件(jian)(郵箱,消息(xi),隊列)的任(ren)務(wu),事(shi)件(jian)到(dao)來的時(shi)(shi)候你(ni)(ni)將阻止這個(ge)任(ren)務(wu)運行。
注意:OSTaskSuspend()需要與OSTaskResume()恢復掛起的(de)任(ren)務成對使用

