實時操作系統(tǒng)uCOS開發(fā)與實例_第1頁
實時操作系統(tǒng)uCOS開發(fā)與實例_第2頁
實時操作系統(tǒng)uCOS開發(fā)與實例_第3頁
實時操作系統(tǒng)uCOS開發(fā)與實例_第4頁
實時操作系統(tǒng)uCOS開發(fā)與實例_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式系統(tǒng)設(shè)計與實例開發(fā)——實時操作系統(tǒng)C/OS-Ⅱ本節(jié)提要132546C/OS-Ⅱ簡介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)通信與同步C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時間管理C/OS-Ⅱ移植RTOS是32位的嵌入式CPU的軟件基礎(chǔ)RTOS內(nèi)核提供CPU的管理硬件初時化,MMU,定時器,中斷RTOS內(nèi)核提供任務(wù),內(nèi)存管理RTOS提供設(shè)備管理,文件和網(wǎng)絡(luò)的支持RTOS提供C/C++,JAVA,圖形模塊等編程接口C/OS簡介

1、C/OS——MicroControllerOS,微控制器操作系統(tǒng)2、C/OS簡介美國人JeanLabrosse1992年完成應用面覆蓋了諸多領(lǐng)域,如照相機、醫(yī)療器械、音響設(shè)備、發(fā)動機控制、高速公路電話系統(tǒng)、自動提款機等1998年C/OS-II,目前的版本C/OS-IIV2.612000年,得到美國航空管理局(FAA)的認證,可以用于飛行器中網(wǎng)站www.ucos-II.com()公開源代碼可移植性(Portable)

絕大部分

C/OS-II的源碼是用移植性很強的ANSIC寫的。和微處理器硬件相關(guān)的那部分是用匯編語言寫的。匯編語言寫的部分已經(jīng)壓到最低限度,使得

C/OS-II便于移植到其他微處理器上。

C/OS-II可以在絕大多數(shù)8位、16位、32位以至64位微處理器、微控制器、數(shù)字信號處理器(DSP)上運行??晒袒≧OMable)

C/OS-II是為嵌入式應用而設(shè)計的,這就意味著,只要讀者有固化手段(C編譯、連接、下載和固化),

C/OS-II可以嵌入到讀者的產(chǎn)品中成為產(chǎn)品的一部分??刹眉簦⊿calable)

可以只使用

C/OS-II中應用程序需要的那些系統(tǒng)服務(wù)。也就是說某產(chǎn)品可以只使用很少幾個

C/OS-II調(diào)用,而另一個產(chǎn)品則使用了幾乎所有

C/OS-II的功能,這樣可以減少產(chǎn)品中的

C/OS-II所需的存儲器空間(RAM和ROM)。這種可剪裁性是靠條件編譯實現(xiàn)的。C/OS的性能特點(一)占先式(Preemptive)多任務(wù)

C/OS-II可以管理64個任務(wù),然而,目前這一版本保留8個給系統(tǒng)。應用程序最多可以有56個任務(wù)可確定性

全部

C/OS-II的函數(shù)調(diào)用與服務(wù)的執(zhí)行時間具有可確定性。任務(wù)棧

每個任務(wù)有自己單獨的棧,

C/OS-II允許每個任務(wù)有不同的棧空間,以便壓低應用程序?qū)AM的需求。系統(tǒng)服務(wù)

C/OS-II提供很多系統(tǒng)服務(wù),例如郵箱、消息隊列、信號量、塊大小固定的內(nèi)存的申請與釋放、時間相關(guān)函數(shù)等。中斷管理

