關于uC/OS-II中的任務掛起討論
uC/OS-II是經(jīng)典的實時操作系統(tǒng),開源的優(yōu)點就是可以使用者自己去分析和裁剪。我就簡單的說明一下uC/OS-II中的任務掛起以及任務喚醒操作。
本文引用地址:http://www.ex-cimer.com/article/201612/324532.htm在uC/OS-II中任務之間的切換比較簡單,就是運行態(tài)-就緒態(tài)-掛起態(tài)(等待態(tài))-中斷服務態(tài)-睡眠態(tài),其中睡眠態(tài)主要是指沒有被創(chuàng)建的任務,也就是我們可以定義很多的任務,但是不一定全部創(chuàng)建,當然也可以是被刪除以后的任務,我們也可以稱之為睡眠態(tài),這也是我們不經(jīng)常使用的任務。其他的中斷服務態(tài)實際上就是在中斷服務中,他的運行級別是最高的。就緒態(tài)就是已經(jīng)做好運行準備的狀態(tài),運行態(tài)永遠只有一個任務處于運行態(tài)。而掛起態(tài)或者稱等待態(tài)是最復雜的過程,其中牽涉到很多中不同的掛起狀態(tài)。
幾種典型的掛起態(tài)我做一下總結(jié):
1、任務的掛起操作,一般都是采用OSTaskSuspend()將任務掛起,這種掛起的操作一般都是比較簡單的將就緒表中優(yōu)先級對應的位和組分別清除即可,而這種掛起的方式被喚醒的方式有且只有一種,即采用OSTaskResume()函數(shù)將就緒表中優(yōu)先級對應的位和組就緒即可。這也應該說是最準確的掛起,而不是所謂的等待態(tài)。
2、任務中調(diào)用時間延遲函數(shù)的掛起方式,準確的說這種掛起就是等待態(tài),我們所謂的延遲等待,基本的實現(xiàn)原理就是通過節(jié)拍服務函數(shù)OSTimeTick()減小延遲等待時間,這個實際上就是對任務控制塊OS_TCB中的變量OSTCBDly操作而實現(xiàn)的。在OSTCBDly>0期間將任務在就緒表中的位和組分別清除,是任務處于掛起操作,這種掛起實質(zhì)和任務的掛起方式相同。但是OSTimeTick()的實現(xiàn)過程會檢測任務是否是被OSTaskSuspend()掛起,也就是真正的掛起態(tài),只有當任務不是被OSTaskSuspend()掛起時才能被喚醒,這是需要注意的。
3、關于通信機制、同步過程中的任務掛起,這種任務掛起實質(zhì)上是任務等待狀態(tài),實現(xiàn)的過程中會涉及到兩個續(xù)表,其中一個就是任務就緒表,另一個是任務等待續(xù)表,另外為了實現(xiàn)等待超時等問題,將OSTCBDly也考慮了進來,這樣也就使得這種任務的等待比之前的兩種掛起方式要復雜。但是等待超時與等待延遲有一定的相似之處,但不同的地方就是需要將等待續(xù)表中對應的優(yōu)先級位置清除,再設置就緒表中的位置位1,返回超時錯誤,這樣就能實現(xiàn)超時的掛起操作,而一般的事件等待機制,都是涉及到中斷、任務與任務之間的通信或者同步問題,掛起操作首先將任務在就緒表中的就緒標志位清除,同時設置任務的狀態(tài)為某種形式的掛起,然后設置等待續(xù)表中的相關位置,最后實現(xiàn)任務的調(diào)度。任務的喚醒操作是另一個任務發(fā)出信號,然后從等待續(xù)表中清除最高優(yōu)先級的任務,然后設置該任務在就緒表中的位置,并設置任務的狀態(tài),最后實現(xiàn)任務的調(diào)度操作。一行就能實現(xiàn)任務的掛起操作。
綜合上面的總結(jié)可以知道uC/OS-II的任務掛起操作主要是3種,其中前兩種相比而言比較簡單,只是簡單的依靠就緒表或者時間延遲變量即可實現(xiàn)。而當涉及到任務的同步等機制時就會依靠就緒表,等待續(xù)表,以及時間延遲變量。但是任務的掛起和睡眠本質(zhì)上也是存在差別的,并不是同一種概念,因此我們在學下uC/OS-II的過程中需要特別注意。
評論