版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
嵌入式系統(tǒng)設(shè)計與開發(fā)
第7章C/OS-Ⅱ?qū)崟r操作系統(tǒng)本章提要7.1C/OS-Ⅱ?qū)崟r操作系統(tǒng)概述7.2C/OS-Ⅱ的內(nèi)核結(jié)構(gòu)7.3多任務(wù)同步機制7.4C/OS-Ⅱ中的根本數(shù)據(jù)類型7.5C/OS-Ⅱ在ARM上的移植7.1C/OS-Ⅱ?qū)崟r操作系統(tǒng)概述μC/OS-II讀做“microCOS2”,意為“微控制器操作系統(tǒng)版本2”。μC/OS-II是源碼公開的著名實時內(nèi)核,可用于各類8位、16位和32位單片機或DSP。從μC/OS算起,該內(nèi)核已有10多年應(yīng)用史,在諸多領(lǐng)域得到廣泛應(yīng)用。μC/OS-II是一個完整的、可移植、可固化、可剪裁的占先式實時多任務(wù)內(nèi)核。μC/OS-II使用ANSIC語言編寫,包含一小局部匯編代碼,使之可以供不同架構(gòu)的微處理器使用。至今,從8位到64位,μC/OS-II已在超過40種不同架構(gòu)的微處理器上運行。實時系統(tǒng)概念1.任務(wù)任務(wù)是一個簡單的程序,也稱作一個線程,該程序可以認為CPU完全屬于該程序占用。2.任務(wù)切換多任務(wù)系統(tǒng)中,任務(wù)切換是指CPU的控制權(quán)由當(dāng)前運行任務(wù)轉(zhuǎn)移到另外一個準(zhǔn)備就緒任務(wù)時所發(fā)生的事件。3.操作系統(tǒng)內(nèi)核多任務(wù)系統(tǒng)中,內(nèi)核負責(zé)管理各個任務(wù),或者說為每個任務(wù)分配CPU時間,并且負責(zé)任務(wù)之間的通信,內(nèi)核提供的根本效勞是任務(wù)切換。4.調(diào)度調(diào)度是內(nèi)核的主要職責(zé)之一,就是決定該輪到哪個任務(wù)運行,多數(shù)實時內(nèi)核是基于優(yōu)先級調(diào)度法的。5.可重入性可重入性是指可重入型函數(shù)可以被一個以上的任務(wù)調(diào)用,而不必擔(dān)憂數(shù)據(jù)被破壞。6.任務(wù)優(yōu)先級每個任務(wù)都有其優(yōu)先級,任務(wù)越重要,賦予的優(yōu)先級應(yīng)越高。8.優(yōu)先級繼承優(yōu)先級繼承可以用來解決優(yōu)先級反轉(zhuǎn)的問題。9.互斥互斥是用來控制多任務(wù)對共享數(shù)據(jù)進行訪問的同步機制。10.中斷延遲中斷延遲是指從硬件中斷發(fā)生的一條指令,到開始執(zhí)行中斷處理程序的一條指令之間的這段時間。11.時鐘節(jié)拍時鐘節(jié)拍是特定的周期性中斷,這個中斷可以看作是系統(tǒng)心臟的脈動。C/OS-Ⅱ的主要特點1.源代碼開放購置作者撰寫的《嵌入式實時操作系統(tǒng)μC/OS-II》一書即可獲得μC/OS-IIV2.52版本的所有源代碼,購置此書的其它版本可以獲得相應(yīng)版本的全部源代碼。2.可移植性μC/OS-II的源代碼絕大局部是使用移植性很強的ANSIC寫的,將與微處理器硬件相關(guān)的匯編語言使用量壓縮到最低的限度,以使μC/OS-II便于移植到其它微處理器上。目前,μC/OS-II已經(jīng)被移植到多種不同架構(gòu)的微處理器上。3.可固化性只要具備適宜的軟硬件工具,就可以將μC/OS-II嵌入到產(chǎn)品中成為產(chǎn)品的一局部。4.可剪裁性μC/OS-II使用條件編譯實現(xiàn)可剪裁,用戶程序可以只編譯自己需要的〔μC/OS-II的〕功能,而不編譯不要需要的功能,以減少μC/OS-II對代碼空間和數(shù)據(jù)空間的占用。5.搶占性μC/OS-II是搶占性的實時內(nèi)核.這意味著μC/OS-II總是運行就緒條件下優(yōu)先級最高任務(wù)。6.多任務(wù)μC/OS-II可以管理64個任務(wù),然而,μC/OS-II的作者建議用戶保存8個給μC/OS-II。這樣,留給用戶的應(yīng)用程序最多可有56個任務(wù)。7.可確定性絕大多數(shù)μC/OS-II的函數(shù)調(diào)用和效勞的執(zhí)行時間具有確定性,也就是說,用戶總是能知道μC/OS-II的函數(shù)調(diào)用與效勞執(zhí)行了多長時間。8.任務(wù)棧μC/OS-II的每個任務(wù)都有自己單獨的棧,使用μC/OS-II的占空間校驗函數(shù),可確定每個任務(wù)到底需要多少??臻g。9.系統(tǒng)效勞μC/OS-II提供很多系統(tǒng)效勞,例如信號量、互斥信號量、時間標(biāo)志、消息郵箱、消息隊列、塊大小固定的內(nèi)存的申請與釋放及時間管理函數(shù)等。10.中斷管理中斷可以使正在執(zhí)行的任務(wù)暫時掛起,如果優(yōu)先級更高的任務(wù)被中斷喚醒,那么高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達255層。11.穩(wěn)定性與可靠性μC/OS-II是μC/OS的升級版,μC/OS自1992年以來已經(jīng)有數(shù)百個商業(yè)應(yīng)用。μC/OS-II與μC/OS的內(nèi)核是一樣的,只是提供了更多的功能。2000年7月,μC/OS-II在一個航空工程中得到了美國聯(lián)邦航空管理局對商用飛機的、符合RTCADO–178B標(biāo)準(zhǔn)的認證。這說明,該操作系統(tǒng)的質(zhì)量得到了認證,可以在任何應(yīng)用中使用。EnglishISBN1-57820-103-9美國CMPBOOKChineseISBN7-81077-290-2北京航空航天大學(xué)出版社KoreanISBN89-951540-5-57.2μC/OS-II的內(nèi)核結(jié)構(gòu)μC/OS-II內(nèi)核保護機制在多任務(wù)與中斷并存的實時操作系統(tǒng)中,為了保護核心區(qū)代碼,μC/OS-II的內(nèi)核需要在存取代碼核心區(qū)時禁止中斷,存取完成后再將中斷重新翻開,以免出現(xiàn)多個任務(wù)或中斷效勞程序同時進入該代碼區(qū)。中斷禁止時間是實時內(nèi)核的一項最重要的指標(biāo),因為它影響著系統(tǒng)對實時事件的響應(yīng)能力。μC/OS-II試圖將這段中斷禁止時間減至最小。但是,這在很大程度上還取決于系統(tǒng)的CPU結(jié)構(gòu),以及編譯器生成的代碼質(zhì)量。μC/OS-II定義了兩個宏:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來實現(xiàn)對中斷的允許和禁止,關(guān)中斷和開中斷是為了保護臨界段代碼,這些代碼與處理器有關(guān),是需要移植的代碼。OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()可以有3種不同的實現(xiàn)方法:〔1〕方法1:#defineOS_CRITICAL_METHOD1這是最簡單的一種實現(xiàn)OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()的方法。如果用戶在中斷禁止的情況下調(diào)用了一個μC/OS-II函數(shù),而在從一個μC/OS-II函數(shù)返回時,中斷將被允許。但是,如果用戶在調(diào)用μC/OS-II之前已禁止了中斷,而一般在調(diào)用返回以后仍要求禁止中斷?!?〕方法2:#defineOS_CRITICAL_METHOD2這種實現(xiàn)方法在實現(xiàn)OS_ENTER_CRITICAL()時,是將禁止的中斷狀態(tài)保存在堆棧中,然后禁止中斷。而OS_EXIT_CRITICAL()的實現(xiàn)只需簡單地將中斷狀態(tài)從堆棧中恢復(fù)出來。無論是在中斷禁止時,還是中斷允許時調(diào)用μC/OS-II效勞,都可以在該調(diào)用前后保存中斷狀態(tài)?!?〕方法3:#defineOS_CRITICAL_METHOD3有些編譯器提供了一些功能擴展,允許用戶獲取CPU狀態(tài)〔PSW〕,并可將它存入函數(shù)的局部變量中。于是,這一變量被重新恢復(fù)到PSW中,就可以用偽碼表示。任務(wù)一個任務(wù),也稱作一個線程,是一個簡單的程序,該程序可以認為CPU完全屬于該程序自身。在C語言中,任務(wù)一般是指一個無限循環(huán)函數(shù)。任務(wù)函數(shù)voidmyTask(void*pdata) {for(;;){ /*用戶代碼*//*調(diào)用uC/OS-II效勞*/OSFlagPend();OSMboxPend();OSMutexPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/*用戶代碼*/}}自動刪除任務(wù)voidmyTask(void*pdata){/*用戶代碼*/OSTaskDel(OS_PRIO_SELF);}任務(wù)狀態(tài)實時應(yīng)用程序的設(shè)計過程,包括如何把問題分割成多個任務(wù),每個任務(wù)都是整個應(yīng)用的某一局部,被賦予一定的優(yōu)先級,有它自身的一套CPU存放器和自己的??臻g。多任務(wù)運行的實現(xiàn)實際上是靠CPU在許多任務(wù)之間轉(zhuǎn)換和調(diào)度。CPU只有一個,輪番效勞于一系列任務(wù)中的某一個。每個任務(wù)都處在5種狀態(tài)之中,這5種狀態(tài)是休眠態(tài)、就緒態(tài)、運行態(tài)、掛起態(tài)和被中斷態(tài)。掛起休眠準(zhǔn)備運行ISR中斷OSIntExit〔〕TaskisPreemptedOSTaskDel〔〕OSTaskDel〔〕OSTaskDel〔〕OSTaskCreate〔〕OSTaskCreateExit〔〕OSMBoxPend〔〕OSQPend〔〕OSSernPend〔〕OSTaskSuspend〔〕OSTimeDly〔〕OSTimeDlyHMSM〔〕OSMBoxPost〔〕OSQPost〔〕OSQPostFront〔〕OSSernPost〔〕OSTaskResume〔〕OSTimeDlyResume〔〕OSTimeTick〔〕OSStart〔〕OSIntExit〔〕OSTASKSW〔〕任務(wù)控制塊任務(wù)控制塊OS_TCB是一個數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)堆棧指針,狀態(tài),優(yōu)先級,任務(wù)表位置,任務(wù)鏈表指針等。所有的任務(wù)控制塊分為兩條鏈表,空閑鏈表和使用鏈表。OS_TCB控制模塊定義如下: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;控制塊說明:1.OSTCBStkPtr指向當(dāng)前任務(wù)棧頂?shù)闹羔槨?.OSTCBExtPtr指向用戶定義的任務(wù)控制塊擴展。3.OSTCBStrBottom指向任務(wù)棧底的指針。4.OSTCBStrSizeOSTCBStrSize用來保存棧中可容納的指針元數(shù)目而不是用字節(jié)〔Byte〕表示的棧容量總數(shù)。5.OSTCBOpt它存儲了傳給OSTaskCreateExt()的選擇,只有在用戶將OS_TASK_CREATE_EXT_EN設(shè)為1時,這個變量才有效。6.OSTCBld用于存儲任務(wù)的識別碼〔ID〕。7.OSTCBNext和OSTCBPrev用于任務(wù)控制塊OS_TCBs的雙重鏈接。8.OSTCBEventPtr指向事件控制塊的指針。9.OSTCBMsg指向傳給任務(wù)的消息的指針。10.OSTCBDly當(dāng)需要把任務(wù)延時假設(shè)干個時鐘節(jié)拍,或者需要把任務(wù)掛起一段時間以等待某事件的發(fā)生時要用到這個變量。11.OSTCBStat任務(wù)的狀態(tài)字。12.OSTCBPrio任務(wù)優(yōu)先級。13.OSTCBX、OSTCBY、OSTCBBitX和OSTCBBitY用于加速任務(wù)進入就緒態(tài)的過程或者進入等待事件發(fā)生狀態(tài)的過程。14.OSTCBDelReq布爾量,用于表示該任務(wù)是否需要刪除。任務(wù)調(diào)度
C/OS-Ⅱ總是運行進入就緒態(tài)任務(wù)中優(yōu)先級最高的那一個。確定哪個任務(wù)優(yōu)先級最高以及應(yīng)該哪個任務(wù)運行了,這些工作都是由調(diào)度器完成的,任務(wù)級的調(diào)度是由函數(shù)OSSched()完成的,中斷級的調(diào)度是由另一個函數(shù)OSIntExt()完成。下面分析任務(wù)級的調(diào)度函數(shù)OSSched()的代碼voidOSSched(void){INT8Uy;OS_ENTER_CRITICAL();if((OSLockNesting|OSIntNesting){ y=OSUnMapTbl[OSRdyGrp]; OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]])if(OSPrioHighRdy!=OSPrioCur){ OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy]; OSCtxSwCtr++; OS_TASK_SW(); }}OS_EXIT_CRITICAL();}7.3同步任務(wù)間信息的傳遞有兩個途徑:通過全局變量或發(fā)消息給另一個任務(wù)。用全局變量時,必須保證每個任務(wù)或中斷效勞程序獨享該變量。中斷效勞中保證獨享的唯一方法是關(guān)中斷。如果兩個任務(wù)共享某變量,各任務(wù)實現(xiàn)獨享該變量的方法可以是先關(guān)中斷再開中斷,或使用信號量。消息郵箱典型的消息郵箱也稱作交換消息,是用一個指針型變量,通過內(nèi)核效勞,一個任務(wù)或一個中斷效勞程序可以把一那么消息放到郵箱里去。郵箱是μC/OS-II中另一種通訊機制,它可以使一個任務(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ù)1.等待郵箱消息使用OSMboxPend()函數(shù)等待郵箱消息。2.發(fā)送消息使用OSMboxPost()函數(shù)發(fā)送消息。通過消息郵箱進行通信voidmyTask1(void*pdata){char*Msg;INT8Uerr;for(;;){/*等待郵箱消息*/Msg=(char*)OSMboxPend(Mbox1,0,&err);用戶程序/*將接受到的郵箱信息發(fā)送到Mbox2*/OSMboxPost(Mbox,Msg);}}voidmyTask2(void*pdata){char*Msg;INT8Uerr;for(;;){/*等待郵箱消息*/Msg=(char*)OSMboxPend(Mbox2,0,&err);用戶程序/*將接收到的郵箱信息發(fā)送到Mbox1*/OSMboxPost(Mbox1,Msg);}}任務(wù)、中斷效勞子程序和郵箱之間的關(guān)系7.4C/OS-Ⅱ中的根本數(shù)據(jù)類型整數(shù)數(shù)據(jù)類型類型名稱類型含義數(shù)據(jù)長度(位)BOOLEAN布爾類型8INT8U8位無符號整數(shù)8INT8S8位有符號整數(shù)8INT16U16位無符號整數(shù)16INT16S16位有符號整數(shù)16INT32U32位無符號整數(shù)32INT32S32位有符號整數(shù)32FP32單精度浮點數(shù)32FP64雙精度浮點數(shù)647.5C/OS-Ⅱ在ARM上的移植所謂移植,是指使一個實時內(nèi)核能在某個微處理器或微控制器上運行。
COS-II的主要代碼都是由標(biāo)準(zhǔn)的C語言寫成的,移植方便。在移植前針對所使用的微處理器進行規(guī)劃,主要有以下幾個方面的考慮:編譯器的選擇、任務(wù)模式的選擇和支持的指令集。要使C/OS-Ⅱ正常運行,處理器必須滿足以下要求:處理器的C編譯器能產(chǎn)生可重入代碼用C語言就可以翻開或關(guān)閉中斷處理器支持中斷,并且能產(chǎn)生定時中斷〔通常在10—100Hz之間〕處理器支持能夠容納一定量數(shù)據(jù)的硬件堆棧處理器有將堆棧指針和其他CPU存放器讀出并存儲到堆?;騼?nèi)存中的指令移植步驟C/OS-Ⅱ體系結(jié)構(gòu)移植工作包括以下幾個內(nèi)容:用#define設(shè)置一個常量的值〔OS_CPU.h文件中〕聲明10個數(shù)據(jù)類型〔OS_CPU.h文件中〕用#define聲明3個宏〔OS_CPU.h文件中〕用C語言編寫6個簡單的函數(shù)〔OS_CPU_C.c文件中〕編寫4個匯編語言函數(shù)〔OS_CPU_A.asm文件中〕1.OS_CPU.h文件OS_CPU.h包括了用#define定義的與處理器相關(guān)的常量、宏和類型定義。2.修改后的OS_CPU.h文件3.OS_CPU_A.asm文件在OS_CPU_A.asm文件中,C/OS-Ⅱ的移植要求用戶編寫以下4個簡單的匯編語言函數(shù):OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR(
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年航空公司飛機采購與維護服務(wù)合同
- 加油站零星維修協(xié)議書(2篇)
- 2024年短期借款擔(dān)保人合同
- 2024版全新落戶員工服務(wù)期協(xié)議下載
- 2024招投標(biāo)項目法律支持與合規(guī)性審核合同3篇
- 2024年融資租賃增信擔(dān)保合同格式版B版
- 2025年度城市排水工程合同保修與環(huán)境保護措施2篇
- 2024年飼料市場銷售協(xié)議詳細模板版
- 丹東卷數(shù)學(xué)試卷
- 2024年航空航天產(chǎn)業(yè)股權(quán)質(zhì)押擔(dān)保合同
- 通力電梯KCE電氣系統(tǒng)學(xué)習(xí)指南
- 風(fēng)電場崗位任職資格考試題庫大全-下(填空題2-2)
- 九年級數(shù)學(xué)特長生選拔考試試題
- 幼兒園交通安全宣傳課件PPT
- 門窗施工組織設(shè)計與方案
- 健身健美(課堂PPT)
- (完整版)財務(wù)管理學(xué)課后習(xí)題答案-人大版
- 錨索試驗總結(jié)(共11頁)
- 移動腳手架安全交底
- 人教版“課標(biāo)”教材《統(tǒng)計與概率》教學(xué)內(nèi)容、具體目標(biāo)和要求
- 矩形鋼板水箱的設(shè)計與計算
評論
0/150
提交評論