中斷可以使正在執(zhí)行的任務(wù)暫時掛起,如果優(yōu)先級更高的任務(wù)被該中斷喚醒,則高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達255層。穩(wěn)定性與可靠性C/OS的性能特點(二)μC/OS-II圖書描述了μC/OS-II內(nèi)部的工作原理隨書的CD中包含了源代碼工業(yè)界最清晰的源代碼除英文版外,有中文和韓文版ChineseKoreanEnglishISBN1-57820-103-9美國CMPBOOKISBN7-81077-290-2北京航空航天大學出版社ISBN89-951540-5-5μC/OS-II的各種商業(yè)應用全世界有數(shù)百種產(chǎn)品在應用:AvionicsMedicalCellphonesRoutersandswitchesHigh-endaudioequipmentWashingmachinesanddryersUPS(UninterruptiblePowerSupplies)IndustrialcontrollersGPSNavigationSystemsMicrowaveRadiosInstrumentationPoint-of-saleterminals更多μC/OS-II提供的系統(tǒng)服務(wù)信號量帶互斥機制的信號量減少優(yōu)先級倒置的問題事件標志消息信箱消息隊列內(nèi)存管理時鐘管理任務(wù)管理μC/GUIandμC/FSμC/GUI嵌入式的用戶界面用ANSIC書寫支持任何8,16,32-bitsCPU彩色,灰、度,等級或黑白顯示代碼尺寸小μC/FS嵌入式的文件系統(tǒng)WritteninANSIC用ANSIC書寫支持任何8,16,32-bitsCPU支持SMC,MMC,SD,CF,IDE,Flash,RAM其他介質(zhì)本節(jié)提要132546C/OS-Ⅱ簡介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)通信與同步C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時間管理C/OS-Ⅱ移植C/OS-II的文件結(jié)構(gòu)內(nèi)核結(jié)構(gòu)任務(wù)管理時間管理任務(wù)之間通信與同步C/OS的移植C/OS-II的內(nèi)核結(jié)構(gòu)任務(wù)task典型的任務(wù)一個無限循環(huán)。voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}C/OS

–II2.5版本支持64個任務(wù),每個任務(wù)一個特定的優(yōu)先級。優(yōu)先級越高,數(shù)字越小。系統(tǒng)占用了8個任務(wù),保留優(yōu)先級為0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO-0。任務(wù)狀態(tài)任務(wù)控制塊(TCB)任務(wù)控制塊OS_TCB是一個數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)堆棧指針,狀態(tài),優(yōu)先級,任務(wù)表位置,任務(wù)鏈表指針等。所有的任務(wù)控制塊分為兩條鏈表,空閑鏈表和使用鏈表。

