久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > μC/OS-II的內核結構

μC/OS-II的內核結構

作者: 時間:2016-10-08 來源:網絡 收藏

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章,任務間的通訊與

同步。


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

關鍵詞:

評論


相關推薦

技術專區

關閉