當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 學(xué)習(xí)中遇到ostasksuspend該怎么用
做過單片機的,相比都用過51、STM32等等系列,當(dāng)今比較主流的單片機以STM32系列的為主,當(dāng)在用STM32單片機一段時間之后就會手癢癢去嘗試使用一下操作系統(tǒng),那么就一定會接觸到uC/OS-II,說到uC/OS-II那么就一定會有任務(wù)這樣的概念。
任務(wù)在創(chuàng)建后將從睡眠態(tài)轉(zhuǎn)換到就緒態(tài),就緒的任務(wù)如果調(diào)用OSTaskSuspend將被阻塞,也就是被剝奪CPU的使用權(quán)而暫時中止運行,轉(zhuǎn)到阻塞狀態(tài)。通過OSTaskSuspend將任務(wù)轉(zhuǎn)到阻塞態(tài)被稱為掛起任務(wù)。
被掛起的任務(wù)不能運行,知道其他任務(wù)以該任務(wù)的優(yōu)先級作為參數(shù)調(diào)用OSTaskResume來恢復(fù)它,才能將該任務(wù)的狀態(tài)重新設(shè)置為就緒狀態(tài)。當(dāng)該任務(wù)是就緒的高優(yōu)先級的任務(wù)時,又可以得到調(diào)度而重新占領(lǐng)CPU,回到運行態(tài)。
一個任務(wù)如果無事可做,且優(yōu)先級又較高,長期占有CPU,那么其他的任務(wù)將得不到運行而“餓死”。因此,任務(wù)在不需要運行的時候應(yīng)該放棄CPU,掛起就是其中的一種策略,除此之外還有任務(wù)延時等策略。
由上圖可知,在運行過程的任務(wù)因為調(diào)用OSTaskSuspend而被掛起到阻塞態(tài)。阻塞態(tài)的任務(wù)因為其他任務(wù)以該任務(wù)的優(yōu)先級作為參數(shù)調(diào)用OSTaskResume而得到恢復(fù),恢復(fù)到就緒態(tài)。就緒的任務(wù)在優(yōu)先級變?yōu)楦叩那闆r下終得到了運行。
值得注意的是,掛起一個任務(wù)并非將其轉(zhuǎn)換掛起態(tài),而是阻塞態(tài)。任務(wù)因為中斷失去CPU控制權(quán)才會轉(zhuǎn)換為掛起態(tài),掛起態(tài)的任務(wù)在中斷結(jié)束后直接回到運行態(tài)。這兩者是有明顯的區(qū)別的。
函數(shù)OSTaskSuspend用來暫時停止一個任務(wù)的執(zhí)行,將任務(wù)轉(zhuǎn)換為阻塞態(tài)。如果傳遞給OSTaskSuspend的參數(shù)是OS_PRIO_SELF,則將阻塞自己,如果prio是其他任務(wù)的優(yōu)先級,則將阻塞其他的就緒任務(wù)。
根據(jù)該函數(shù)執(zhí)行過程中的各種情況,返回值包括:
OS_ERR_NONE:如果成功掛起一個任務(wù)
OS_ERR_TASK_SUSPEND_IDLE:如果試圖阻塞空閑任務(wù)。
OS_ERR_PRIO_INVALID:非法的優(yōu)先級
OS_ERR_TASK_SUSPEND_PRIO:要掛起的任務(wù)不存在
OS_ERR_TASK_NOT_EXITS:要掛起使用互斥信號量的任務(wù)。
另外有一點需要特別注意的是,如果掛起了一個任務(wù),那么要注意這個任務(wù)是否在等待某些事件的發(fā)生,需要防止在事件發(fā)生的時候阻塞了的任務(wù)因為事件的發(fā)生而運行。
調(diào)用時要十分小心,如果你想掛起一個等待事件(郵箱,消息,隊列)的任務(wù),事件到來的時候你將阻止這個任務(wù)運行。
注意:OSTaskSuspend()需要與OSTaskResume()恢復(fù)掛起的任務(wù)成對使用