μC/OS-II任務(wù)控制塊.typedefstructos_tcb{OS_STK*OSTCBStkPtr;#ifOS_TASK_CREATE_EXT_EN>0void*OSTCBExtPtr;OS_STK*OSTCBStkBottom;INT32UOSTCBStkSize;INT16UOSTCBOpt;INT16UOSTCBId;#endifstructos_tcb*OSTCBNext;structos_tcb*OSTCBPrev;#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_ENOS_EVENT*OSTCBEventPtr;#endif#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_ENvoid*OSTCBMsg;#endifINT16UOSTCBDly;INT8UOSTCBStat;INT8UOSTCBPrio;INT8UOSTCBX;INT8UOSTCBY;INT8UOSTCBBitX;INT8UOSTCBBitY;#ifOS_TASK_DEL_ENBOOLEANOSTCBDelReq;#endif}OS_TCB;

任務(wù)控制塊OS_TCB中幾個成員的算法OSTCBY=priority>>3;OSTCBBitY=OSMapTbl[priority>>3];OSTCBX=priority&0x07;OSTCBBitX=OSMapTbl[priority&0x07];空任務(wù)列表所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組OSTCBTbl[]中,系統(tǒng)初始化時,所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表,任務(wù)建立后,空任務(wù)控制塊指針OSTCBFreeList指向的任務(wù)控制塊就賦給了該任務(wù),然后OSTCBFreeList的值調(diào)整為指向鏈表中的下一個空任務(wù)控制塊。任務(wù)控制塊初始化函數(shù)INT8UOS_TCBInit(INT8Uprio,OS_STK*ptos,OS_STK*pbos,INT16Uid,INT32Ustk_size,void*pext,INT16Uopt){……}任務(wù)級的任務(wù)調(diào)度--OSSchedC/OS是占先式實時多任務(wù)內(nèi)核,優(yōu)先級最高的任務(wù)一旦準備就緒,則擁有CPU的所有權(quán)開始投入運行。C/OS中不支持時間片輪轉(zhuǎn)法,每個任務(wù)的優(yōu)先級要求不一樣且是唯一的,所以任務(wù)調(diào)度的工作就是:查找準備就緒的最高優(yōu)先級的任務(wù)并進行上下文切換。C/OS任務(wù)調(diào)度所花的時間為常數(shù),與應用程序中建立的任務(wù)數(shù)無關(guān)。根據(jù)就緒表確定最高優(yōu)先級兩個關(guān)鍵:優(yōu)先級數(shù)分解為高三位和低三位分別確定;高優(yōu)先級有著小的優(yōu)先級號;根據(jù)優(yōu)先級找到任務(wù)在就緒任務(wù)表中的位置每個就緒的任務(wù)都放入就緒表中(readylist)中,就緒表有兩個變量:OSRdyGrp、OSRdyTbl[]OSRdyGrp1207654300XXXYYY任務(wù)優(yōu)先級2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY優(yōu)先級最低任務(wù)(空閑任務(wù))優(yōu)先級最高任務(wù)任務(wù)優(yōu)先級號根據(jù)優(yōu)先級確定就緒表(1)假設(shè)優(yōu)先級為12的任務(wù)進入就緒狀態(tài),12=1100b,則OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相應的數(shù)學表達式為:

OSRdyGrp|=0x02;

OSRdyTbl[1]|=0x10;而優(yōu)先級為21的任務(wù)就緒21=10101b,則OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相應的數(shù)學表達式為:

OSRdyGrp|=0x04;

OSRdyTbl[2]|=0x20;根據(jù)優(yōu)先級確定就緒表(2)從上面的計算我們可以得到:若OSRdyGrp及OSRdyBbl[]的第n位置1,則應該把OSRdyGrp及OSRdyBbl[]的值與2n相或。uC/OS中,把2n的n=0-7的8個值先計算好存在數(shù)組OSMapTbl[7]中,也就是:

OSMapTbl[0]=20=0x01(00000001)

OSMapTbl[1]=21=0x02(00000010)

……OSMapTbl[7]=27=0x80(10000000)使任務(wù)進入就緒態(tài)如果prio是任務(wù)是優(yōu)先級,也是任務(wù)的識別號,則將任務(wù)放入就緒表,即使任務(wù)進入就緒態(tài)的方法是:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];假設(shè)優(yōu)先級為12——1100bOSRdyGrp|=0x02;OSRdyTbl[1]|=0x10;使任務(wù)脫離就緒態(tài)將任務(wù)就緒表OSRdyTbl[prio>>3]相應元素的相應位清零,而且當OSRdyTbl[prio>>3]中的所有位都為零時,即全組任務(wù)中沒有一個進入就緒態(tài)時,OSRdyGrp的相應位才為零。If((OSRdyTbl[prio>>3]&=OSMapTbl[prio&0x07])==0)OSRdyGrp&=OSMapTbl[prio>>3];根據(jù)就緒表確定最高優(yōu)先級通過OSRdyGrp值確定高3位,假設(shè)為0x24=100100b,---〉對應OSRdyTbl[2]和OSRdyTbl[5],高優(yōu)先級為2通過OSRdyTbl[2]的值來確定低3位,假設(shè)為0x12=010010b,---〉第2個和第5個任務(wù),取高優(yōu)先級為2,則最高優(yōu)先級的任務(wù)號為17OSRdyGrp0100010000010001任務(wù)優(yōu)先級20176543108915141312110010001026242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY源代碼中使用了查表法

查表法具有確定的時間,增加了系統(tǒng)的可預測性,uC/OS中所有的系統(tǒng)調(diào)用時間都是確定的High3=OSUnMapTbl[OSRdyGrp];Low3=OSUnMapTbl[OSRdyTbl[High3]];Prio=(Hign3<<3)+Low3;OSRdyGrp1207654300XXXYYY任務(wù)優(yōu)先級2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XYINT8UconstOSUnMapTbl[]={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};優(yōu)先級判定表OSUnMapTbl[256]舉例:

