μC/OS-II的內(nèi)核結(jié)構(gòu)
了任務(wù),棧檢驗功能報告的棧使用情況將是錯誤的。如果任務(wù)一旦建立就決不會被刪除,
而用戶初始化時,已將RAM清過零,則OS_TASK_OPT_STK_CLR不需要再定義,這可以節(jié)約程
序執(zhí)行時間。傳遞了OS_TASK_OPT_STK_CLR將增加TaskCreateExt()函數(shù)的執(zhí)行時間,因為
要將棧空間清零。棧容量越大,清零花的時間越長。最后一個選擇項
OS_TASK_OPT_SAVE_FP通知TaskCreateExt(),任務(wù)要做浮點運算。如果微處理器有硬件的
浮點協(xié)處理器,則所建立的任務(wù)在做任務(wù)調(diào)度切換時,浮點寄存器的內(nèi)容要保存。
.OSTCBId用于存儲任務(wù)的識別碼。這個變量現(xiàn)在沒有使用,留給將來擴展用。
.OSTCBNext 和.OSTCBPrev 用于任務(wù)控制塊OS_TCBs的雙重鏈接,該鏈表在時鐘節(jié)拍函數(shù)
OSTimeTick()中使用,用于刷新各個任務(wù)的任務(wù)延遲變量.OSTCBDly,每個任務(wù)的任務(wù)控制
塊OS_TCB在任務(wù)建立的時候被鏈接到鏈表中,在任務(wù)刪除的時候從鏈表中被刪除。雙重連
接的鏈表使得任一成員都能被快速插入或刪除。
.OSTCBEventPtr是指向事件控制塊的指針,后面的章節(jié)中會有所描述(見第6章任務(wù)間通
訊與同步)。
.OSTCBMsg是指向傳給任務(wù)的消息的指針。用法將在后面的章節(jié)中提到(見第6章任務(wù)間通
訊與同步)。
.OSTCBDly 當需要把任務(wù)延時若干時鐘節(jié)拍時要用到這個變量,或者需要把任務(wù)掛起一段
時間以等待某事件的發(fā)生,這種等待是有超時限制的。在這種情況下,這個變量保存的是
任務(wù)允許等待事件發(fā)生的最多時鐘節(jié)拍數(shù)。如果這個變量為0,表示任務(wù)不延時,或者表
示等待事件發(fā)生的時間沒有限制。
.OSTCBStat是任務(wù)的狀態(tài)字。當.OSTCBStat為0,任務(wù)進入就緒態(tài)。可以給.OSTCBStat賦
其它的值,在文件uCOS_II.H中有關(guān)于這個值的描述。
.OSTCBPrio是任務(wù)優(yōu)先級。高優(yōu)先級任務(wù)的.OSTCBPrio值小。也就是說,這個值越小,任
務(wù)的優(yōu)先級越高。
.OSTCBX,.OSTCBY,.OSTCBBitX和.OSTCBBitY 用于加速任務(wù)進入就緒態(tài)的過程或進入等
待事件發(fā)生狀態(tài)的過程(避免在運行中去計算這些值)。這些值是在任務(wù)建立時算好的,
或者是在改變?nèi)蝿?wù)優(yōu)先級時算出的。這些值的算法見程序清單L3.4。
程序清單 L3.4 任務(wù)控制塊OS_TCB中幾個成員的算法
OSTCBY=priority>>3;
OSTCBBitY=OSMapTbl[priority>>3];
OSTCBX=priority0x07;
OSTCBBitX=OSMapTbl[priority0x07];
.OSTCBDelReq是一個布爾量,用于表示該任務(wù)是否需要刪除,用法將在后面的章節(jié)中描述
(見第4章任務(wù)管理)
應(yīng)用程序中可以有的最多任務(wù)數(shù)(OS_MAX_TASKS)是在文件OS_CFG.H中定義的。這個
最多任務(wù)數(shù)也是μC/OS-Ⅱ分配給用戶程序的最多任務(wù)控制塊OS_TCBs的數(shù)目。將
OS_MAX_TASKS的數(shù)目設(shè)置為用戶應(yīng)用程序?qū)嶋H需要的任務(wù)數(shù)可以減小RAM的需求量。所有
的任務(wù)控制塊OS_TCBs都是放在任務(wù)控制塊列表數(shù)組OSTCBTbl[]中的。請注意,μC/OS-Ⅱ
分配給系統(tǒng)任務(wù)OS_N_SYS_TASKS若干個任務(wù)控制塊,見文件μC/OS-Ⅱ.H,供其內(nèi)部使
用。目前,一個用于空閑任務(wù),另一個用于任務(wù)統(tǒng)計(如果OS_TASK_STAT_EN是設(shè)為
1的)。在μC/OS-Ⅱ初始化的時候,如圖3.2所示,所有任務(wù)控制塊OS_TCBs被鏈接成單
向空任務(wù)鏈表。當任務(wù)一旦建立,空任務(wù)控制塊指針OSTCBFreeList指向的任務(wù)控制塊便
賦給了該任務(wù),然后OSTCBFreeList的值調(diào)整為指向下鏈表中下一個空的任務(wù)控制塊。一
旦任務(wù)被刪除,任務(wù)控制塊就還給空任務(wù)鏈表。

