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