如OSRdyGrp的值為01101000B,即0X68,則查得OSUnMapTbl[OSRdyGrp]的值是3,它相應于OSRdyGrp中的第3位置1;如OSRdyTbl[3]的值是11100100B,即0XE4,則查OSUnMapTbl[OSRdyTbl[3]]的值是2,則進入就緒態(tài)的最高任務(wù)優(yōu)先級

Prio=3*8+2=26

TaskschedulervoidOSSched(void){INT8Uy;OS_ENTER_CRITICAL();if((OSLockNesting=0)&&(OSIntNesting=0)){ y=OSUnMapTbl[OSRdyGrp]; OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]])if(OSPrioHighRdy!=OSPrioCur){ OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy]; OSCtxSwCtr++; OS_TASK_SW(); }}OS_EXIT_CRITICAL();}voidOSSchedLock(void){if(OSRunning==TRUE){OS_ENTER_CRITICAL();if(OSLockNesting<255){OSLockNesting++;}OS_EXIT_CRITICAL();}}給調(diào)度器上鎖給調(diào)度器開鎖voidOSSchedUnlock(void){if(OSRunning==TRUE){OS_ENTER_CRITICAL();if(OSLockNesting>0){OSLockNesting--;if((OSLockNesting==0)&&(OSIntNesting==0)){OS_EXIT_CRITICAL();OSSched(); }else{OS_EXIT_CRITICAL();}}else{OS_EXIT_CRITICAL();}}}任務(wù)切換將被掛起的任務(wù)寄存器入棧將較高優(yōu)先級任務(wù)的寄存器出棧任務(wù)級的任務(wù)切換OS_TASK_SW()OS_TASK_SW()是宏調(diào)用,含有微處理器的軟中斷指令OS_TASK_SW()將處理器相關(guān)的軟件中斷機制封裝起來,便于操作系統(tǒng)移植調(diào)用OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級任務(wù)

OS_TCBOSTCBCur(1)存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級任務(wù)

OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R4保存當前CPU寄存器的值低優(yōu)先級任務(wù)

OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級任務(wù)

OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)重新裝入要運行的任務(wù)低優(yōu)先級任務(wù)

OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級任務(wù)

OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)任務(wù)切換OS_TASK_SW()的代碼VoidOSCtxSw(void){

將R1,R2,R3及R4推入當前堆棧;

OSTCBCurOSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdyOSTCBSTKPtr;

將R4,R3,R2及R1從新堆棧中彈出;執(zhí)行中斷返回指令;}C/OS-II中的中斷中斷:由于某種事件的發(fā)生,而導致程序流程的改變。產(chǎn)生中斷的事件稱為中斷源。CPU響應中斷的條件:至少有一個中斷源向CPU發(fā)出中斷信號;系統(tǒng)允許中斷,且對此中斷信號未予屏蔽中斷類型:硬件中斷外部中斷陷阱中斷現(xiàn)場控制量的中斷C/OS-II中的中斷服務(wù)子程序用戶中斷服務(wù)子程序:保存全部CPU寄存器;調(diào)用OSIntEnter()或OSIntNesting直接加1;

if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;}

清中斷源;重新開中斷;執(zhí)行用戶代碼做中斷服務(wù);調(diào)用OSIntExit();

恢復所有CPU寄存器;執(zhí)行中斷返回指令;uC/OS-IIaboutbeginninganISRvoidOSIntEnter(void){OS_ENTER_CRITICAL();OSIntNesting++;OS_EXIT_CRITICAL();}Searchforhighestpriority–similartoschedulerHalfcontextswitchisdonebyinterruptresponse–i.e.registerssaved中斷與時鐘節(jié)拍時鐘節(jié)拍(時鐘滴答)Tick,是一種定時器中斷,可通過編程方式實現(xiàn)時鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先32位的整數(shù)OSTime加一。對任務(wù)列表進行掃描,判斷是否有延時任務(wù)應該處于準備就緒狀態(tài),最后進行上下文切換。時鐘節(jié)拍中斷服務(wù)子程序VoidOSTickISR(void){

保存處理器寄存器的值;調(diào)用OSIntEnter(),或是將OSIntNesting加1if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;}

