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