二嵌入式實時操作系統(tǒng)分析課件_第1頁
二嵌入式實時操作系統(tǒng)分析課件_第2頁
二嵌入式實時操作系統(tǒng)分析課件_第3頁
二嵌入式實時操作系統(tǒng)分析課件_第4頁
二嵌入式實時操作系統(tǒng)分析課件_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

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 什么是時鐘節(jié)拍,C/OS-是怎樣處理時鐘節(jié)拍的;l C/OS-是怎樣初始化的,以及怎樣啟動多任務(wù); 臨界段(Critical Sections)和其它內(nèi)核一樣,C/OS-為了處理臨界段代碼需要關(guān)中斷,處理完畢后再開中斷。這使得C/OS-能夠避免同時有其它任務(wù)或中斷服務(wù)進入臨界段代碼。關(guān)中斷的時間是實時內(nèi)核開發(fā)商應(yīng)提供的最重要的指標(biāo)之一,因為這個指標(biāo)

2、影響用戶系統(tǒng)對實時事件的響應(yīng)性。C/OS-努力使關(guān)中斷時間降至最短,但就使用C/OS-而言,關(guān)中斷的時間很大程度上取決于微處理器的架構(gòu)以及編譯器所生成的代碼質(zhì)量。微處理器一般都有關(guān)中斷/開中斷指令,用戶使用的C語言編譯器必須有某種機制能夠在C中直接實現(xiàn)關(guān)中斷/開中斷地操作。某些C編譯器允許在用戶的C源代碼中插入?yún)R編語言的語句。這使得插入微處理器指令來關(guān)中斷/開中斷很容易實現(xiàn)。而有的編譯器把從C語言中關(guān)中斷/開中斷放在語言的擴展部分。C/OS-定義兩個宏(macros)來關(guān)中斷和開中斷,以便避開不同C編譯器廠商選擇不同的方法來處理關(guān)中斷和開中斷。C/OS-中的這兩個宏調(diào)用分別是:OS_ENTER

3、_CRITICAL()和OS_EXIT_CRITICAL()。因為這兩個宏的定義取決于所用的微處理器,故在文件OS_CPU.H中可以找到相應(yīng)宏定義。每種微處理器都有自己的OS_CPU.H文件。 任務(wù) 一個任務(wù)通常是一個無限的循環(huán),如程序清單所示。一個任務(wù)看起來像其它C的函數(shù)一樣,有函數(shù)返回類型,有形式參數(shù)變量,但是任務(wù)是絕不會返回的。故返回參數(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)用下述兩個函數(shù)之一:OSTaskCreate()或OSTaskCreateExt()。當(dāng)任務(wù)一旦建立,這個任務(wù)就進入就緒態(tài)準(zhǔn)備運行。任務(wù)的建立可以是在多任務(wù)運行開始之前,也可以是動態(tài)地被一個運行著的任務(wù)建立。如果一個任務(wù)是被另一個任務(wù)建立的,而這個任務(wù)的優(yōu)先級高于建立它的那個任務(wù),則這個剛剛建立的任務(wù)將

5、立即得到CPU的控制權(quán)。一個任務(wù)可以通過調(diào)用OSTaskDel()返回到睡眠態(tài),或通過調(diào)用該函數(shù)讓另一個任務(wù)進入睡眠態(tài)。調(diào)用OSStart()可以啟動多任務(wù)。OSStart()函數(shù)運行進入就緒態(tài)的優(yōu)先級最高的任務(wù)。就緒的任務(wù)只有當(dāng)所有優(yōu)先級高于這個任務(wù)的任務(wù)轉(zhuǎn)為等待狀態(tài),或者是被刪除了,才能進入運行態(tài)。正在運行的任務(wù)可以通過調(diào)用兩個函數(shù)之一將自身延遲一段時間,這兩個函數(shù)是OSTimeDly()或OSTimeDlyHMSM()。這個任務(wù)于是進入等待狀態(tài),等待這段時間過去,下一個優(yōu)先級最高的、并進入了就緒態(tài)的任務(wù)立刻被賦予了CPU的控制權(quán)。等待的時間過去以后,系統(tǒng)服務(wù)函數(shù)OSTimeTick()使