調(diào)用OSTimeTick();

清發(fā)出中斷設(shè)備的中斷;重新允許中斷(可選用)調(diào)用OSIntExit();

恢復處理器寄存器的值;執(zhí)行中斷返回指令;}voidOSTimeTick(void){OS_TCB*ptcb;OSTimeTickHook(); (1)ptcb=OSTCBList; (2)while(ptcb->OSTCBPrio!=OS_IDLE_PRIO){ (3)OS_ENTER_CRITICAL();if(ptcb->OSTCBDly!=0){if(--ptcb->OSTCBDly==0){if(!(ptcb->OSTCBStat&OS_STAT_SUSPEND)){ (4)OSRdyGrp|=ptcb->OSTCBBitY; (5)OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;}else{ptcb->OSTCBDly=1;}}}ptcb=ptcb->OSTCBNext;OS_EXIT_CRITICAL();}OS_ENTER_CRITICAL(); (6)OSTime++; (7)OS_EXIT_CRITICAL();}時鐘節(jié)拍函數(shù)OSTimTick()voidOSTaskIdle(void*pdata){pdata=pdata;for(;;){OS_ENTER_CRITICAL();OSIdleCtr++;OS_EXIT_CRITICAL();}}空閑任務(wù)OSTaskIdle()初始化統(tǒng)計任務(wù)voidmain(void){OSInit();/*初始化uC/OS-II (1)*//*安裝uC/OS-II的任務(wù)切換向量 *//*創(chuàng)建用戶起始任務(wù)(以TaskStart()作為起始任務(wù))(2)*/OSStart();/*開始多任務(wù)調(diào)度

(3)*/}voidTaskStart(void*pdata){/*安裝并啟動uC/OS-II的時鐘節(jié)拍

(4)*/OSStatInit();/*初始化統(tǒng)計任務(wù)

(5)*//*創(chuàng)建用戶應用程序任務(wù) */for(;;){/*這里是TaskStart()的代碼! */}}C/OS-II初始化首先調(diào)用系統(tǒng)初始化函數(shù)OSIint()。OSIint()初始化μC/OS-Ⅱ所有的變量和數(shù)據(jù)結(jié)構(gòu)(見OS_CORE.C)。OSInit()建立空閑任務(wù)idletask,這個任務(wù)總是處于就緒態(tài)的??臻e任務(wù)OSTaskIdle()的優(yōu)先級總是設(shè)成最低,即OS_LOWEST_PRIO。如果統(tǒng)計任務(wù)允許OS_TASK_STAT_EN和任務(wù)建立擴展允許都設(shè)為1,則OSInit()還得建立統(tǒng)計任務(wù)OSTaskStat()并且讓其進入就緒態(tài)。OSTaskStat的優(yōu)先級總是設(shè)為OS_LOWEST_PRIO-1空閑和統(tǒng)計任務(wù)的任務(wù)控制塊(OS_TCBs)是用雙向鏈表鏈接在一起的。OSTCBList指向這個鏈表的起始處。當建立一個任務(wù)時,這個任務(wù)總是被放在這個鏈表的起始處。調(diào)用OSInit()之后的數(shù)據(jù)結(jié)構(gòu)空閑緩沖區(qū)μC/OS-Ⅱ的啟動voidmain(void){OSInit();/*初始化uC/OS-II*/..

通過調(diào)用OSTaskCreate()或OSTaskCreateExt()創(chuàng)建至少一個任務(wù);..OSStart();/*開始多任務(wù)調(diào)度!OSStart()永遠不會返回*/}啟動多任務(wù)voidOSStart(void){INT8Uy;INT8Ux;if(OSRunning==FALSE){y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];OSPrioHighRdy=(INT8U)((y<<3)+x);OSPrioCur=OSPrioHighRdy;OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy]; OSTCBCur=OSTCBHighRdy;OSStartHighRdy(); }}關(guān)于OSStartHighRdy

