μC/OS-II的內核結構
z 在文件OS_CFG.H中,OS_TASK_STAT_EN是設為1的。
z 在文件OS_CFG.H中,OS_LOWEST_PRIO是設為63的。
z 在文件OS_CFG.H中,最多任務數OS_MAX_TASKS是設成大于2的。
以上兩個任務的任務控制塊(OS_TCBs)是用雙向鏈表鏈接在一起的。OSTCBList指向這個鏈表的起始處。當建立一個任務時,這個任務總是被放在這個鏈表的起始處。換句話說,OSTCBList總是指向最后建立的那個任務。鏈的終點指向空字符NULL(也就是零)。
因為這兩個任務都處在就緒態,在就緒任務表OSRdyTbl[]中的相應位是設為1的。還有,因為這兩個任務的相應位是在OSRdyTbl[]的同一行上,即屬同一組,故OSRdyGrp中只有1位是設為1的。
μC/OS-Ⅱ還初始化了4個空數據結構緩沖區,如圖F3.8所示。每個緩沖區都是單向鏈
表,允許μC/OS-Ⅱ從緩沖區中迅速得到或釋放一個緩沖區中的元素。注意,空任務控制塊
在空緩沖區中的數目取決于最多任務數OS_MAX_TASKS,這個最多任務數是在OS_CFG.H文件
中定義的。μC/OS-Ⅱ自動安排總的系統任務數OS_N_SYS_TASKS(見文件μC/OS-Ⅱ.H)。控
制塊OS_TCB的數目也就自動確定了。當然,包括足夠的任務控制塊分配給統計任務和空閑
任務。指向空事件表OSEventFreeList和空隊列表OSFreeList的指針將在第6章,任務間
通訊與同步中討論。指向空存儲區的指針表OSMemFreeList將在第7章存儲管理中討論。
3.12 μC/OS-Ⅱ的啟動
多任務的啟動是用戶通過調用 OSStart()實現的。然而,啟動μC/OS-Ⅱ之前,用戶至少
要建立一個應用任務,如程序清單L3.24所示。
程序清單L3.24初始化和啟動μC/OS-Ⅱ
voidmain(void)
{
OSInit();/* 初始化uC/OS-II*/
.
.
通過調用OSTaskCreate()或OSTaskCreateExt()創建至少一個任務;
.
.
OSStart();/* 開始多任務調度!OSStart()永遠不會返回 */
}

圖3.7調用OSInit()之后的數據結構

圖3.8空緩沖區
OSStart()的代碼如程序清單L3.25所示。當調用OSStart()時,OSStart()從任務就緒表中找出那個用戶建立的優先級最高任務的任務控制塊[L3.25(1)]。然后,OSStart()調用高優先級就緒任務啟動函數 OSStartHighRdy()[L3,25(2)],(見匯編語言文件 OS_CPU_A.ASM),這個文件與選擇的微處理器有關。實質上,函數OSStartHighRdy()是將任務棧中保存的值彈回到 CPU 寄存器中,然后執行一條中斷返回指令,中斷返回指令強制執行該任務代碼。見9.04.01節,高優先級就緒任務啟動函數 OSStartHighRdy()。那一節詳細介紹對于 80x86微處理器是怎么做的。注意,OSStartHighRdy()將永遠不返回到 OSStart()。
程序清單 L3.25 啟動多任務.
voidOSStart(void)
{
INT8Uy;
INT8Ux;
if(OSRunning==FALSE){
y=OSUnMapTbl[OSRdyGrp];
x=OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy=(INT8U)((y3)+x);
OSPrioCur=OSPrioHighRdy;
OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];(1)
OSTCBCur=OSTCBHighRdy;
OSStartHighRdy();(2)
}
}
多任務啟動以后變量與數據結構中的內容如圖 F3.9 所示。這里筆者假設用戶建立的任務優先級為 6,注意,OSTaskCtr指出已經建立了 3 個任務。OSRunning已設為“真” ,指出多任務已經開始, OSPrioCur和 OSPrioHighRdy存放的是用戶應用任務的優先級, OSTCBCur和 OSTCBHighRdy二者都指向用戶任務的任務控制塊。
3.13 獲取當前μC/OS-Ⅱ的版本號
應用程序調用OSVersion()[程序清單L3.26]可以得到當前μC/OS-Ⅱ的版本號。
OSVersion()函數返回版本號值乘以100。換言之,200表示版本號2.00。
程序清單L3.26得到μC/OS-Ⅱ當前版本號
INT16UOSVersion(void)
{
return(OS_VERSION);
}
為找到μC/OS-Ⅱ的最新版本以及如何做版本升級,用戶可以與出版商聯系,或者查看
μC/OS-Ⅱ得正式網站WWW.uCOS-II.COM

圖3.9調用OSStart()以后的變量與數據結構
3.14 OSEvent()函數
讀者或許注意到有4個OS_CORE.C中的函數沒有在本章中提到。這4個函數是
OSEventWaitListInit(),OSEventTaskRdy(),OSEventTaskWait(),OSEventTO()。這幾個
函數是放在文件OS_CORE.C中的,而對如何使用這個函數的解釋見第6章,任務間的通訊與
同步。
評論