無錫職業(yè)技術(shù)學(xué)院 陳 堯 樂明于
UCOSII經(jīng)常被用于單片機(jī)的系統(tǒng),使用它能夠更好的調(diào)用單片機(jī)的CPU資源,具有非常多的優(yōu)點,我們可以使用UCOSII干很多的事情。它是一種實時操作系統(tǒng)(RTOS),與許多商用操作系統(tǒng)具有相同的性能。以及系統(tǒng)使用的基本方法,包括創(chuàng)建任務(wù)功能、刪除功能、請求任務(wù)刪除功能、更改功能優(yōu)先級功能、暫停任務(wù)功能、任務(wù)恢復(fù)功能、任務(wù)信息查詢。
UCOSII是由它的前版本UCOS漸漸的發(fā)展過來的,美國的嵌入式學(xué)者在嵌入式期刊中講解和說明了UCOS系統(tǒng)和它的代碼,目前UCOS系統(tǒng)已經(jīng)發(fā)展到了第三個版本,功能越來越強(qiáng)大,而目前市面上最為流行的就是第二個版本UCOSII。
UCOSII設(shè)計的初衷是為了讓嵌入式計算機(jī)能夠更高效的利用資源,它的底層程序基本上都是由c語言構(gòu)成的,而cpu的基層程序程序是由匯編語言構(gòu)成的,整個匯編的部分占用的程序很少很少,因此它的兼容性非常強(qiáng)。使用者只需要很少的要求就可以去使用它。UCOSII系統(tǒng)有許許多多的優(yōu)勢比如它移植方便、效率很高、占用的內(nèi)存很少、有很強(qiáng)的擴(kuò)展性等。UCOSII系統(tǒng)可以在任何的cpu上使用,雖然小巧但是具備很多系統(tǒng)的優(yōu)點。UCOSII是一個非常強(qiáng)大的嵌入式系統(tǒng)。
首先就是任務(wù)的優(yōu)先級,優(yōu)先級顧名思義就是任務(wù)執(zhí)行的先后順序,每一個任務(wù)都有一個優(yōu)先級,而任務(wù)設(shè)置了優(yōu)先級之后,就成為了任務(wù)標(biāo)志,這個標(biāo)志就可以代表任務(wù),我們可以通過優(yōu)先級來對任務(wù)進(jìn)行各種操作,在多個任務(wù)中當(dāng)優(yōu)先級高的任務(wù)執(zhí)行完成的會將CPU釋放,而當(dāng)其他任務(wù)執(zhí)行之中,高優(yōu)先級的任務(wù)執(zhí)行完成程序就會轉(zhuǎn)向到高優(yōu)先級的任務(wù)上去。
任務(wù)棧:
簡而言之就是一個任務(wù)存儲空間,任務(wù)執(zhí)行過程中一些東西就存儲在里邊。他的特點是存儲空間是連續(xù)的,并且創(chuàng)建任務(wù)的同時就需要一個任務(wù)棧。
任務(wù)控制模塊OS_TCB:
任務(wù)控制模塊OS_TCB是用以記錄任務(wù)的各種狀態(tài)參數(shù)的,UCOSII的每個任務(wù)都是由任務(wù)控制模塊控制的,任務(wù)管理主要的幾個元素是任務(wù)的指針,任務(wù)的優(yōu)先級,以及任務(wù)的內(nèi)存指針也就是棧指針。
任務(wù)就緒表:
任務(wù)就緒表就是目前已經(jīng)就緒的所有任務(wù)的表格,他是一個狀態(tài)集,系統(tǒng)的每一個任務(wù)在這個狀態(tài)集中都是存在的。通過觀察任務(wù)的位狀態(tài)時1或者0來看任務(wù)是否就緒。
任務(wù)調(diào)度:
任務(wù)調(diào)度就是在上述的任務(wù)表中找到一個優(yōu)先級最高的任務(wù)去執(zhí)行,讓任務(wù)優(yōu)先級高的任務(wù)去占用cpu資源,將優(yōu)先級最高的任務(wù)劃分到任務(wù)調(diào)度當(dāng)中然后去執(zhí)行它。
UCOSII系統(tǒng)的每一個單獨(dú)的任務(wù)都相當(dāng)于是一個閉死的環(huán),既如果單獨(dú)執(zhí)行一個任務(wù)就不會牽扯到其他的任務(wù),會永遠(yuǎn)的執(zhí)行下去。UCOSII系統(tǒng)的每個任務(wù)都必然處于五個狀態(tài)當(dāng)中。分別時睡眠狀態(tài)也就是掛機(jī)狀態(tài)也就是任務(wù)展示沒有任務(wù)控制模塊也或者時任務(wù)沒有控制模塊狀態(tài),準(zhǔn)備狀態(tài)也就是就緒狀態(tài)隨時可以占用cpu資源來執(zhí)行任務(wù)被系統(tǒng)分配了任務(wù)控制模塊,運(yùn)行狀態(tài)就是正在占用cpu執(zhí)行任務(wù)的狀態(tài),還有等待狀態(tài)以及中斷服務(wù)狀態(tài)等。
UCOSII系統(tǒng)的任務(wù)在這幾個狀態(tài)中按需求轉(zhuǎn)換。
UCOSII是為了嵌入式系統(tǒng)的一個個任務(wù)服務(wù)的,所以必然會有一個任務(wù)創(chuàng)新的函數(shù),UCOSII并不需要我們?nèi)牧汩_始建立任務(wù),我們只需要使用UCOSII系統(tǒng)自帶的函數(shù)就可以實現(xiàn)創(chuàng)建任務(wù)的功能,使用非常的方便,它的函數(shù)名字是OSTaskCreate。原型為:
OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)。
函數(shù)有好幾個參數(shù)包括:代表任務(wù)的指針、傳遞參數(shù)的指針、分配給函數(shù)的內(nèi)存棧頂部的指針、每一個任務(wù)的優(yōu)先級等級(優(yōu)先級是一個任務(wù)在后續(xù)使用中的身份象征)。內(nèi)存棧是每個任務(wù)都必須擁有的東西,每個棧都是以連續(xù)的內(nèi)存構(gòu)成的。
UCOSII的任務(wù)刪除函數(shù),就是將整個任務(wù)在系統(tǒng)中停止掉,而不是表面意義上的說刪除代碼。他是通過操作任務(wù)的優(yōu)先級來產(chǎn)生作用的。
前面提到,必須確保被刪除任務(wù)的資源被釋放的前提下才能將其刪除,所以我們通過向被刪除任務(wù)發(fā)送刪除請求,來實現(xiàn)任務(wù)釋放自身占用資源后再刪除。UCOSII提供的請求刪除任務(wù)函數(shù)原型為:INT8U OSTaskDel(INT8U prio);
在刪除任務(wù)的時候如果任務(wù)沒有釋放資源那么可能會產(chǎn)生邏輯上的錯誤,因此在使用刪除函數(shù)的時候必須要使用請求任務(wù)函數(shù)。通過此函數(shù)來請求被刪除函數(shù),來實現(xiàn)任務(wù)刪除之前先釋放自身的資源。UCOSII提供的請求刪除任務(wù)函數(shù)原型為:INT8U OSTaskDelReq(INT8U prio);
同樣我們還是通過任務(wù)的優(yōu)先級來操作的,優(yōu)先級作為任務(wù)的標(biāo)識。
任務(wù)執(zhí)行的同時是在占用任務(wù)的內(nèi)存棧的也就是說任務(wù)的資源在被任務(wù)占用中。如果我們這個時候?qū)⑷蝿?wù)刪除,那么將會產(chǎn)生錯誤,所以在刪除的時候我們需要去確認(rèn)一下任務(wù)是否將它的資源釋放。因為此UCOSII系統(tǒng)提供了一個專門請求刪除任務(wù)?函數(shù):INT8U OSTaskDelReq(INT8U prio);也就是使用任務(wù)的表示身份優(yōu)先級來實現(xiàn)任務(wù)請求刪除的操作。
創(chuàng)建任務(wù)時,UCOSII會為該任務(wù)分配優(yōu)先級,但優(yōu)先級不是恒定的。任務(wù)的優(yōu)先級如果無法改變那我們在設(shè)定了優(yōu)先級之后每個任務(wù)的優(yōu)先級機(jī)無法改變,這對我們使用UCOSII系統(tǒng)是非常不方便的。因此UCOSII為此提供了一個改變?nèi)蝿?wù)優(yōu)先級的函數(shù)如下:INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio);
任務(wù)掛起函數(shù)使用起來很方便,它跟任務(wù)刪除函數(shù)很相似,卻也有很多不同的點,比如任務(wù)的掛起只改變?nèi)蝿?wù)的就緒狀態(tài)并且記錄下,并沒有像任務(wù)刪除函數(shù)一樣將任務(wù)在任務(wù)控制標(biāo)里刪除,所以它不想任務(wù)刪除函數(shù)一樣需要釋放任務(wù)的資源,被任務(wù)觀其函數(shù)掛起的任務(wù)可以通過函數(shù)解掛也就是恢復(fù)成原來的樣子。INT8U OSTaskSuspend(INT8U prio);
如上所說掛起的任務(wù)可以恢復(fù),說的就是任務(wù)回復(fù)函數(shù)了。此功能允許使用者恢復(fù)掛起的任務(wù),從而允許計劃程序恢復(fù),UCOSII提供的任務(wù)恢復(fù)函數(shù)原型為:INT8U OSTaskResume(INT8U prio)。
UCOSII系統(tǒng)實現(xiàn)了搶占內(nèi)核式的多任務(wù)執(zhí)行,擁有一般系統(tǒng)的服務(wù)。使用時在每個任務(wù)完成后用延遲函數(shù)或者程序需要延遲時釋放CPU,系統(tǒng)就會將CPU釋放給優(yōu)先級最高且就緒的任務(wù),通過這種方式實現(xiàn)多任務(wù)的運(yùn)行。如果高優(yōu)先級的任務(wù)一直沒有釋放CPU的使用權(quán),那么其他低優(yōu)先級的任務(wù)就永遠(yuǎn)無法得到CPU的使用權(quán),也就是說及時任務(wù)沒有刪除或者掛起也無法運(yùn)行。也可以看出UCOSII系統(tǒng)的強(qiáng)大,使用UCOSII系統(tǒng)我們可以更高效的管理嵌入式程序的多任務(wù)。