OSStartHighRdy LDR r4,addr_OSTCBCur ;GetcurrenttaskTCBaddress LDR r5,addr_OSTCBHighRdy ;GethighestprioritytaskTCBaddress LDR r5,[r5] ;getstackpointer LDR sp,[r5] ;switchtothenewstack STR r5,[r4] ;setnewcurrenttaskTCBaddress LDMFD sp!,{r4} ;YYY MSR SPSR_cxsf,r4 LDMFD sp!,{r4} ;getnewstatefromtopofthestack MSR CPSR_cxsf,r4 ;CPSRshouldbeSVC32Mode LDMFD sp!,{r0-r12,lr,pc} ;startthenewtask調(diào)用OSStart()之后的數(shù)據(jù)結(jié)構(gòu)

本節(jié)提要132546C/OS-Ⅱ簡介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)通信與同步C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時間管理C/OS-Ⅱ移植建立任務(wù)UseoneoftwoservicesOSTaskCreate()OSTaskCreateExt()建立任務(wù),OSTaskCreate()INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio){void*psp;INT8Uerr;if(prio>OS_LOWEST_PRIO){(1)return(OS_PRIO_INVALID);}OS_ENTER_CRITICAL();if(OSTCBPrioTbl[prio]==(OS_TCB*)0){ (2)OSTCBPrioTbl[prio]=(OS_TCB*)1;(3)OS_EXIT_CRITICAL();(4)psp=(void*)OSTaskStkInit(task,pdata,ptos,0);err=OSTCBInit(prio,psp,(void*)0,0,0,(void*)0,0);if(err==OS_NO_ERR){ OS_ENTER_CRITICAL();OSTaskCtr++; OSTaskCreateHook(OSTCBPrioTbl[prio]); OS_EXIT_CRITICAL();if(OSRunning){ OSSched(); }}else{OS_ENTER_CRITICAL();OSTCBPrioTbl[prio]=(OS_TCB*)0; OS_EXIT_CRITICAL();}return(err);}else{OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);}}堆棧檢驗,OSTaskStkChk()刪除任務(wù),OSTaskDel()請求刪除任務(wù),OSTaskDelReq()改變?nèi)蝿?wù)的優(yōu)先級,OSTaskChangePrio()掛起任務(wù),OSTaskSuspend()恢復任務(wù),OSTaskResume()其它相關(guān)函數(shù)本節(jié)提要132546C/OS-Ⅱ簡介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)通信與同步C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時間管理C/OS-Ⅱ移植時間管理Fiveservices:OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet()OSTimeDly()voidOSTimeDly(INT16Uticks){if(ticks>0){OS_ENTER_CRITICAL();if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){OSRdyGrp&=~OSTCBCur->OSTCBBitY;}OSTCBCur->OSTCBDly=ticks;OS_EXIT_CRITICAL();OSSched();}}延時詳解OSTimeDlyHMSM()本節(jié)提要132546C/OS-Ⅱ簡介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)通信與同步C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時間管理C/OS-Ⅱ移植任務(wù)間通信手段C/OS中,采用多種方法保護任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之間的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL來對臨界資源進行保護OSSchedLock()禁止調(diào)度保護任務(wù)級的共享資源。提供了經(jīng)典操作系統(tǒng)任務(wù)間通信方法:信號量、郵箱、消息隊列,事件標志。事件控制塊ECB

程序4.5ECB的結(jié)構(gòu)如下

---------------------------------------------------------------------typedefstruct{void*OSEventPtr;/*指向消息或消息隊列的指針*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任務(wù)列表*/INT16UOSEventCnt;/*計數(shù)器(當事件是信號量時)*/INT8UOSEventType;/*事件類型:信號量、郵箱等*/INT8UOSEventGrp;/*等待任務(wù)組*/}OS_EVENT;