圖3.2空任務(wù)列表
3.4 就緒表(ReadyList)
每個任務(wù)被賦予不同的優(yōu)先級等級,從0級到最低優(yōu)先級OS_LOWEST_PR1O,包括0和S_LOWEST_PR1O在內(nèi)(見文件OS_CFG.H)。當μC/OS-Ⅱ初始化的時候,最低優(yōu)先級OS_LOWEST_PR1O總是被賦給空閑任務(wù)idletask。注意,最多任務(wù)數(shù)目OS_MAX_TASKS和最低優(yōu)先級數(shù)是沒有關(guān)系的。用戶應(yīng)用程序可以只有10個任務(wù),而仍然可以有32個優(yōu)先級的級別(如果用戶將最低優(yōu)先級數(shù)設(shè)為31的話)。
每個任務(wù)的就緒態(tài)標志都放入就緒表中的,就緒表中有兩個變量OSRedyGrp和OSRdyTbl[]。在OSRdyGrp中,任務(wù)按優(yōu)先級分組,8個任務(wù)為一組。OSRdyGrp中的每一位表示8組任務(wù)中每一組中是否有進入就緒態(tài)的任務(wù)。任務(wù)進入就緒態(tài)時,就緒表OSRdyTbl[]中的相應(yīng)元素的相應(yīng)位也置位。就緒表OSRdyTbl[]數(shù)組的大小取決于OS_LOWEST_PR1O(見文件OS_CFG.H)。當用戶的應(yīng)用程序中任務(wù)數(shù)目比較少時,減少OS_LOWEST_PR1O的值可以降低μC/OS-Ⅱ?qū)AM(數(shù)據(jù)空間)的需求量。
為確定下次該哪個優(yōu)先級的任務(wù)運行了,內(nèi)核調(diào)度器總是將OS_LOWEST_PR1O在就緒表中相應(yīng)字節(jié)的相應(yīng)位置1。OSRdyGrp和OSRdyTbl[]之間的關(guān)系見圖3.3,是按以下規(guī)則給出的:
當OSRdyTbl[0]中的任何一位是1時,OSRdyGrp的第0位置1,
當OSRdyTbl[1]中的任何一位是1時,OSRdyGrp的第1位置1,
當OSRdyTbl[2]中的任何一位是1時,OSRdyGrp的第2位置1,
當OSRdyTbl[3]中的任何一位是1時,OSRdyGrp的第3位置1,
當OSRdyTbl[4]中的任何一位是1時,OSRdyGrp的第4位置1,
當OSRdyTbl[5]中的任何一位是1時,OSRdyGrp的第5位置1,
當OSRdyTbl[6]中的任何一位是1時,OSRdyGrp的第6位置1,
當OSRdyTbl[7]中的任何一位是1時,OSRdyGrp的第7位置1,
程序清單3.5中的代碼用于將任務(wù)放入就緒表。Prio是任務(wù)的優(yōu)先級。
程序清單L3.5使任務(wù)進入就緒態(tài)
OSRdyGrp|=OSMapTbl[prio>>3];
OSRdyTbl[prio>>3]|=OSMapTbl[prio0x07];
表T3.1OSMapTbl[]的值

評論