|
操作系統(tǒng)內(nèi)核運行后,進(jìn)行一次初始化操作OSInit,對操作系統(tǒng)的重要數(shù)據(jù)結(jié)構(gòu)如任務(wù)控制塊、事件控制塊、就緒表等進(jìn)行初始化,并創(chuàng)建兩個系統(tǒng)任務(wù)(統(tǒng)計任務(wù)和空閑任務(wù))。然后創(chuàng)建一個TaskStart任務(wù),該任務(wù)用于設(shè)置時鐘中斷服務(wù)程序,接著調(diào)用OSStart啟動多任務(wù),開始真正多任務(wù)的執(zhí)行。
在操作系統(tǒng)初始化OSInit執(zhí)行之后,用戶可以調(diào)用OSTaskCreate或OSTaskCreateExt來創(chuàng)建用戶任務(wù)。因為這兩個函數(shù)是內(nèi)核用于創(chuàng)建任務(wù)的,不允許用戶進(jìn)行修改,因此被稱為系統(tǒng)服務(wù)。用戶任務(wù)的程序以函數(shù)的形式由用戶編寫,稱為用戶函數(shù),和操作系統(tǒng)的服務(wù)劃分了界限。很明顯,必須將用戶函數(shù)的地址傳遞給創(chuàng)建任務(wù)的系統(tǒng)服務(wù)。在用戶任務(wù)中,同樣可以調(diào)用OSTaskCreate或OSTaskCreateExt創(chuàng)建其他的任務(wù),也可以調(diào)用OSTaskDel來刪除其他任務(wù)或調(diào)用請求刪除任務(wù)的函數(shù)提交刪除任務(wù)的請求,還可以調(diào)用OSTaskSuspend來暫時取消任務(wù)自己或其他任務(wù)的執(zhí)行。
因為uC/OS-II采用的是搶占式多任務(wù)調(diào)度算法,因此任務(wù)的優(yōu)先級是至關(guān)重要的,是任務(wù)的唯一標(biāo)識,因此各個任務(wù)的優(yōu)先級必須不同。任務(wù)的優(yōu)先級和任務(wù)的其他信息,如任務(wù)堆棧地址、任務(wù)狀態(tài)、任務(wù)等待事件指針、任務(wù)延遲時間等信息都保存在一個名為任務(wù)控制塊(Task Control Block, TCB)的數(shù)據(jù)結(jié)構(gòu)中。不掌握任務(wù)控制塊(TCB)就無法研究和掌握任務(wù)管理。
除了任務(wù)控制塊,uC/OS-II中還設(shè)計了就緒組和就緒表來標(biāo)志就緒的任務(wù)。就緒的任務(wù)可能不止1個,但有一個上限——不能超過63個。任務(wù)調(diào)度程序(時鐘中斷服務(wù)程序)每隔一段時間會執(zhí)行一次,具體的時間取決于用戶對時鐘中斷的設(shè)置。如果設(shè)置為20ms,則每20ms就要執(zhí)行一次任務(wù)調(diào)度。就要從就緒表和就緒組中查找優(yōu)先級最高的就緒任務(wù)了。因為是實時性很高的操作系統(tǒng),不允許查找最高優(yōu)先級就緒任務(wù)時間太長,不能因為任務(wù)多查找起來就慢,任務(wù)少查找起來就快。實際上uC/OS-II的任務(wù)調(diào)度時間在一個指定的嵌入式環(huán)境下是確定的。為了達(dá)到這一點,設(shè)計了一個巧妙的數(shù)據(jù)結(jié)構(gòu)和算法來實現(xiàn)這一過程。
為了根據(jù)優(yōu)先級這一任務(wù)的唯一標(biāo)志來找到任務(wù)的各種屬性,從而執(zhí)行不同的處理,設(shè)計了任務(wù)優(yōu)先級指針表OSTCBPrioTbl來快速找到任務(wù)的控制塊。為迅速得到當(dāng)前任務(wù)的控制塊,又定義了任務(wù)快指針OSTCBCur來指示當(dāng)前的任務(wù)塊。
|
|