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

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












評論