6、延遲了的任務(wù)進入就緒態(tài)任務(wù)控制塊 一旦任務(wù)建立了,任務(wù)控制塊OS_TCBs將被賦值。任務(wù)控制塊是一個數(shù)據(jù)結(jié)構(gòu),當(dāng)任務(wù)的CPU使用權(quán)被剝奪時,C/OS-用它來保存該任務(wù)的狀態(tài)。當(dāng)任務(wù)重新得到CPU使用權(quán)時,任務(wù)控制塊能確保任務(wù)從當(dāng)時被中斷的那一點絲毫不差地繼續(xù)執(zhí)行。OS_TCBs全部駐留在RAM中。任務(wù)建立的時候,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ù)延時若干時鐘節(jié)拍時要用到這個變量 INT8U OSTCBStat; INT8U OSTCBPrio;任務(wù)優(yōu)先級。 INT8U OSTCBX, OSTCBY, OSTCBBitX, OSTCBBitY; OS_TCB加速任務(wù)進入就緒態(tài)的過程事件控制塊的指針任務(wù)的狀態(tài)字空任務(wù)列表系統(tǒng)初始化時,所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表為確定下次該哪個優(yōu)先級的任務(wù)運行了,內(nèi)核調(diào)度器總是將OS_LOWEST_PR1O在就緒表中相應(yīng)字節(jié)的相應(yīng)位置1。是按以下規(guī)則給出的:當(dāng)OSRdyTbl0中的任何

8、一位是1時,OSRdyGrp的第0位置1, 當(dāng)OSRdyTbl1中的任何一位是1時,OSRdyGrp的第1位置1,當(dāng)OSRdyTbl2中的任何一位是1時,OSRdyGrp的第2位置1,當(dāng)OSRdyTbl3中的任何一位是1時,OSRdyGrp的第3位置1,當(dāng)OSRdyTbl4中的任何一位是1時,OSRdyGrp的第4位置1, 當(dāng)OSRdyTbl5中的任何一位是1時,OSRdyGrp的第5位置1,當(dāng)OSRdyTbl6中的任何一位是1時,OSRdyGrp的第6位置1, 當(dāng)OSRdyTbl7中的任何一位是1時,OSRdyGrp的第7位置1 就緒表 每個任務(wù)被賦予不同的優(yōu)先級等級,從0級到最低優(yōu)先級OS

9、_LOWEST_PR1O,包括0和OS_LOWEST_PR1O在內(nèi)(見文件OS_CFG.H)。當(dāng)C/OS-初始化的時候,最低優(yōu)先級OS_LOWEST_PR1O總是被賦給空閑任務(wù)idle task。注意,最多任務(wù)數(shù)目OS_MAX_TASKS和最低優(yōu)先級數(shù)是沒有關(guān)系的。用戶應(yīng)用程序可以只有10個任務(wù),而仍然可以有32個優(yōu)先級的級別(如果用戶將最低優(yōu)先級數(shù)設(shè)為31的話)。每個任務(wù)的就緒態(tài)標(biāo)志都放入就緒表中的,就緒表中有兩個變量OSRedyGrp和OSRdyTbl。在OSRdyGrp中,任務(wù)按優(yōu)先級分組,8個任務(wù)為一組。OSRdyGrp中的每一位表示8組任務(wù)中每一組中是否有進入就緒態(tài)的任務(wù)。任務(wù)進入就

10、緒態(tài)時,就緒表OSRdyTbl中的相應(yīng)元素的相應(yīng)位也置位。就緒表OSRdyTbl數(shù)組的大小取決于OS_LOWEST_PR1O(見文件OS_CFG.H)。當(dāng)用戶的應(yīng)用程序中任務(wù)數(shù)目比較少時,減少OS_LOWEST_PR1O的值可以降低C/OS-對RAM(數(shù)據(jù)空間)的需求量。 根據(jù)優(yōu)先級找到任務(wù)在就緒任務(wù)表中的位置每個任務(wù)的就緒狀態(tài)標(biāo)志都放入就緒表中(ready list)中,就緒表有兩個變量:OSRdyGrp、OSRdyTbl根據(jù)優(yōu)先級確定就緒表從上面的計算我們可以得到:若第n位置1,則應(yīng)該與2n 相或。uC/OS中,把2n的n=0-7的8個值 先計算好存在數(shù)組OSMapTbl7中,也就是:OS

