任務(wù)管理的數(shù)據(jù)結(jié)構(gòu)包括任務(wù)控制塊、任務(wù)空閑鏈表和任務(wù)就緒鏈表、任務(wù)優(yōu)先級指針表、任務(wù)堆棧等,是uC/OS-II內(nèi)核的核心部分之一。離開了這些數(shù)據(jù)結(jié)構(gòu),內(nèi)核什么功能也完成不了。這些數(shù)據(jù)的內(nèi)容完全反映了任務(wù)的運(yùn)行情況。
任務(wù)控制塊是任務(wù)管理的核心數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng)在啟動的時(shí)候,首先要在內(nèi)存中創(chuàng)建一定數(shù)量的任務(wù)控制塊。任務(wù)控制塊的數(shù)量等于操作系統(tǒng)能同時(shí)管理的最多任務(wù)數(shù)。
uC/OS將任務(wù)控制塊劃分為兩個(gè)鏈表:就緒鏈表和空閑鏈表。創(chuàng)建一個(gè)任務(wù),就從空閑鏈表中取出一個(gè)空閑的任務(wù)控制塊,將任務(wù)的各種屬性添入該控制塊,并將該任務(wù)控制塊移到就緒鏈表,更改就緒表和就緒組,任務(wù)就從睡眠態(tài)轉(zhuǎn)換到就緒態(tài),當(dāng)沒有更高優(yōu)先級的任務(wù)在運(yùn)行時(shí),任務(wù)就可以得到運(yùn)行。相反,要結(jié)束一個(gè)任務(wù)的運(yùn)行,就要將該任務(wù)的任務(wù)控制塊從就緒鏈表移到空閑鏈表,然后修改就緒表和就緒組,取消任務(wù)的就緒標(biāo)志,就緒就從就緒態(tài)轉(zhuǎn)換到其他狀態(tài),而只有再回到就緒態(tài)才有可能得到運(yùn)行。
任務(wù)控制塊的基本結(jié)構(gòu)體在ucos_ii.h文件中定義:
51.png (33.04 KB, 下載次數(shù): 80)
下載附件
2013-7-14 04:00 上傳
52.png (13.83 KB, 下載次數(shù): 76)
下載附件
2013-7-14 04:00 上傳
對任務(wù)控制塊結(jié)構(gòu)OS_TCB說明如下:
(1)*OSTCBStkPtr是指向OS_STK數(shù)據(jù)類型的指針。OS_STK在OS_CPU.h文件中定義:
54.png (53.21 KB, 下載次數(shù): 68)
下載附件
2013-7-14 04:00 上傳
因此,OS_STK就是無符號整形。OS_STK是任務(wù)堆棧的每個(gè)數(shù)據(jù)項(xiàng)的類型,對于不同的硬件系統(tǒng)是不同的,在做移植的時(shí)候就需要進(jìn)行修改。OS_CPU.h中定義了和CPU有關(guān)的數(shù)據(jù)結(jié)構(gòu)和全局變量。
任務(wù)堆棧的操作是最底層的,要用匯編語言來寫代碼,因此指針在整個(gè)結(jié)構(gòu)體的第一句開始定義。那么在定義結(jié)構(gòu)體的實(shí)體后,控制塊的0地址就存儲了任務(wù)堆棧的棧頂?shù)刂罚奖懔藚R編語言操作。
換句話說,OSTCBStkPtr是只想任務(wù)堆棧棧頂?shù)闹羔。每個(gè)任務(wù)都有自己的任務(wù)堆棧,任務(wù)堆棧是進(jìn)行任務(wù)切換的關(guān)鍵數(shù)據(jù)結(jié)構(gòu),任務(wù)運(yùn)行的CPU環(huán)境,包括任務(wù)的代碼的地址都保存在任務(wù)堆棧中。
(2)結(jié)構(gòu)體OS_TCB中,使用了條件編譯語句(#if和#endif)。條件編譯的含義是只有在OS_TASK_CREATE_EXT_EN>0的情況下,#if和#endif之間的代碼才會被編譯,任務(wù)控制塊才會包含這些字段。OS_TASK_CREATE_EXT_EN是在頭文件中定義的宏,當(dāng)它為1時(shí),表示使用任務(wù)創(chuàng)建擴(kuò)展功能,該段代碼就會被編譯,OS_TCB中就包含了#if和#endif之間的5種結(jié)構(gòu)體字段。相反,如果OS_TASK_CREATE_EXT_EN=0,那么該5種字段不會被包含。這樣的設(shè)計(jì)能最小化程序的代碼和使用最小的內(nèi)存空間。
在操作系統(tǒng)的設(shè)計(jì)過程中,空間和效率是至關(guān)重要的,條件編譯語句使用的非常多。
(3)接下來又是一個(gè)條件編譯,含義為如果使用消息隊(duì)列或消息郵箱或信號量(包括普通信號量和互斥信號量),那么任務(wù)要用到事件控制塊,OSTCBEventPtr即指向事件控制塊的指針。否則不定義該字段。在默認(rèn)情況下,是要用到事件控制塊的。從這個(gè)條件編譯指令可以知道,消息、隊(duì)列、信號量等都要用到事件控制塊。
(4)任務(wù)狀態(tài)OSTCBStat。任務(wù)狀態(tài)的取值范圍和對應(yīng)的宏如表
(5)任務(wù)優(yōu)先級OSTCBPrio。每個(gè)任務(wù)有唯一的優(yōu)先級,因此uC/OS-II以優(yōu)先級作為事件的標(biāo)志,作為任務(wù)管理的主鍵。任務(wù)的優(yōu)先級可以是0~63,但優(yōu)先級62和63被統(tǒng)計(jì)任務(wù)和空閑任務(wù)占用,用戶任務(wù)的優(yōu)先級可以選擇0~61,數(shù)字越低,優(yōu)先級越高。
(
6)
53.png (1.42 KB, 下載次數(shù): 68)
下載附件
2013-7-14 04:00 上傳
該處4項(xiàng)都與設(shè)置就緒表有關(guān),而就緒表中的內(nèi)容對應(yīng)著任務(wù)的優(yōu)先級,因此,這4項(xiàng)都是關(guān)于優(yōu)先級的運(yùn)算。其目的在于提前進(jìn)行運(yùn)算,即在任務(wù)創(chuàng)建時(shí)運(yùn)行一次,而在任務(wù)調(diào)度的時(shí)候不需要反復(fù)進(jìn)行運(yùn)算,以節(jié)省時(shí)間,含義如表所示:
| |
| 任務(wù)優(yōu)先級右移3位,相當(dāng)于優(yōu)先級除以8 |
| |
| |
| 任務(wù)優(yōu)先級在對應(yīng)的任務(wù)就緒表中的位置 |