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

圖3.7調(diào)用OSInit()之后的數(shù)據(jù)結(jié)構(gòu)

圖3.8空緩沖區(qū)
OSStart()的代碼如程序清單L3.25所示。當(dāng)調(diào)用OSStart()時(shí),OSStart()從任務(wù)就緒表中找出那個(gè)用戶建立的優(yōu)先級(jí)最高任務(wù)的任務(wù)控制塊[L3.25(1)]。然后,OSStart()調(diào)用高優(yōu)先級(jí)就緒任務(wù)啟動(dòng)函數(shù) OSStartHighRdy()[L3,25(2)],(見匯編語(yǔ)言文件 OS_CPU_A.ASM),這個(gè)文件與選擇的微處理器有關(guān)。實(shí)質(zhì)上,函數(shù)OSStartHighRdy()是將任務(wù)棧中保存的值彈回到 CPU 寄存器中,然后執(zhí)行一條中斷返回指令,中斷返回指令強(qiáng)制執(zhí)行該任務(wù)代碼。見9.04.01節(jié),高優(yōu)先級(jí)就緒任務(wù)啟動(dòng)函數(shù) OSStartHighRdy()。那一節(jié)詳細(xì)介紹對(duì)于 80x86微處理器是怎么做的。注意,OSStartHighRdy()將永遠(yuǎn)不返回到 OSStart()。
程序清單 L3.25 啟動(dòng)多任務(wù).
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)
}
}
多任務(wù)啟動(dòng)以后變量與數(shù)據(jù)結(jié)構(gòu)中的內(nèi)容如圖 F3.9 所示。這里筆者假設(shè)用戶建立的任務(wù)優(yōu)先級(jí)為 6,注意,OSTaskCtr指出已經(jīng)建立了 3 個(gè)任務(wù)。OSRunning已設(shè)為“真” ,指出多任務(wù)已經(jīng)開始, OSPrioCur和 OSPrioHighRdy存放的是用戶應(yīng)用任務(wù)的優(yōu)先級(jí), OSTCBCur和 OSTCBHighRdy二者都指向用戶任務(wù)的任務(wù)控制塊。
3.13 獲取當(dāng)前μC/OS-Ⅱ的版本號(hào)
應(yīng)用程序調(diào)用OSVersion()[程序清單L3.26]可以得到當(dāng)前μC/OS-Ⅱ的版本號(hào)。
OSVersion()函數(shù)返回版本號(hào)值乘以100。換言之,200表示版本號(hào)2.00。
程序清單L3.26得到μC/OS-Ⅱ當(dāng)前版本號(hào)
INT16UOSVersion(void)
{
return(OS_VERSION);
}
為找到μC/OS-Ⅱ的最新版本以及如何做版本升級(jí),用戶可以與出版商聯(lián)系,或者查看
μC/OS-Ⅱ得正式網(wǎng)站W(wǎng)WW.uCOS-II.COM

圖3.9調(diào)用OSStart()以后的變量與數(shù)據(jù)結(jié)構(gòu)
3.14 OSEvent()函數(shù)
讀者或許注意到有4個(gè)OS_CORE.C中的函數(shù)沒有在本章中提到。這4個(gè)函數(shù)是
OSEventWaitListInit(),OSEventTaskRdy(),OSEventTaskWait(),OSEventTO()。這幾個(gè)
函數(shù)是放在文件OS_CORE.C中的,而對(duì)如何使用這個(gè)函數(shù)的解釋見第6章,任務(wù)間的通訊與
同步。
評(píng)論