![uCOS嵌入式開發(fā)教學(xué)教程_第1頁(yè)](http://file4.renrendoc.com/view8/M03/21/13/wKhkGWbwk1mAF4GWAAD0_STyyqY244.jpg)
![uCOS嵌入式開發(fā)教學(xué)教程_第2頁(yè)](http://file4.renrendoc.com/view8/M03/21/13/wKhkGWbwk1mAF4GWAAD0_STyyqY2442.jpg)
![uCOS嵌入式開發(fā)教學(xué)教程_第3頁(yè)](http://file4.renrendoc.com/view8/M03/21/13/wKhkGWbwk1mAF4GWAAD0_STyyqY2443.jpg)
![uCOS嵌入式開發(fā)教學(xué)教程_第4頁(yè)](http://file4.renrendoc.com/view8/M03/21/13/wKhkGWbwk1mAF4GWAAD0_STyyqY2444.jpg)
![uCOS嵌入式開發(fā)教學(xué)教程_第5頁(yè)](http://file4.renrendoc.com/view8/M03/21/13/wKhkGWbwk1mAF4GWAAD0_STyyqY2445.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
WhatisuC/OS?u:MicroC:controluC/OS:適合于小的、控制器的操作系統(tǒng)小巧公開源代碼,詳細(xì)的注解可剝奪實(shí)時(shí)內(nèi)核可移植性強(qiáng)多任務(wù)
確定性TheStoryofuC/OS
美國(guó)人JeanLabrosse1992年編寫的商業(yè)軟件的昂貴應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音響設(shè)備、發(fā)動(dòng)機(jī)控制、高速公路電話系統(tǒng)、自動(dò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典型的一個(gè)無(wú)限循環(huán)。voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}支持64個(gè)任務(wù),每個(gè)任務(wù)一個(gè)特定的優(yōu)先級(jí)。優(yōu)先級(jí)越高,數(shù)字越小系統(tǒng)占用了兩個(gè)任務(wù),空閑任務(wù)和統(tǒng)計(jì)任務(wù)。任務(wù)的數(shù)據(jù)結(jié)構(gòu)—任務(wù)控制塊任務(wù)控制塊OS_tcb,包括任務(wù)堆棧指針,狀態(tài),優(yōu)先級(jí),任務(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)行,就緒,等待,掛起…可以有多個(gè)準(zhǔn)備就緒的任務(wù),但一個(gè)時(shí)刻只有一個(gè)任務(wù)可以運(yùn)行,OSHighRdy掛起隊(duì)列郵箱信號(hào)量低四位OSTCBStat任務(wù)的調(diào)度--OSScheduC/OS是占先式實(shí)時(shí)多任務(wù)內(nèi)核,優(yōu)先級(jí)最高的任務(wù)一旦準(zhǔn)備就緒,則擁有CPU的所有權(quán)開始投入運(yùn)行。uC/OS中不支持時(shí)間片輪轉(zhuǎn)法,每個(gè)任務(wù)的優(yōu)先級(jí)要求不一樣且是唯一的,所以任務(wù)調(diào)度的工作就是:查找準(zhǔn)備就緒的最高優(yōu)先級(jí)的任務(wù)并進(jìn)行上下文切換。任務(wù)的調(diào)度就緒任務(wù)表:用于存貯每個(gè)任務(wù)的就緒狀態(tài)標(biāo)志。由兩個(gè)變量組成:OSRedyGrp:8位,每位表示一組(8個(gè))任務(wù)中是否有就緒的任務(wù)。OSRdyTbl[]:位圖方式表示某個(gè)任務(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)先級(jí)找到任務(wù)在就緒任務(wù)表中的位置根據(jù)優(yōu)先級(jí)確定就緒表假設(shè)優(yōu)先級(jí)為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)先級(jí)為21的任務(wù)就緒21=10101b,則OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相應(yīng)的數(shù)學(xué)表達(dá)式為:
OSRdyGrp|=0x04;
OSRdyTbl[2]|=0x20;根據(jù)優(yōu)先級(jí)確定就緒表從上面的計(jì)算我們可以得到:若第n位置1,則應(yīng)該與2n相或。uC/OS中,把2n的n=0-7的8個(gè)值
先計(jì)算好存在數(shù)組OSMapTbl[7]中,也就是:OSMapTbl[0]=20=0x1;OSMapTbl[1]=21=0x2;
……
OSMapTbl[7]=27=0x80;根據(jù)優(yōu)先級(jí)確定就緒表利用OSMapTbl,通過(guò)任務(wù)的識(shí)別號(hào)-優(yōu)先級(jí)prio來(lái)設(shè)置任務(wù)在就緒組和就緒表數(shù)組中相應(yīng)位置的數(shù)學(xué)式為:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];假設(shè)優(yōu)先級(jí)為12,1100bOSRdyGrp|=0x02;OSRdyTbl[1]|=0x10;根據(jù)就緒表確定最高優(yōu)先級(jí)(1)兩個(gè)關(guān)鍵:優(yōu)先級(jí)數(shù)分解為高三位和低三位分別確定;高優(yōu)先級(jí)有著小的優(yōu)先級(jí)號(hào);根據(jù)就緒表確定最高優(yōu)先級(jí)(2)通過(guò)OSRdyGrp值確定高3位,假設(shè)為0x24=100100b,---〉OSRdyTbl[2]和OSRdyTbl[5],高優(yōu)先級(jí)為2通過(guò)OSRdyTbl[2]的值來(lái)確定低3位,假設(shè)為0x12=010010b,---〉第2個(gè)和第5個(gè)任務(wù),取高優(yōu)先級(jí)第2個(gè)----〉17源代碼中使用了查表法查表法具有確定的時(shí)間,增加了系統(tǒng)的可預(yù)測(cè)性,uC/OS中所有的系統(tǒng)調(diào)用時(shí)間都是確定的High3=OSUnMapTbl[OSRdyGrp];Low3=OSUnMapTbl[OSRdyTbl[High3]];Prio=(Hign3<<3)+Low3;?為什么頻繁的使用查表法?請(qǐng)問(wèn)OSUnMapTbl的來(lái)歷;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來(lái)對(duì)臨界資源進(jìn)行保護(hù)OSSchedLock()禁止調(diào)度保護(hù)任務(wù)級(jí)的共享資源。提供了經(jīng)典操作系統(tǒng)任務(wù)間通信方法:信號(hào)量、郵箱、消息隊(duì)列,事件標(biāo)志。
事件控制塊ECB
所有的通信信號(hào)都被看成是事件(event),一個(gè)稱為事件控制塊(ECB,EventControlBlock)的數(shù)據(jù)結(jié)構(gòu)來(lái)表征每一個(gè)具體事件,ECB的結(jié)構(gòu)如下:程序4.5ECB的結(jié)構(gòu)如下
---------------------------------------------------------------------typedefstruct{void*OSEventPtr;/*指向消息或消息隊(duì)列的指針*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任務(wù)列表*/INT16UOSEventCnt;/*計(jì)數(shù)器(當(dāng)事件是信號(hào)量時(shí))*/INT8UOSEventType;/*事件類型:信號(hào)量、郵箱等*/INT8UOSEventGrp;/*等待任務(wù)組*/}OS_EVENT;
與TCB類似的結(jié)構(gòu),使用兩個(gè)鏈表,空閑鏈表與使用鏈表信號(hào)量semaphoreuC/OS中信號(hào)量由兩部分組成:信號(hào)量的計(jì)數(shù)值和等待該信號(hào)任務(wù)的等待任務(wù)表。信號(hào)量的計(jì)數(shù)值可以為二進(jìn)制,也可以是其他整數(shù)。系統(tǒng)通過(guò)OSSemPend()和OSSemPost()來(lái)支持信號(hào)量的兩種原子操作P()和V()。P()操作減少信號(hào)量的值,如果新的信號(hào)量的值不大于0,則操作阻塞;V()操作增加信號(hào)量的值。
中斷與時(shí)鐘節(jié)拍我們知道:當(dāng)發(fā)生中斷時(shí),首先應(yīng)保護(hù)現(xiàn)場(chǎng),將CPU寄存器入棧,再處理中斷函數(shù),然后恢復(fù)現(xiàn)場(chǎng),將CPU寄存器出棧,最后執(zhí)行中斷返回iret(x86)指令實(shí)現(xiàn)中斷返回。
uC/OS中提供了OSIntEnter()和OSIntExit()告訴內(nèi)核進(jìn)入了中斷狀態(tài)。OSIntNesting
時(shí)鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先32位的整數(shù)OSTime加一。對(duì)任務(wù)列表進(jìn)行掃描,判斷是否有延時(shí)任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),最后進(jìn)行上下文切換。多任務(wù)的啟動(dòng)首先創(chuàng)建任務(wù)最后調(diào)用OSStart開始多任務(wù)調(diào)度voidmain(){OSInit();…..OSTaskcreat()…..OSStart();}任務(wù)的格式每個(gè)任務(wù)不能占用全部CPU的資源需要有等待,或延時(shí)等系統(tǒng)調(diào)用典型的一個(gè)無(wú)限循環(huán)。voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}揭開神秘的面紗—任務(wù)調(diào)度全程追蹤Forexample1創(chuàng)建2個(gè)任務(wù),每個(gè)任務(wù)僅僅是進(jìn)行延時(shí),延時(shí)不同的時(shí)間片,不同優(yōu)先級(jí)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){判斷是否沒(méi)有啟動(dòng)內(nèi)核
y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];OSPrioHighRdy=(INT8U)((y<<3)+x);找到優(yōu)先級(jí)最高的準(zhǔn)備就緒任務(wù)
OSPrioCur=OSPrioHighRdy;當(dāng)前運(yùn)行任務(wù)優(yōu)先級(jí)
OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];根據(jù)任務(wù)優(yōu)先級(jí)找到任務(wù)
OSTCBCur=OSTCBHighRdy;OSStartHighRdy();讓優(yōu)先級(jí)最高的任務(wù)運(yùn)行起來(lái)}}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í)數(shù)
OS_EXIT_CRITICAL();退出臨界段代碼
OSSched();調(diào)度下一個(gè)任務(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)先級(jí)的任務(wù)
if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];
設(shè)置運(yùn)行任務(wù)為最高優(yōu)先級(jí)任務(wù)
OSCtxSwCtr++;OS_TASK_SW();執(zhí)行上下文切換
}}OS_EXIT_CRITICAL();}OS_TASK_SW任務(wù)的上下文切換通過(guò)sc系統(tǒng)調(diào)用指令完成保護(hù)當(dāng)前任務(wù)的現(xiàn)場(chǎng)恢復(fù)新任務(wù)的現(xiàn)場(chǎng)執(zhí)行中斷返回指令開始執(zhí)行新的任務(wù)什么也不做的空閑任務(wù)只是為了消耗CPU的時(shí)間片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){是否延時(shí)
if(--ptcb->OSTCBDly==0){延時(shí)減一,看是否延時(shí)結(jié)束
if(!(ptcb->OSTCBStat&OS_STAT_SUSPEND)){OSRdyGrp|=ptcb->OSTCBBitY;是的話將其列入準(zhǔn)備就緒表
OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;}else{ptcb->OSTCBDly=1;}}}ptcb=ptcb->OSTCBNext;指針指向下一個(gè)TCB結(jié)構(gòu)
}OSTime++;變量加一,記錄系統(tǒng)啟動(dòng)以來(lái)的時(shí)鐘滴答數(shù)
}OSTimeTick(void)
令指針指向第一個(gè)任務(wù)是否是空閑任務(wù)?任務(wù)是否存在延時(shí)?
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年新教材高中英語(yǔ)課時(shí)分層作業(yè)11含解析新人教版必修1
- 護(hù)理學(xué)個(gè)人工作總結(jié)
- 初一歷史老師工作總結(jié)
- 籃球賽活動(dòng)總結(jié)
- 大學(xué)生創(chuàng)業(yè)計(jì)劃
- 公司高管勞動(dòng)合同范本
- 北京課改版歷史七年級(jí)下冊(cè)第17課《統(tǒng)一多民族國(guó)家的鞏固和發(fā)展》聽(tīng)課評(píng)課記錄
- 職工崗位聘任協(xié)議書范本
- 云服務(wù)器租賃合同范本
- 八年級(jí)上冊(cè)歷史人教版同步聽(tīng)課評(píng)課記錄第24課《人民解放戰(zhàn)爭(zhēng)的勝利》
- 2024山東能源集團(tuán)中級(jí)人才庫(kù)選拔(高頻重點(diǎn)提升專題訓(xùn)練)共500題附帶答案詳解
- 鋼鐵是怎樣煉成的讀后感作文700字
- 武漢市江夏區(qū)2022-2023學(xué)年七年級(jí)上學(xué)期期末數(shù)學(xué)試卷【帶答案】-109
- 學(xué)校物業(yè)服務(wù)合同范本專業(yè)版
- GB/T 43921-2024無(wú)損檢測(cè)超聲檢測(cè)全矩陣采集/全聚焦技術(shù)(FMC/TFM)
- SL 288-2014 水利工程施工監(jiān)理規(guī)范
- 部編版八年級(jí)語(yǔ)文上冊(cè)期末考試卷
- 部編版人教版語(yǔ)文八年級(jí)下冊(cè)全冊(cè)課件
- 2024年02月中央軍委后勤保障部2024年公開招考專業(yè)技能崗位文職人員筆試參考題庫(kù)附帶答案詳解
- (2024年)肺栓塞的護(hù)理課件
- 小學(xué)數(shù)學(xué)三年級(jí)下冊(cè)第八單元《數(shù)學(xué)廣角-搭配(二)》大單元集體備課整體設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論