版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第五章基于UC/OS-II的
嵌入式系統(tǒng)開發(fā)技術(shù).目錄μC/OS-Ⅱ簡介移植規(guī)劃移植μC/OS-Ⅱ應(yīng)用μC/OS-Ⅱ.μC/OS-Ⅱ簡介μC/OS-Ⅱ一個源碼公開、可移植、可固化、可裁剪及占先式的實時多任務(wù)操作系統(tǒng),其絕大部分源碼是用ANSIC寫的,使其可以方便地移植并支持大多數(shù)類型的微處理器。μC/OS—II通過了聯(lián)邦航空局(FAA)商用航行器認證。自1992年問世以來,μC/OS—II已經(jīng)得到了大量的應(yīng)用。μC/OS—II在高校教學(xué)使用是不需要申請許可證的,但若將μC/OS—II的目標代碼嵌入到產(chǎn)品中去,應(yīng)當購買目標代碼銷售許可證。.移植規(guī)劃所謂“移植”,就是使一個實時內(nèi)核能在其它的微處理器或微控制器上運行。盡管大部分μC/OS-Ⅱ的代碼是用C語言編寫的,但是在編寫與處理器硬件相關(guān)的代碼時還是不得不使用匯編語言。移植的主要工作就是編寫這些與處理器硬件相關(guān)的代碼。在移植前針對所使用的微處理器進行規(guī)劃,主要有以下幾個方面的考慮:編譯器的選擇、任務(wù)模式的選擇和支持的指令集。.移植規(guī)劃.移植規(guī)劃—編譯器的選擇目前,針對ARM處理器核的C語言編譯器有很多,如SDT、ADS、IAR、TASKING和GCC等。但最流行的是SDT、ADS和GCC。GCC雖然支持廣泛,很多開發(fā)套件使用它作為編譯器,與ADS比較其編譯效率較低,這對充分發(fā)揮芯片性能很不利。SDT和ADS均為ARM公司自己開發(fā),但ARM公司已不再支持SDT。所以最終使用ADS編譯程序和調(diào)試。
.移植規(guī)劃—任務(wù)模式的取舍ARM處理器核具有用戶、系統(tǒng)、管理、中止、未定義、中斷和快中斷7種模式,其中除用戶模式外,其他均為特權(quán)模式。管理、中止、未定義、中斷和快中斷與相應(yīng)異常相關(guān),任務(wù)使用這些模式不太適合。而系統(tǒng)模式除了是特權(quán)模式外,其他與用戶模式一樣,故可選給任務(wù)使用的模式只有用戶模式和系統(tǒng)模式。為盡量減少任務(wù)代碼錯誤對整個程序的影響,缺省的任務(wù)模式定為用戶模式,可選為系統(tǒng)模式,同時提供接口使任務(wù)可以在二種模式間切換。.移植規(guī)劃—支持的指令集大部分ARM處理器核具有兩個指令集:標準32位ARM指令集和16位Thumb指令集,兩種指令集有不同的應(yīng)用范圍。為最大限度地支持芯片的特性,任務(wù)應(yīng)當可以使用任意一個指令集并可以自由切換,而且不同的任務(wù)應(yīng)當可以使用不同的指令集。.移植μC/OS-Ⅱ要移植一個操作系統(tǒng)到一個特定的CPU體系結(jié)構(gòu)上并不是一件很容易的事情,它對移植者有以下要求:①對目標體系結(jié)構(gòu)要有很深的了解;②對OS原理要有較深入的了解;③對所使用的編譯器要有較深入的了解;④對需要移植的操作系統(tǒng)有相當?shù)牧私?;⑤對具體使用的芯片也要有一定的了解。.移植μC/OS-Ⅱ根據(jù)μC/OS-Ⅱ的要求,移植μC/OS-Ⅱ到一個新的體系結(jié)構(gòu)上需要提供2個或3個文件:?OS_CPU.H(C語言頭文件)?OS_CPU_C.C(C程序源文件)?OS—CPU_A.ASM(匯編程序源文件)其中OS_CPU_A.ASM在某些情況下不需要,但極其罕見。.移植μC/OS-Ⅱ不需要OS—CPU_A.ASM時必須滿足以下條件:①可直接使用C語言開關(guān)中斷;②可直接使用C語言編寫中斷服務(wù)程序;③可直接使用C語言操作堆棧指針;④可直接使用C語言保存CPU的所有寄存器。同時支持以上4點的C語言編譯器幾乎不存在,即使存在,移植代碼往往也會使用部分匯編語言來提高移植代碼的效率。.移植μC/OS-Ⅱ
μC/OS-Ⅱ要求每個.C的文件都要包含頭文件includes.h,使用戶項目中每個文件不用分別去考慮它實際上需要哪些頭文件。使用includes.h的缺點是它可能會包含一些實際不相關(guān)的頭文件,這意味著每個文件的編譯時間可能會增加,但卻增強了代碼的可移植性。.移植μC/OS-Ⅱ在本移植中另外增加了一個頭文件config.h,要求所有用戶程序必須包含config.h,在config.h中包含includes.h和特定的頭文件和配置項。
μC/OS-Ⅱ的系統(tǒng)文件依然只包含includes.h,即μC/OS-Ⅱ的系統(tǒng)文件完全不必改動。所有的配置改變包括頭文件的增減均在config.h中進行,而includes.h定下來后不必改動。這樣μC/OS-Ⅱ的系統(tǒng)文件需要編譯的次數(shù)大大減少,編譯時間隨之減少。.移植μC/OS-Ⅱ—編寫OS_CPU.h1.不依賴于編譯的數(shù)據(jù)類型
μC/OS-Ⅱ不使用C語言中的short、int和long等數(shù)據(jù)類型的定義,因為它們與處理器類型有關(guān),隱含著不可移植性。代之以移植性強的整數(shù)數(shù)據(jù)類型,這樣,既直觀又可移植,不過這就成了必須移植的代碼。.移植μC/OS-Ⅱ—編寫OS_CPU.hTypedefunsignedcharBOOLEAN;/*布爾變量*/typedefunsignedcharINT8U;/*無符號8位整型變量*/typedefsignedcharINT8S;/*有符號8位整型變量*/TypedefunsignedshortINT16U;/*無符號16位整型變量*/typedefsignedshortINT16S;/*有符號16位整型變量*/TypedefunsignedintINT32U;/*無符號32位整型變量*/typedefsignedintINT32S;/*有符號32位整型變量*/typedeffloatFP32;/*單精度浮點數(shù)(32位長度)typedefdoubleFP64;/*雙精度浮點數(shù)(64位長度)typedefINT32UOS_STK;/*堆棧是32位寬度*/.移植μC/OS-Ⅱ—編寫OS_CPU.h2.使用軟中斷SWI作底層接口帶T變量的ARM處理器核具有兩個指令集,用戶任務(wù)還可以使用兩種處理器模式:用戶模式和系統(tǒng)模式,組合起來具有4種方式,各種方式對系統(tǒng)資源有不同的訪問控制權(quán)限。為了使底層接口函數(shù)與處理器狀態(tài)無關(guān),同時在任務(wù)調(diào)用相應(yīng)的函數(shù)不需要知道函數(shù)位置,本移植使用軟中斷指令SWI作為底層接口,使用不同的功能號區(qū)分不同的函數(shù)。用軟中斷作為操作系統(tǒng)的底層接口就需要在C語言中使用SWI指令。在ADS中,有一個關(guān)鍵字一swi,用它聲明一個不存在的函數(shù),則調(diào)用這個函數(shù)就在調(diào)用這個函數(shù)的地方插入一條SWI指令,并且可以指定功能號。同時,這個函數(shù)也可以有參數(shù)和返回值,其傳遞規(guī)則與一般函數(shù)一樣。.移植μC/OS-Ⅱ—編寫OS_CPU.h_swi(0x00)voidOS_TASK_SW(void);/*任務(wù)級任務(wù)切換函數(shù)*/_swi(0x01)void_OSStartHighRdy(void);/*運行優(yōu)先級最高的任務(wù)*/_swi(0x02)voidOS_ENTER_CRITICAL(void);/*關(guān)中斷*/_swi(0x03)voidOS_EXIT_CRITICAL(void);/*開中斷*/_swi(0x40)void*GetOSFunctionAddr(intIndex);/*獲取系統(tǒng)服務(wù)函數(shù)入口*/_swi(0x41)void*GetUsrFunctionAddr(intIndex);/*獲取自定義服務(wù)函數(shù)入口*/_swi(0x42)voidOSISRBegin(void);/*中斷開始處理*/_swi(0x43)intOSISRNeedSwap(void);/*判斷中斷是否需要切換*/_swi(0x80)voidChangeToSYSMode(void);/*任務(wù)切換到系統(tǒng)模式*/_swi(0x81)voidChangeToUSRMode(void);/*任務(wù)切換到用戶模式*/_swi(0x82)voidTaskIsARM(INT8Uprio);/*任務(wù)代碼是ARM代碼*/_swi(0x83)voidTaskIsTHUMB(INT8Uprio);/*任務(wù)代碼是THUMB*/
↑↑軟中斷號用軟中斷時使用的函數(shù)名.移植μC/OS-Ⅱ—編寫OS_CPU.h3.指定堆棧的生長方式:置OS_STK_GROWTH為0,表示堆棧從下往上長置OS_STK_GROWTH為1,表示堆棧從上往下長雖然ARM處理器核對于兩種方式均支持,但ADS的C語言編譯器僅支持一種方式,即從上往下長,并且必須是滿遞減堆棧,所以O(shè)S_STK_GROWTH為1。#defineOS_STK_GROWTH1/*堆棧從上往下長*/.移植μC/OS-Ⅱ—編寫Os_cpu_c.c1.OSTaskStklnit()該函數(shù)用于初使化堆棧,在編寫此函數(shù)之前,必須先確定任務(wù)的堆棧結(jié)構(gòu)。而任務(wù)的堆棧結(jié)構(gòu)是與CPU的體系結(jié)構(gòu)、編譯器有密切的關(guān)聯(lián)。.移植μC/OS-Ⅱ—編寫Os_cpu_c.cOS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt){OS_STK*stk;opt=opt;/*'opt'沒有使用。作用是避免編譯器警告*/stk=ptos;/*獲取堆棧指針*//*建立任務(wù)環(huán)境,ADS1.2使用滿遞減堆棧*/*stk=(OS_STK)task;/*pc*/*-stk=(OS_STK)task;/*lr*/*-stk=0;/*r12*/*-stk=0;/*r11*/*-stk=0;/*r10*/*-stk=0;/*r9*/*-stk=0;/*r8*/.移植μC/OS-Ⅱ—編寫Os_cpu_c.c*-stk=0;/*r7*/*-stk=0;/*r6*/*-stk=0;/*r5*/*-stk=0;/*r4*/*-stk=0;/*r3*/*-stk=0;/*r2*/*-stk=0;/*r1*/*-stk=(unsignedint)pdata;/*r0,第一個參數(shù)使用R0傳遞*/
*-stk=(USER_USING_MODE|0x00);/*spsr,允許IRQ,FIQ中斷*/*-stk=0;/*關(guān)中斷計數(shù)器OsEnterSum*/return(stk);}.編寫Os_cpu_c.c—軟件中斷服務(wù)程序
操作系統(tǒng)與硬件相關(guān)的底層函數(shù)使用軟件中斷作為接口,如下表所示。移植代碼中一個重要的工作就是為這些軟件中斷編寫服務(wù)程序。.編寫Os_cpu_c.c—軟件中斷服務(wù)程序.編寫Os_cpu_c.c—軟件中斷服務(wù)程序.編寫Os_cpu_c.c—軟件中斷服務(wù)程序.編寫Os_cpu_c.c—軟件中斷服務(wù)程序.編寫Os_cpu_c.c—軟件中斷服務(wù)程序.編寫Os_cpu_c.c—軟件中斷服務(wù)程序.編寫Os_cpu_c.c—軟件中斷服務(wù)程序.編寫Os_cpu_c.c—軟件中斷服務(wù)程序.編寫Os_cpu_c.c—軟件中斷服務(wù)程序.編寫Os_cpu_c.c—軟件中斷服務(wù)程序.編寫Os_cpu_c.c—HOOK()函數(shù)
在Os_cpu_cc文件中還有許多鉤子函數(shù),它們在某個特定的系統(tǒng)動作時被調(diào)用,允許執(zhí)行函數(shù)中的用戶代碼。這些函數(shù)默認是空函數(shù),用戶根據(jù)實際情況添加相關(guān)代碼。.編寫Os_cpu_a.s—軟件中斷匯編接口在調(diào)用軟中斷之后,處理器切換到ARM指令和管理模式下工作。在執(zhí)行軟件中斷服務(wù)函數(shù)之前,要提取中斷號和其之入口參數(shù),這些通過軟件中斷掛口程序完成。.編寫Os_cpu_a.s—任務(wù)切換代碼
μCOS—II是搶占式實時操作系統(tǒng),得到運行的始終是就緒條件下最高優(yōu)先圾的任務(wù)。當處于運行狀態(tài)的任務(wù)因為某種原因脫離此緒態(tài),或者有其它更高優(yōu)先圾的任務(wù)進入就緒態(tài),那么操作系統(tǒng)內(nèi)核就要運行別的就緒任務(wù),這對需要進行任務(wù)切換。任務(wù)切換可能發(fā)生的情況有兩種:1.當前運行的任務(wù)主動交出CPU控制權(quán),通常發(fā)生在等待某個事件或是調(diào)用系統(tǒng)延時。調(diào)用函數(shù)OS_TSAKS_SW();2.發(fā)生中斷,使更高優(yōu)先圾的任務(wù)進入就緒狀態(tài),內(nèi)核剝奪當前任務(wù)的運行資格。即發(fā)生在中斷退出時。調(diào)用函數(shù)OSIntCtxW()。.編寫Os_cpu_a.s—任務(wù)切換代碼雖然OS_TSAKS_SW()和OSIntCtxW()的執(zhí)行條件不同,但是它們的功能相同,只要稍作處理就可以它們共用一段任務(wù)切換代碼。這些處理就是保證在執(zhí)行任務(wù)切換前兩者的任務(wù)現(xiàn)場是一致的。共同執(zhí)行的任務(wù)切換代碼是OSIntCtxW。其中OS_TSAKS_SW()是通過軟件中斷0完成的,通過前面的分析,可以知道執(zhí)行任務(wù)切換時的觀場環(huán)境如下所示,同時R3中保存著SPSR,它是任務(wù)中斷前CPSR的備份。.編寫Os_cpu_a.s—OSIntCtxW.編寫Os_cpu_a.s—OSIntCtxW.編寫Os_cpu_a.s—OSIntCtxW.編寫Os_cpu_a.s—OSIntCtxW.編寫Os_cpu_a.s—OSIntCtxW.編寫Os_cpu_a.s—OSIntCtxW.編寫Os_cpu_a.s—OSStartHigeRdy
μCOS—II的多任務(wù)環(huán)境由函數(shù)OSStart()啟動。在調(diào)用函數(shù)之前,必須已經(jīng)建立了一個或更多任務(wù)。OSStart()調(diào)用函數(shù)OSStartHigeRdy()運行多任務(wù)啟動前優(yōu)先級最高的任務(wù),而它最終是調(diào)用_OSStartHigeRdy()實現(xiàn)的,代碼如下:.編寫Os_cpu_a.s通過前面的分析,可以畫出下面這張結(jié)構(gòu)圖:.應(yīng)用μC/OS-Ⅱ—概述在具體項目的應(yīng)用中,還需要以下工作:①各種基于ARM處理器核的芯片的存儲系統(tǒng)不同、片內(nèi)外設(shè)不同,具有的中斷源也不同,甚至連中斷系統(tǒng)都不一樣。因此相關(guān)的代碼就需要開發(fā)者自行編寫。②各個項目對資源的要求不一樣,所以盡管使用同一系列的芯片,其時鐘節(jié)拍中斷也可能使用不同的中斷實現(xiàn)。以NXP半導(dǎo)體公司的LPC2200系列芯片為例,介紹μC/OS-Ⅱ的應(yīng)用。.應(yīng)用μC/OS-Ⅱ—概述開發(fā)基于μC/OS-Ⅱ的嵌入式軟件,步驟為:①編寫或獲取啟動代碼②掛接SWI軟件中斷③編寫中斷及時鐘節(jié)拍中斷代碼④應(yīng)用程序的編寫和調(diào)試.應(yīng)用μC/OS-Ⅱ—啟動代碼編寫或獲取啟動代碼啟動代碼涉及的對象包括存儲器映射和尋址;系統(tǒng)控制模塊,包括外部中斷、時鐘PLL、功率控制等;存儲器加速;外部存儲器控制器;引腳連接模塊狀;向量中斷控制器。.應(yīng)用μC/OS-Ⅱ—掛接SWI中斷掛接SWI軟件中斷將軟中斷異常處理程序掛接到內(nèi)核是通過修改啟動代碼實現(xiàn)的。RESETLDRPC,ResetAddrLDRPC,UndefinedAddr
LDRPC,SWI_AddrLDRPC,PrefetchAddrLDRPC,DataAbortAddrDCD0xb9205f80LDRPC,[PC,#-0xff0]LDRPC,FIQ_AddrResetAddrDCDResetInitUndefinedAddrDCDUndefinedSWI_AddrDCDSoftwareInterruptPrefetchAddrDCDPrefetchAbortDataAbortAddrDCDDataAbortNouseDCD0IRQ_AddrDCD0FIQ_AddrDCDFIQ_Handler.應(yīng)用μC/OS-Ⅱ—中斷及時鐘節(jié)拍中斷編寫中斷服務(wù)程序代碼比較簡單,關(guān)鍵在于把程序與芯片的相關(guān)中斷源掛接,使芯片在產(chǎn)生相應(yīng)的中斷后會調(diào)用相應(yīng)的處理程序。這需要做兩方面事情:1.增加匯編接口的支持是在文件中IRQ.S適當位置添加以下代碼,其中Xxx替換為自己需要的字符串。這樣,匯編接口就完成了。Xxx_Handler HANDLERXxx_Exception2.初始化向量中斷控制器X為分配給中斷的優(yōu)先級,Y為中斷的通道號。VICVectAddrX=(uint32)Xxx_Handler;VICVectCntlx=(0x20|Y);VICIntEnable=1<<Y;.應(yīng)用μC/OS-Ⅱ—應(yīng)用程序編寫調(diào)試移植μC/OS-Ⅱ的目的是為了在自己的系統(tǒng)使用,使用μC/OS-Ⅱ編寫自己的應(yīng)用程序,就必須遵守相應(yīng)的編程規(guī)范。編寫和調(diào)試應(yīng)用程序的步驟為:①建立開發(fā)環(huán)境和連接JTAG仿真器②添加μC/OS-Ⅱ源代碼和移植代碼③建立工程④仿真調(diào)試工程.應(yīng)用μC/OS-Ⅱ—應(yīng)用程序編寫調(diào)試建立開發(fā)環(huán)境和連接JTAG仿真器建議使用ARM公司的ADS集成開發(fā)環(huán)境編譯和調(diào)試程序。.應(yīng)用μC/OS-Ⅱ—應(yīng)用程序編寫調(diào)試添加μC/OS源代碼和移植代碼
建立一個項目目錄,比如uCOS-II。將μC/OS2.52Source(目
溫馨提示
- 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度幼兒園兒童床墊定制采購合同3篇
- 2025年度人工智能教育培訓(xùn)合作合同7篇
- 2025年廠房鋼結(jié)構(gòu)工程環(huán)保驗收與監(jiān)測合同4篇
- 2024鐵路消防安全管理與應(yīng)急預(yù)案合同3篇
- 2025年度健康生活A(yù)PP定制化功能開發(fā)合同3篇
- 「可靠」2024年度廣告位租賃合同3篇
- 2025年度科技園區(qū)場地租賃與合作開發(fā)合同范本4篇
- 2024版建筑渣土清運協(xié)議樣本版
- 2025年度新能源車輛充電設(shè)施安裝與維護合同3篇
- 2025年度叉車司機安全操作與事故責(zé)任認定合同4篇
- 銀行信息安全保密培訓(xùn)
- 市政道路工程交通疏解施工方案
- 2024年部編版初中七年級上冊歷史:部分練習(xí)題含答案
- 拆遷評估機構(gòu)選定方案
- 床旁超聲監(jiān)測胃殘余量
- 上海市松江區(qū)市級名校2025屆數(shù)學(xué)高一上期末達標檢測試題含解析
- 綜合實踐活動教案三上
- 《新能源汽車電氣設(shè)備構(gòu)造與維修》項目三 新能源汽車照明與信號系統(tǒng)檢修
- 2024年新課標《義務(wù)教育數(shù)學(xué)課程標準》測試題(附含答案)
- 醫(yī)院培訓(xùn)課件:《靜脈中等長度導(dǎo)管臨床應(yīng)用專家共識》
- 中國國際大學(xué)生創(chuàng)新大賽與“挑戰(zhàn)杯”大學(xué)生創(chuàng)業(yè)計劃競賽(第十一章)大學(xué)生創(chuàng)新創(chuàng)業(yè)教程
評論
0/150
提交評論