




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C/OS-內(nèi)核結(jié)構(gòu)劉立本章給出C/OS-的主要結(jié)構(gòu)概貌l C/OS-是怎樣處理臨界段代碼的;l 什么是任務(wù),怎樣把用戶的任務(wù)交給C/OS-;l 任務(wù)是怎樣調(diào)度的;l 應(yīng)用程序CPU的利用率是多少,C/OS-是怎樣知道的;l 怎樣寫中斷服務(wù)子程序;l 什么是時(shí)鐘節(jié)拍,C/OS-是怎樣處理時(shí)鐘節(jié)拍的;l C/OS-是怎樣初始化的,以及怎樣啟動(dòng)多任務(wù); 臨界段(Critical Sections)和其它內(nèi)核一樣,C/OS-為了處理臨界段代碼需要關(guān)中斷,處理完畢后再開中斷。這使得C/OS-能夠避免同時(shí)有其它任務(wù)或中斷服務(wù)進(jìn)入臨界段代碼。關(guān)中斷的時(shí)間是實(shí)時(shí)內(nèi)核開發(fā)商應(yīng)提供的最重要的指標(biāo)之一,因?yàn)檫@個(gè)指標(biāo)
2、影響用戶系統(tǒng)對(duì)實(shí)時(shí)事件的響應(yīng)性。C/OS-努力使關(guān)中斷時(shí)間降至最短,但就使用C/OS-而言,關(guān)中斷的時(shí)間很大程度上取決于微處理器的架構(gòu)以及編譯器所生成的代碼質(zhì)量。微處理器一般都有關(guān)中斷/開中斷指令,用戶使用的C語言編譯器必須有某種機(jī)制能夠在C中直接實(shí)現(xiàn)關(guān)中斷/開中斷地操作。某些C編譯器允許在用戶的C源代碼中插入?yún)R編語言的語句。這使得插入微處理器指令來關(guān)中斷/開中斷很容易實(shí)現(xiàn)。而有的編譯器把從C語言中關(guān)中斷/開中斷放在語言的擴(kuò)展部分。C/OS-定義兩個(gè)宏(macros)來關(guān)中斷和開中斷,以便避開不同C編譯器廠商選擇不同的方法來處理關(guān)中斷和開中斷。C/OS-中的這兩個(gè)宏調(diào)用分別是:OS_ENTER
3、_CRITICAL()和OS_EXIT_CRITICAL()。因?yàn)檫@兩個(gè)宏的定義取決于所用的微處理器,故在文件OS_CPU.H中可以找到相應(yīng)宏定義。每種微處理器都有自己的OS_CPU.H文件。 任務(wù) 一個(gè)任務(wù)通常是一個(gè)無限的循環(huán),如程序清單所示。一個(gè)任務(wù)看起來像其它C的函數(shù)一樣,有函數(shù)返回類型,有形式參數(shù)變量,但是任務(wù)是絕不會(huì)返回的。故返回參數(shù)必須定義成void。 void YourTask (void *pdata) (1) for (;) (2) /* 用戶代碼 */ 調(diào)用uC/OS-II的某種系統(tǒng)服務(wù): OSMboxPend(); OSQPend(); OSSemPend(); OSTa
4、skDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用戶代碼 */ 任務(wù)狀態(tài) 睡眠態(tài)(DORMANT)指任務(wù)駐留在程序空間之中,還沒有交給C/OS-管理,把任務(wù)交給C/OS-是通過調(diào)用下述兩個(gè)函數(shù)之一:OSTaskCreate()或OSTaskCreateExt()。當(dāng)任務(wù)一旦建立,這個(gè)任務(wù)就進(jìn)入就緒態(tài)準(zhǔn)備運(yùn)行。任務(wù)的建立可以是在多任務(wù)運(yùn)行開始之前,也可以是動(dòng)態(tài)地被一個(gè)運(yùn)行著的任務(wù)建立。如果一個(gè)任務(wù)是被另一個(gè)任務(wù)建立的,而這個(gè)任務(wù)的優(yōu)先級(jí)高于建立它的那個(gè)任務(wù),則這個(gè)剛剛建立的任務(wù)將
5、立即得到CPU的控制權(quán)。一個(gè)任務(wù)可以通過調(diào)用OSTaskDel()返回到睡眠態(tài),或通過調(diào)用該函數(shù)讓另一個(gè)任務(wù)進(jìn)入睡眠態(tài)。調(diào)用OSStart()可以啟動(dòng)多任務(wù)。OSStart()函數(shù)運(yùn)行進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)。就緒的任務(wù)只有當(dāng)所有優(yōu)先級(jí)高于這個(gè)任務(wù)的任務(wù)轉(zhuǎn)為等待狀態(tài),或者是被刪除了,才能進(jìn)入運(yùn)行態(tài)。正在運(yùn)行的任務(wù)可以通過調(diào)用兩個(gè)函數(shù)之一將自身延遲一段時(shí)間,這兩個(gè)函數(shù)是OSTimeDly()或OSTimeDlyHMSM()。這個(gè)任務(wù)于是進(jìn)入等待狀態(tài),等待這段時(shí)間過去,下一個(gè)優(yōu)先級(jí)最高的、并進(jìn)入了就緒態(tài)的任務(wù)立刻被賦予了CPU的控制權(quán)。等待的時(shí)間過去以后,系統(tǒng)服務(wù)函數(shù)OSTimeTick()使
6、延遲了的任務(wù)進(jìn)入就緒態(tài)任務(wù)控制塊 一旦任務(wù)建立了,任務(wù)控制塊OS_TCBs將被賦值。任務(wù)控制塊是一個(gè)數(shù)據(jù)結(jié)構(gòu),當(dāng)任務(wù)的CPU使用權(quán)被剝奪時(shí),C/OS-用它來保存該任務(wù)的狀態(tài)。當(dāng)任務(wù)重新得到CPU使用權(quán)時(shí),任務(wù)控制塊能確保任務(wù)從當(dāng)時(shí)被中斷的那一點(diǎn)絲毫不差地繼續(xù)執(zhí)行。OS_TCBs全部駐留在RAM中。任務(wù)建立的時(shí)候,OS_TCBs就被初始化了 所有的任務(wù)控制塊分為兩條鏈表,空閑鏈表和使用鏈表。任務(wù)控制塊結(jié)構(gòu)Struct os_tcb OS_STK *OSTCBStkPtr; struct os_tcb *OSTCBNext; struct os_tcb *OSTCBprev; OS_EVENT *
7、OSTCBEventPtr; void *OSTCBMsg; INT16U OSTCBDly;當(dāng)需要把任務(wù)延時(shí)若干時(shí)鐘節(jié)拍時(shí)要用到這個(gè)變量 INT8U OSTCBStat; INT8U OSTCBPrio;任務(wù)優(yōu)先級(jí)。 INT8U OSTCBX, OSTCBY, OSTCBBitX, OSTCBBitY; OS_TCB加速任務(wù)進(jìn)入就緒態(tài)的過程事件控制塊的指針任務(wù)的狀態(tài)字空任務(wù)列表系統(tǒng)初始化時(shí),所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表為確定下次該哪個(gè)優(yōu)先級(jí)的任務(wù)運(yùn)行了,內(nèi)核調(diào)度器總是將OS_LOWEST_PR1O在就緒表中相應(yīng)字節(jié)的相應(yīng)位置1。是按以下規(guī)則給出的:當(dāng)OSRdyTbl0中的任何
8、一位是1時(shí),OSRdyGrp的第0位置1, 當(dāng)OSRdyTbl1中的任何一位是1時(shí),OSRdyGrp的第1位置1,當(dāng)OSRdyTbl2中的任何一位是1時(shí),OSRdyGrp的第2位置1,當(dāng)OSRdyTbl3中的任何一位是1時(shí),OSRdyGrp的第3位置1,當(dāng)OSRdyTbl4中的任何一位是1時(shí),OSRdyGrp的第4位置1, 當(dāng)OSRdyTbl5中的任何一位是1時(shí),OSRdyGrp的第5位置1,當(dāng)OSRdyTbl6中的任何一位是1時(shí),OSRdyGrp的第6位置1, 當(dāng)OSRdyTbl7中的任何一位是1時(shí),OSRdyGrp的第7位置1 就緒表 每個(gè)任務(wù)被賦予不同的優(yōu)先級(jí)等級(jí),從0級(jí)到最低優(yōu)先級(jí)OS
9、_LOWEST_PR1O,包括0和OS_LOWEST_PR1O在內(nèi)(見文件OS_CFG.H)。當(dāng)C/OS-初始化的時(shí)候,最低優(yōu)先級(jí)OS_LOWEST_PR1O總是被賦給空閑任務(wù)idle task。注意,最多任務(wù)數(shù)目OS_MAX_TASKS和最低優(yōu)先級(jí)數(shù)是沒有關(guān)系的。用戶應(yīng)用程序可以只有10個(gè)任務(wù),而仍然可以有32個(gè)優(yōu)先級(jí)的級(jí)別(如果用戶將最低優(yōu)先級(jí)數(shù)設(shè)為31的話)。每個(gè)任務(wù)的就緒態(tài)標(biāo)志都放入就緒表中的,就緒表中有兩個(gè)變量OSRedyGrp和OSRdyTbl。在OSRdyGrp中,任務(wù)按優(yōu)先級(jí)分組,8個(gè)任務(wù)為一組。OSRdyGrp中的每一位表示8組任務(wù)中每一組中是否有進(jìn)入就緒態(tài)的任務(wù)。任務(wù)進(jìn)入就
10、緒態(tài)時(shí),就緒表OSRdyTbl中的相應(yīng)元素的相應(yīng)位也置位。就緒表OSRdyTbl數(shù)組的大小取決于OS_LOWEST_PR1O(見文件OS_CFG.H)。當(dāng)用戶的應(yīng)用程序中任務(wù)數(shù)目比較少時(shí),減少OS_LOWEST_PR1O的值可以降低C/OS-對(duì)RAM(數(shù)據(jù)空間)的需求量。 根據(jù)優(yōu)先級(jí)找到任務(wù)在就緒任務(wù)表中的位置每個(gè)任務(wù)的就緒狀態(tài)標(biāo)志都放入就緒表中(ready list)中,就緒表有兩個(gè)變量:OSRdyGrp、OSRdyTbl根據(jù)優(yōu)先級(jí)確定就緒表從上面的計(jì)算我們可以得到:若第n位置1,則應(yīng)該與2n 相或。uC/OS中,把2n的n=0-7的8個(gè)值 先計(jì)算好存在數(shù)組OSMapTbl7中,也就是:OS
11、MapTbl0 =20=0 x1;OSMapTbl1 =21=0 x2; OSMapTbl7 =27=0 x80;根據(jù)優(yōu)先級(jí)確定就緒表利用OSMapTbl,通過任務(wù)的識(shí)別號(hào)-優(yōu)先級(jí)prio來設(shè)置任務(wù)在就緒組和就緒表數(shù)組中相應(yīng)位置的數(shù)學(xué)式為:OSRdyGrp |=OSMapTblprio3;OSRdyTblprio3 |=OSMapTblprio & 0 x07;假設(shè)優(yōu)先級(jí)為12,1 100bOSRdyGrp |=0 x02;OSRdyTbl1 |=0 x10;根據(jù)就緒表確定最高優(yōu)先級(jí)通過OSRdyGrp值確定高3位,假設(shè)為0 x24=100 100b, - OSRdyTbl2 和OSRdyTb
12、l5,高優(yōu)先級(jí)為2通過OSRdyTbl2的值來確定低3位, 假設(shè)為0 x12=010 010b ,-第2個(gè)和第5個(gè)任務(wù),取高優(yōu)先級(jí)第2個(gè)-17源代碼中使用了查表法查表法具有確定的時(shí)間,增加了系統(tǒng)的可預(yù)測(cè)性,uC/OS中所有的系統(tǒng)調(diào)用時(shí)間都是確定的High3 =OSUnMapTblOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Prio =(Hign33)+Low3;?為什么頻繁的使用查表法?請(qǐng)問OSUnMapTbl的來歷;INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
13、 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 該處缺10排數(shù)據(jù),請(qǐng)補(bǔ)充(下次課不上,為查資料時(shí)間,解決本道題目);INT8U const OSUnMapTbl =
14、0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0,
15、2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0,
16、3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0;C/OS-總是運(yùn)行進(jìn)入就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的那一個(gè)。確定哪個(gè)任務(wù)優(yōu)先級(jí)最高,下面該哪個(gè)任務(wù)運(yùn)行了的工作是由調(diào)度器(Scheduler)完成的。任務(wù)級(jí)的調(diào)度是由函數(shù)OSSched()完成的。中斷級(jí)的調(diào)度是由另一個(gè)函數(shù)OSIntExt()完成的,這個(gè)函數(shù)將在以后描述。
17、OSSched()的代碼如程序清單。 void OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0) (1) y = OSUnMapTblOSRdyGrp;(2) OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly);(2) if (OSPrioHighRdy != OSPrioCur) (3) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;(4) OSTCBHighRdy必須指向優(yōu)先級(jí)最高的那個(gè)
18、任務(wù)控制塊OS_TCB ,通過將以O(shè)SPrioHighRdy為下標(biāo)的OSTCBPrioTbl數(shù)組中的那個(gè)元素賦給OSTCBHighRdy來實(shí)現(xiàn)的 OSCtxSwCtr+; (5) OS_TASK_SW();完成實(shí)際上的任務(wù)切換 (6) OS_EXIT_CRITICAL();空閑任務(wù) C/OS-總是建立一個(gè)空閑任務(wù),這個(gè)任務(wù)在沒有其它任務(wù)進(jìn)入就緒態(tài)時(shí)投入運(yùn)行。這個(gè)空閑任務(wù)OSTaskIdle()永遠(yuǎn)設(shè)為最低優(yōu)先級(jí),即OS_LOWEST_PRI0??臻e任務(wù)OSTaskIdle()什么也不做,只是在不停地給一個(gè)32位的名叫OSIdleCtr的計(jì)數(shù)器加1,統(tǒng)計(jì)任務(wù)使用這個(gè)計(jì)數(shù)器以確定現(xiàn)行應(yīng)用軟件實(shí)際消
19、耗的CPU時(shí)間。程序清單是空閑任務(wù)的代碼。在計(jì)數(shù)器加1前后,中斷是先關(guān)掉再開啟的,因?yàn)?位以及大多數(shù)16位微處理器的32位加1需要多條指令,要防止高優(yōu)先級(jí)的任務(wù)或中斷服務(wù)子程序從中打入。空閑任務(wù)不可能被應(yīng)用軟件刪除。void OSTaskIdle (void *pdata) pdata = pdata; for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_CRITICAL(); 程序清單 通知C/OS-,中斷服務(wù)子程序開始了.void OSIntEnter (void) OS_ENTER_CRITICAL(); OSIntNesting+; OS_
20、EXIT_CRITICAL();時(shí)鐘節(jié)拍 時(shí)鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先32位的整數(shù)OSTime加一。對(duì)任務(wù)列表進(jìn)行掃描,判斷是否有延時(shí)任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),最后進(jìn)行上下文切換。任務(wù)的格式每個(gè)任務(wù)不能占用全部CPU的資源需要有等待,或延時(shí)等系統(tǒng)調(diào)用典型的一個(gè)無限循環(huán)。void mytask(void *pdata) for (;) do something;waiting;do something; 任務(wù)調(diào)度For example1 創(chuàng)建2個(gè)任務(wù),每個(gè)任務(wù)僅僅是進(jìn)行延時(shí),延時(shí)不同的時(shí)間片,不同優(yōu)先級(jí)void Task1(void) void Task2(void) while(1) while(1) blinkled1(); blinkled2();Task1Data+; Task2Data+; OSTimeDly(25); OSTimeDly(50); void main() sysinit(); OSInit (); OSTaskCreate ( Task1, (void *)&Task1Data, (void *)&Task1StkTASK_STK_SIZE,Task1prio); OSTaskCreate (Task2, (void *)&Task2Data, (void *)&Task2StkTASK_STK_SIZE,Task2prio)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 出租充氣皮艇合同范本
- 幾人共同購房合同范本
- 電纜外貿(mào)合同范本
- 包裝合同范本8篇
- 公司合同范本梳理審核
- 倉庫流轉(zhuǎn)合同范本
- 單位集資建房轉(zhuǎn)讓合同范本
- 勞防用品采購合同范本
- 出售立軸制砂機(jī)合同范本
- 出售玻璃蓋板合同范本
- ZJ50鉆機(jī)用戶手冊(cè)
- 大雁山隧道出口水泥罐纜風(fēng)繩安裝方案
- CREO基礎(chǔ)培訓(xùn)教程
- 2023年自然資源部所屬事業(yè)單位招聘(208人)筆試參考題庫(共500題)答案詳解版
- 鋼結(jié)構(gòu)夾層吊裝方案
- 小學(xué)英語繪本-中國(guó)節(jié)日
- 紅頭文件模板(完整版)
- 基于STM32的智能小車研究
- 【實(shí)用資料】主動(dòng)脈夾層PPT
- 生產(chǎn)制造行業(yè)崗位薪酬等級(jí)表
- 六年級(jí)科學(xué)培優(yōu)輔差計(jì)劃
評(píng)論
0/150
提交評(píng)論