與TCB類似的結(jié)構(gòu),使用兩個鏈表,空閑鏈表與使用鏈表所有的通信信號都被看成是事件(event),一個稱為事件控制塊(ECB,EventControlBlock)的數(shù)據(jù)結(jié)構(gòu)來表征每一個具體事件,ECB的結(jié)構(gòu)如下事件的等待任務(wù)列表空閑事件控制塊鏈表事件控制塊TCB的操作對事件控制塊進行的操作包括初始化一個事件控制塊OS_EventWaitListInit();使一個任務(wù)進入就緒態(tài)OS_EventTaskRdy();使一個任務(wù)進入等待某事件的狀態(tài)OS_EventTaskWait();因為等待超時而使一個任務(wù)進入就緒態(tài)OS_EventTO()。信號量semaphore信號量在多任務(wù)系統(tǒng)中用于:控制共享資源的使用權(quán)、標志事件的發(fā)生、使兩個任務(wù)的行為同步。uC/OS中信號量由兩部分組成:信號量的計數(shù)值和等待該信號任務(wù)的等待任務(wù)表。信號量的計數(shù)值可以為二進制,也可以是其他整數(shù)。系統(tǒng)通過OSSemPend()和OSSemPost()來支持信號量的兩種原子操作P()和V()。P()操作減少信號量的值,如果新的信號量的值不大于0,則操作阻塞;V()操作增加信號量的值。任務(wù)、中斷服務(wù)子程序和信號量之間的關(guān)系信號量操作μC/OS-II提供了5個對信號量進行操作的函數(shù)。它們是:OSSemCreate()OSSemPend()OSSemPost()OSSemAccept()OSSemQuery()函數(shù)。郵箱郵箱是μC/OS-II中另一種通訊機制,它可以使一個任務(wù)或者中斷服務(wù)子程序向另一個任務(wù)發(fā)送一個指針型的變量。該指針指向一個包含了特定“消息”的數(shù)據(jù)結(jié)構(gòu)。為了在μC/OS-II中使用郵箱,必須將OS_CFG.H中的OS_MBOX_EN常數(shù)置為1。使用郵箱之前,必須先建立該郵箱。該操作可以通過調(diào)用OSMboxCreate()函數(shù)來完成,并且要指定指針的初始值。μC/OS-II提供了5種對郵箱的操作:OSMboxCreate(),OSMboxPend(),OSMboxPost(),OSMboxAccept()和OSMboxQuery()函數(shù)任務(wù)、中斷服務(wù)子程序和郵箱之間的關(guān)系消息隊列消息隊列是μC/OS-II中另一種通訊機制,它可以使一個任務(wù)或者中斷服務(wù)子程序向另一個任務(wù)發(fā)送以指針方式定義的變量。因具體的應用有所不同,每個指針指向的數(shù)據(jù)結(jié)構(gòu)變量也有所不同。為了使用μC/OS-II的消息隊列功能,需要在OS_CFG.H文件中,將OS_Q_EN常數(shù)設(shè)置為1,并且通過常數(shù)OS_MAX_QS來決定μC/OS-II支持的最多消息隊列數(shù)。在使用一個消息隊列之前,必須先建立該消息隊列。這可以通過調(diào)用OSQCreate()函數(shù),并定義消息隊列中的單元數(shù)(消息數(shù))來完成。μC/OS-II提供了7個對消息隊列進行操作的函數(shù):OSQCreate(),OSQPend(),OSQPost(),OSQPostFront(),OSQAccept(),OSQFlush()和OSQQuery()函數(shù)任務(wù)、中斷服務(wù)子程序和消息隊列之間的關(guān)系操作系統(tǒng)的啟動和運行過程嵌入式控制器硬件初始化操作系統(tǒng)初始化LCD初始化裝載字庫調(diào)用系統(tǒng)配置文件創(chuàng)建任務(wù)初始化用戶界面、時鐘啟動多任務(wù)調(diào)度主

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論