11、MapTbl0 =20=0 x1;OSMapTbl1 =21=0 x2; OSMapTbl7 =27=0 x80;根據(jù)優(yōu)先級確定就緒表利用OSMapTbl,通過任務(wù)的識別號-優(yōu)先級prio來設(shè)置任務(wù)在就緒組和就緒表數(shù)組中相應(yīng)位置的數(shù)學(xué)式為:OSRdyGrp |=OSMapTblprio3;OSRdyTblprio3 |=OSMapTblprio & 0 x07;假設(shè)優(yōu)先級為12,1 100bOSRdyGrp |=0 x02;OSRdyTbl1 |=0 x10;根據(jù)就緒表確定最高優(yōu)先級通過OSRdyGrp值確定高3位,假設(shè)為0 x24=100 100b, - OSRdyTbl2 和OSRdyTb

12、l5,高優(yōu)先級為2通過OSRdyTbl2的值來確定低3位, 假設(shè)為0 x12=010 010b ,-第2個和第5個任務(wù),取高優(yōu)先級第2個-17源代碼中使用了查表法查表法具有確定的時間,增加了系統(tǒng)的可預(yù)測性,uC/OS中所有的系統(tǒng)調(diào)用時間都是確定的High3 =OSUnMapTblOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Prio =(Hign33)+Low3;?為什么頻繁的使用查表法?請問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ù),請補充(下次課不上,為查資料時間,解決本道題目);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-總是運行進入就緒態(tài)任務(wù)中優(yōu)先級最高的那一個。確定哪個任務(wù)優(yōu)先級最高,下面該哪個任務(wù)運行了的工作是由調(diào)度器(Scheduler)完成的。任務(wù)級的調(diào)度是由函數(shù)OSSched()完成的。中斷級的調(diào)度是由另一個函數(shù)OSIntExt()完成的,這個函數(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)先級最高的那個

18、任務(wù)控制塊OS_TCB ,通過將以O(shè)SPrioHighRdy為下標(biāo)的OSTCBPrioTbl數(shù)組中的那個元素賦給OSTCBHighRdy來實現(xiàn)的 OSCtxSwCtr+; (5) OS_TASK_SW();完成實際上的任務(wù)切換 (6) OS_EXIT_CRITICAL();空閑任務(wù) C/OS-總是建立一個空閑任務(wù),這個任務(wù)在沒有其它任務(wù)進入就緒態(tài)時投入運行。這個空閑任務(wù)OSTaskIdle()永遠(yuǎn)設(shè)為最低優(yōu)先級,即OS_LOWEST_PRI0??臻e任務(wù)OSTaskIdle()什么也不做,只是在不停地給一個32位的名叫OSIdleCtr的計數(shù)器加1,統(tǒng)計任務(wù)使用這個計數(shù)器以確定現(xiàn)行應(yīng)用軟件實際消

19、耗的CPU時間。程序清單是空閑任務(wù)的代碼。在計數(shù)器加1前后,中斷是先關(guān)掉再開啟的,因為8位以及大多數(shù)16位微處理器的32位加1需要多條指令,要防止高優(yōu)先級的任務(wù)或中斷服務(wù)子程序從中打入??臻e任務(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();時鐘節(jié)拍 時鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先32位的整數(shù)OSTime加一。對任務(wù)列表進行掃描,判斷是否有延時任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),最后進行上下文切換。任務(wù)的格式每個任務(wù)不能占用全部CPU的資源需要有等待,或延時等系統(tǒng)調(diào)用典型的一個無限循環(huán)。void mytask(void *pdata) for (;) do something;waiting;do something; 任務(wù)調(diào)度For example1 創(chuàng)建2個任務(wù),每個任務(wù)僅僅是進行延時,延時不同的時間片,不同優(yōu)先級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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論