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