




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國圖片版權(quán)行業(yè)市場調(diào)查研究及發(fā)展戰(zhàn)略研究報告
- 學(xué)生退學(xué)申報表
- 2025至2030年中國鋼琴培訓(xùn)市場運行態(tài)勢及行業(yè)發(fā)展前景預(yù)測報告
- 麗水臨時倉庫租賃協(xié)議書
- 個人買房子合同協(xié)議書范本
- 二手農(nóng)用三輪出售協(xié)議書
- 農(nóng)村政府補償協(xié)議書模板
- 工廠液壓設(shè)備轉(zhuǎn)讓合同范本
- 與政府簽訂旅游合同范本
- 關(guān)于配件的采購合同范本
- 硅PU球場施工方案模板
- 職高英語詞匯表優(yōu)質(zhì)資料
- YY/T 0752-2009電動骨組織手術(shù)設(shè)備
- 用人單位職業(yè)衛(wèi)生檔案(加油站)
- GB/T 40080-2021鋼管無損檢測用于確認(rèn)無縫和焊接鋼管(埋弧焊除外)水壓密實性的自動電磁檢測方法
- GB/T 2-2001緊固件外螺紋零件的末端
- 插花藝術(shù)全部講課稿課件
- 標(biāo)準(zhǔn)DBS54 2002-2017 食品安全地方標(biāo)準(zhǔn) 糌粑制作規(guī)范
- 教育評價學(xué)全套ppt課件完整版教學(xué)教程
- 油氣藏類型、典型的相圖特征和識別實例
- 未來教育家治校方略
評論
0/150
提交評論