版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
WhatisuC/OS?u:MicroC:controluC/OS:適合于小的、控制器的操作系統(tǒng)小巧公開源代碼,詳細(xì)的注解可剝奪實時內(nèi)核可移植性強(qiáng)多任務(wù)
確定性TheStoryofuC/OS
美國人JeanLabrosse1992年編寫的商業(yè)軟件的昂貴應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音響設(shè)備、發(fā)動機(jī)控制、高速公路電話系統(tǒng)、自動提款機(jī)等1998年uC/OS-II,目前的版本uC/OS-IIV2.51概要內(nèi)核結(jié)構(gòu)-任務(wù)以及調(diào)度機(jī)制任務(wù)間通信uC/OS的移植在PC機(jī)上運(yùn)行uC/OS任務(wù)task典型的一個無限循環(huán)。voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}支持64個任務(wù),每個任務(wù)一個特定的優(yōu)先級。優(yōu)先級越高,數(shù)字越小系統(tǒng)占用了兩個任務(wù),空閑任務(wù)和統(tǒng)計任務(wù)。任務(wù)的數(shù)據(jù)結(jié)構(gòu)—任務(wù)控制塊任務(wù)控制塊OS_tcb,包括任務(wù)堆棧指針,狀態(tài),優(yōu)先級,任務(wù)表位置,任務(wù)鏈表指針等。所有的任務(wù)控制塊分為兩條鏈表,空閑鏈表和使用鏈表。OSTCBFreeListTCB0TCB1TCBn新任務(wù)TCB(1)空(2)(3)prenext圖4.3TCB的雙向鏈表結(jié)構(gòu)任務(wù)控制塊結(jié)構(gòu)Structos_tcb{
OS_STK*OSTCBStkPtr;structos_tcb*OSTCBNext;structos_tcb*OSTCBprev;OS_EVENT*OSTCBEventPtr;void*OSTCBMsg;INT16UOSTCBDly;INT8UOSTCBStat;INT8UOSTCBPrio;INT8UOSTCBX,OSTCBY,OSTCBBitX,OSTCBBitY;}OS_TCB任務(wù)的狀態(tài)任務(wù)的狀態(tài)
OSTCBStat運(yùn)行,就緒,等待,掛起…可以有多個準(zhǔn)備就緒的任務(wù),但一個時刻只有一個任務(wù)可以運(yùn)行,OSHighRdy掛起隊列郵箱信號量低四位OSTCBStat任務(wù)的調(diào)度--OSScheduC/OS是占先式實時多任務(wù)內(nèi)核,優(yōu)先級最高的任務(wù)一旦準(zhǔn)備就緒,則擁有CPU的所有權(quán)開始投入運(yùn)行。uC/OS中不支持時間片輪轉(zhuǎn)法,每個任務(wù)的優(yōu)先級要求不一樣且是唯一的,所以任務(wù)調(diào)度的工作就是:查找準(zhǔn)備就緒的最高優(yōu)先級的任務(wù)并進(jìn)行上下文切換。任務(wù)的調(diào)度就緒任務(wù)表:用于存貯每個任務(wù)的就緒狀態(tài)標(biāo)志。由兩個變量組成:OSRedyGrp:8位,每位表示一組(8個)任務(wù)中是否有就緒的任務(wù)。OSRdyTbl[]:位圖方式表示某個任務(wù)是否就緒。就緒狀態(tài)標(biāo)志Bit0inOSRdyGrp
is1whenanybitinOSRdyTbl[0]is1.Bit1inOSRdyGrp
is1whenanybitinOSRdyTbl[1]is1.Bit2inOSRdyGrp
is1whenanybitinOSRdyTbl[2]is1.Bit3inOSRdyGrp
is1whenanybitinOSRdyTbl[3]is1.Bit4inOSRdyGrp
is1whenanybitinOSRdyTbl[4]is1.Bit5inOSRdyGrp
is1whenanybitinOSRdyTbl[5]is1.Bit6inOSRdyGrp
is1whenanybitinOSRdyTbl[6]is1.Bit7inOSRdyGrp
is1whenanybitinOSRdyTbl[7]is1.根據(jù)優(yōu)先級找到任務(wù)在就緒任務(wù)表中的位置根據(jù)優(yōu)先級確定就緒表假設(shè)優(yōu)先級為12的任務(wù)進(jìn)入就緒狀態(tài),12=1100b,則OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相應(yīng)的數(shù)學(xué)表達(dá)式為:OSRdyGrp|=0x02;
OSRdyTbl[1]|=0x10;而優(yōu)先級為21的任務(wù)就緒21=10101b,則OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相應(yīng)的數(shù)學(xué)表達(dá)式為:
OSRdyGrp|=0x04;
OSRdyTbl[2]|=0x20;根據(jù)優(yōu)先級確定就緒表從上面的計算我們可以得到:若第n位置1,則應(yīng)該與2n相或。uC/OS中,把2n的n=0-7的8個值
先計算好存在數(shù)組OSMapTbl[7]中,也就是:OSMapTbl[0]=20=0x1;OSMapTbl[1]=21=0x2;
……
OSMapTbl[7]=27=0x80;根據(jù)優(yōu)先級確定就緒表利用OSMapTbl,通過任務(wù)的識別號-優(yōu)先級prio來設(shè)置任務(wù)在就緒組和就緒表數(shù)組中相應(yīng)位置的數(shù)學(xué)式為:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];假設(shè)優(yōu)先級為12,1100bOSRdyGrp|=0x02;OSRdyTbl[1]|=0x10;根據(jù)就緒表確定最高優(yōu)先級(1)兩個關(guān)鍵:優(yōu)先級數(shù)分解為高三位和低三位分別確定;高優(yōu)先級有著小的優(yōu)先級號;根據(jù)就緒表確定最高優(yōu)先級(2)通過OSRdyGrp值確定高3位,假設(shè)為0x24=100100b,---〉OSRdyTbl[2]和OSRdyTbl[5],高優(yōu)先級為2通過OSRdyTbl[2]的值來確定低3位,假設(shè)為0x12=010010b,---〉第2個和第5個任務(wù),取高優(yōu)先級第2個----〉17源代碼中使用了查表法查表法具有確定的時間,增加了系統(tǒng)的可預(yù)測性,uC/OS中所有的系統(tǒng)調(diào)用時間都是確定的High3=OSUnMapTbl[OSRdyGrp];Low3=OSUnMapTbl[OSRdyTbl[High3]];Prio=(Hign3<<3)+Low3;?為什么頻繁的使用查表法?請問OSUnMapTbl的來歷;INT8UconstOSUnMapTbl[]={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,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,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};任務(wù)間通信手段提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL來對臨界資源進(jìn)行保護(hù)OSSchedLock()禁止調(diào)度保護(hù)任務(wù)級的共享資源。提供了經(jīng)典操作系統(tǒng)任務(wù)間通信方法:信號量、郵箱、消息隊列,事件標(biāo)志。
事件控制塊ECB
所有的通信信號都被看成是事件(event),一個稱為事件控制塊(ECB,EventControlBlock)的數(shù)據(jù)結(jié)構(gòu)來表征每一個具體事件,ECB的結(jié)構(gòu)如下:程序4.5ECB的結(jié)構(gòu)如下
---------------------------------------------------------------------typedefstruct{void*OSEventPtr;/*指向消息或消息隊列的指針*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任務(wù)列表*/INT16UOSEventCnt;/*計數(shù)器(當(dāng)事件是信號量時)*/INT8UOSEventType;/*事件類型:信號量、郵箱等*/INT8UOSEventGrp;/*等待任務(wù)組*/}OS_EVENT;
與TCB類似的結(jié)構(gòu),使用兩個鏈表,空閑鏈表與使用鏈表信號量semaphoreuC/OS中信號量由兩部分組成:信號量的計數(shù)值和等待該信號任務(wù)的等待任務(wù)表。信號量的計數(shù)值可以為二進(jìn)制,也可以是其他整數(shù)。系統(tǒng)通過OSSemPend()和OSSemPost()來支持信號量的兩種原子操作P()和V()。P()操作減少信號量的值,如果新的信號量的值不大于0,則操作阻塞;V()操作增加信號量的值。
中斷與時鐘節(jié)拍我們知道:當(dāng)發(fā)生中斷時,首先應(yīng)保護(hù)現(xiàn)場,將CPU寄存器入棧,再處理中斷函數(shù),然后恢復(fù)現(xiàn)場,將CPU寄存器出棧,最后執(zhí)行中斷返回iret(x86)指令實現(xiàn)中斷返回。
uC/OS中提供了OSIntEnter()和OSIntExit()告訴內(nèi)核進(jìn)入了中斷狀態(tài)。OSIntNesting
時鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先32位的整數(shù)OSTime加一。對任務(wù)列表進(jìn)行掃描,判斷是否有延時任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),最后進(jìn)行上下文切換。多任務(wù)的啟動首先創(chuàng)建任務(wù)最后調(diào)用OSStart開始多任務(wù)調(diào)度voidmain(){OSInit();…..OSTaskcreat()…..OSStart();}任務(wù)的格式每個任務(wù)不能占用全部CPU的資源需要有等待,或延時等系統(tǒng)調(diào)用典型的一個無限循環(huán)。voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}揭開神秘的面紗—任務(wù)調(diào)度全程追蹤Forexample1創(chuàng)建2個任務(wù),每個任務(wù)僅僅是進(jìn)行延時,延時不同的時間片,不同優(yōu)先級voidTask1(void)voidTask2(void){{ while(1)while(1) {{ blinkled1(); blinkled2(); Task1Data++; Task2Data++;OSTimeDly(25);OSTimeDly(50);}}}}voidmain(){ sysinit(); OSInit(); OSTaskCreate(Task1,(void*)&Task1Data,(void*)&Task1Stk[TASK_STK_SIZE],Task1prio); OSTaskCreate(Task2,(void*)&Task2Data,(void*)&Task2Stk[TASK_STK_SIZE],Task2prio);ticker_start(OS_TICKS_PER_SEC); OSStart();} voidOSStart(void){INT8Uy,x;if(OSRunning==FALSE){判斷是否沒有啟動內(nèi)核
y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];OSPrioHighRdy=(INT8U)((y<<3)+x);找到優(yōu)先級最高的準(zhǔn)備就緒任務(wù)
OSPrioCur=OSPrioHighRdy;當(dāng)前運(yùn)行任務(wù)優(yōu)先級
OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];根據(jù)任務(wù)優(yōu)先級找到任務(wù)
OSTCBCur=OSTCBHighRdy;OSStartHighRdy();讓優(yōu)先級最高的任務(wù)運(yùn)行起來}}OSStartHighRdy: bl OSTaskSwHook
用戶自定義函數(shù)把OSRunning設(shè)為1 li r0,1 lis r11,OSRunning@ha stb r0,OSRunning@l(r11)獲取準(zhǔn)備運(yùn)行的任務(wù)TCB指針
lis r11,OSTCBHighRdy@ha lwz r11,OSTCBHighRdy@l(r11)設(shè)置當(dāng)前運(yùn)行任務(wù)TCB lis r12,OSTCBCur@ha stw r11,OSTCBCur@l(r12)獲取新的任務(wù)的堆棧指針
lwz r1,0(r11)恢復(fù)新任務(wù)的上下文
lwz r2,XR2(r1)....... rfivoidOSTimeDly(INT16Uticks){if(ticks>0){確保tick大于0OS_ENTER_CRITICAL();進(jìn)入臨界段代碼
if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){/*Delaycurrenttask*/OSRdyGrp&=~OSTCBCur->OSTCBBitY;設(shè)置任務(wù)為非就緒狀態(tài)
}OSTCBCur->OSTCBDly=ticks;在TCB中裝載延時數(shù)
OS_EXIT_CRITICAL();退出臨界段代碼
OSSched();調(diào)度下一個任務(wù)開始運(yùn)行
}}voidOSSched(void){INT8Uy;OS_ENTER_CRITICAL();if((OSLockNesting|OSIntNesting)==0){調(diào)度鎖,或者處于中斷狀態(tài)禁止調(diào)度
y=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);
獲取準(zhǔn)備就緒組里最高優(yōu)先級的任務(wù)
if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];
設(shè)置運(yùn)行任務(wù)為最高優(yōu)先級任務(wù)
OSCtxSwCtr++;OS_TASK_SW();執(zhí)行上下文切換
}}OS_EXIT_CRITICAL();}OS_TASK_SW任務(wù)的上下文切換通過sc系統(tǒng)調(diào)用指令完成保護(hù)當(dāng)前任務(wù)的現(xiàn)場恢復(fù)新任務(wù)的現(xiàn)場執(zhí)行中斷返回指令開始執(zhí)行新的任務(wù)什么也不做的空閑任務(wù)只是為了消耗CPU的時間片voidOSTaskIdle(){for(;;){OS_ENTER_CRITICAL();OSIdleCtr++;OS_EXIT_CRITICAL();}}voidOSTimeTick(void){OS_TCB*ptcb;ptcb=OSTCBList;---OSTCB鏈表指針while(ptcb->OSTCBPrio!=OS_IDLE_PRIO){看是不是空閑任務(wù),空閑任務(wù)是最后的任務(wù)
if(ptcb->OSTCBDly!=0){是否延時
if(--ptcb->OSTCBDly==0){延時減一,看是否延時結(jié)束
if(!(ptcb->OSTCBStat&OS_STAT_SUSPEND)){OSRdyGrp|=ptcb->OSTCBBitY;是的話將其列入準(zhǔn)備就緒表
OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;}else{ptcb->OSTCBDly=1;}}}ptcb=ptcb->OSTCBNext;指針指向下一個TCB結(jié)構(gòu)
}OSTime++;變量加一,記錄系統(tǒng)啟動以來的時鐘滴答數(shù)
}OSTimeTick(void)
令指針指向第一個任務(wù)是否是空閑任務(wù)?任務(wù)是否存在延時?
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第一章第一節(jié)區(qū)域和區(qū)域差異教案
- 《馬路上的紅綠燈》教案設(shè)計
- 《液壓與氣動》教案
- 商品房銷售客戶體驗優(yōu)化
- 交通事故調(diào)解程序
- 岱岳區(qū)園藝作業(yè)外傷防護(hù)指南
- 福建林地生態(tài)旅游開發(fā)新機(jī)遇
- 旅游景點(diǎn)供電合同細(xì)則
- 住宅裝修項目招投標(biāo)歸檔
- 區(qū)塊鏈技術(shù)法律顧問服務(wù)協(xié)議
- 道德與法治三年級上冊+階段性(期中)綜合素養(yǎng)評價(部編版)
- 1-2《光的傳播》(教學(xué)設(shè)計)蘇教版五年級科學(xué)上冊
- 2024-2030年中國新型電力系統(tǒng)行業(yè)發(fā)展展望及投資前景預(yù)測研究報告
- 2024自動導(dǎo)引車AGV技術(shù)規(guī)范
- 廣東某辦公樓改造裝飾工程施工組織設(shè)計方案
- 2024-2030年冬蟲夏草行業(yè)市場深度調(diào)研及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 《20世紀(jì)的科學(xué)偉人愛因斯坦》參考課件2
- 八年級道德與法治上冊 第一單元 走進(jìn)社會生活 單元復(fù)習(xí)課件
- 設(shè)計師會議管理制度
- 三年級上冊數(shù)學(xué)說課稿《5.筆算多位數(shù)乘一位數(shù)(連續(xù)進(jìn)位)》人教新課標(biāo)
- 行賄受賄檢討書
評論
0/150
提交評論