uCOS嵌入式開發(fā)教學(xué)教程_第1頁
uCOS嵌入式開發(fā)教學(xué)教程_第2頁
uCOS嵌入式開發(fā)教學(xué)教程_第3頁
uCOS嵌入式開發(fā)教學(xué)教程_第4頁
uCOS嵌入式開發(fā)教學(xué)教程_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論