新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > μC/OS-II的內(nèi)核結(jié)構(gòu)

μC/OS-II的內(nèi)核結(jié)構(gòu)

作者: 時間:2016-10-08 來源:網(wǎng)絡(luò) 收藏

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的。

以上兩個任務(wù)的任務(wù)控制塊(OS_TCBs)是用雙向鏈表鏈接在一起的。OSTCBList指向這個鏈表的起始處。當(dāng)建立一個任務(wù)時,這個任務(wù)總是被放在這個鏈表的起始處。換句話說,OSTCBList總是指向最后建立的那個任務(wù)。鏈的終點(diǎn)指向空字符NULL(也就是零)。

因?yàn)檫@兩個任務(wù)都處在就緒態(tài),在就緒任務(wù)表OSRdyTbl[]中的相應(yīng)位是設(shè)為1的。還有,因?yàn)檫@兩個任務(wù)的相應(yīng)位是在OSRdyTbl[]的同一行上,即屬同一組,故OSRdyGrp中只有1位是設(shè)為1的。

μC/OS-Ⅱ還初始化了4個空數(shù)據(jù)結(jié)構(gòu)緩沖區(qū),如圖F3.8所示。每個緩沖區(qū)都是單向鏈

表,允許μC/OS-Ⅱ從緩沖區(qū)中迅速得到或釋放一個緩沖區(qū)中的元素。注意,空任務(wù)控制塊

在空緩沖區(qū)中的數(shù)目取決于最多任務(wù)數(shù)OS_MAX_TASKS,這個最多任務(wù)數(shù)是在OS_CFG.H文件

中定義的。μC/OS-Ⅱ自動安排總的系統(tǒng)任務(wù)數(shù)OS_N_SYS_TASKS(見文件μC/OS-Ⅱ.H)???p>制塊OS_TCB的數(shù)目也就自動確定了。當(dāng)然,包括足夠的任務(wù)控制塊分配給統(tǒng)計(jì)任務(wù)和空閑

任務(wù)。指向空事件表OSEventFreeList和空隊(duì)列表OSFreeList的指針將在第6章,任務(wù)間

通訊與同步中討論。指向空存儲區(qū)的指針表OSMemFreeList將在第7章存儲管理中討論。

3.12 μC/OS-Ⅱ的啟動

多任務(wù)的啟動是用戶通過調(diào)用 OSStart()實(shí)現(xiàn)的。然而,啟動μC/OS-Ⅱ之前,用戶至少

要建立一個應(yīng)用任務(wù),如程序清單L3.24所示。

程序清單L3.24初始化和啟動μC/OS-Ⅱ

voidmain(void)

{

OSInit();/* 初始化uC/OS-II*/

.

.

通過調(diào)用OSTaskCreate()或OSTaskCreateExt()創(chuàng)建至少一個任務(wù);

.

.

OSStart();/* 開始多任務(wù)調(diào)度!OSStart()永遠(yuǎn)不會返回 */

}

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

圖3.8空緩沖區(qū)

OSStart()的代碼如程序清單L3.25所示。當(dāng)調(diào)用OSStart()時,OSStart()從任務(wù)就緒表中找出那個用戶建立的優(yōu)先級最高任務(wù)的任務(wù)控制塊[L3.25(1)]。然后,OSStart()調(diào)用高優(yōu)先級就緒任務(wù)啟動函數(shù) OSStartHighRdy()[L3,25(2)],(見匯編語言文件 OS_CPU_A.ASM),這個文件與選擇的微處理器有關(guān)。實(shí)質(zhì)上,函數(shù)OSStartHighRdy()是將任務(wù)棧中保存的值彈回到 CPU 寄存器中,然后執(zhí)行一條中斷返回指令,中斷返回指令強(qiáng)制執(zhí)行該任務(wù)代碼。見9.04.01節(jié),高優(yōu)先級就緒任務(wù)啟動函數(shù) OSStartHighRdy()。那一節(jié)詳細(xì)介紹對于 80x86微處理器是怎么做的。注意,OSStartHighRdy()將永遠(yuǎn)不返回到 OSStart()。

程序清單 L3.25 啟動多任務(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ù)啟動以后變量與數(shù)據(jù)結(jié)構(gòu)中的內(nèi)容如圖 F3.9 所示。這里筆者假設(shè)用戶建立的任務(wù)優(yōu)先級為 6,注意,OSTaskCtr指出已經(jīng)建立了 3 個任務(wù)。OSRunning已設(shè)為“真” ,指出多任務(wù)已經(jīng)開始, OSPrioCur和 OSPrioHighRdy存放的是用戶應(yīng)用任務(wù)的優(yōu)先級, OSTCBCur和 OSTCBHighRdy二者都指向用戶任務(wù)的任務(wù)控制塊。

3.13 獲取當(dāng)前μC/OS-Ⅱ的版本號

應(yīng)用程序調(diào)用OSVersion()[程序清單L3.26]可以得到當(dāng)前μC/OS-Ⅱ的版本號。

OSVersion()函數(shù)返回版本號值乘以100。換言之,200表示版本號2.00。

程序清單L3.26得到μC/OS-Ⅱ當(dāng)前版本號

INT16UOSVersion(void)

{

return(OS_VERSION);

}

為找到μC/OS-Ⅱ的最新版本以及如何做版本升級,用戶可以與出版商聯(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個OS_CORE.C中的函數(shù)沒有在本章中提到。這4個函數(shù)是

OSEventWaitListInit(),OSEventTaskRdy(),OSEventTaskWait(),OSEventTO()。這幾個

函數(shù)是放在文件OS_CORE.C中的,而對如何使用這個函數(shù)的解釋見第6章,任務(wù)間的通訊與

同步。


上一頁 1 2 3 4 5 6 7 8 9 下一頁

關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