版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、uCOS II 移植,一:引入,前面介紹了基于ucos的編程,但是前提是我們的板子已經(jīng)移植好了ucos,我們才可以調(diào)用ucos自帶的函數(shù),才能實(shí)現(xiàn)多任務(wù)管理以及其它的功能。 那么ucos該如何移植呢?我們這次課來解決這個問題。,一:引入,uCOS II是一個源碼公開、可移植、可固化、可剪裁和搶占式的實(shí)時多任務(wù)操作系統(tǒng)。 移植:就是使得一個實(shí)時內(nèi)核,或者應(yīng)用的代碼在某個微處理器或微控制器平臺上運(yùn)行。,一:引入,我們移植ucos之前必須下載ucos源碼! 2.86源碼。這個需要注冊用戶才可以下載,注冊一下很簡單。 現(xiàn)在會有更新的版本了,這是我前年移植時使用的源碼。 這樣的版本幾乎也夠用了。,一:引
2、入,為了方便移植:ucos其大部分源碼是用ANSI C編寫,與處理器硬件相關(guān)的部分使用匯編語言編寫??偭考s200行的匯編語言部分被壓縮到最低限度。通常移植操作系統(tǒng)時候,匯編是無法避免的,因?yàn)樘幚砥鞯募拇嫫髦荒芡ㄟ^匯編語言來實(shí)現(xiàn)。 事實(shí)上很多人都在arm上移植過ucos,我們直接使用人家的代碼就可以了,但是我們依舊有必要了解移植原理和過程。,一:引入,uC/OS-II硬件和軟件結(jié)構(gòu)體系,一:引入,uC/OS-II硬件和軟件結(jié)構(gòu)體系,一:引入,硬件平臺要求 1. 處理器的C編譯器能產(chǎn)生可重入代碼。 2. 用C 語言就可以打開和關(guān)閉中斷。 3. 處理器支持中斷,并且能產(chǎn)生定時中斷(通常在10 至10
3、0Hz 之間)。 4. 處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。 5. 處理器有將堆棧指針和其它CPU寄存器讀出和存儲到堆?;騼?nèi)存中的指令。,一:引入,現(xiàn)在使用的處理器大都可以滿足這方面的要求。(簡單單片機(jī),MOTOROLA 6805等無法滿足),一:引入,移植主要工作 用#define 設(shè)置一個常量的值(OS_CPU.H) 聲明10 個數(shù)據(jù)類型(OS_CPU.H) 用#define 聲明三個宏(OS_CPU.H) 用C 語言編寫六個簡單的函(OS_CPU_C.C) 編寫四個匯編語言函數(shù)(OS_CPU_A.ASM) 根據(jù)處理器的不同,一個移植實(shí)例可能需要編寫或改寫50 至30
4、0 行的代碼,需要的時間從幾個小時到一星期不等。,二:移植,第一部分工作,從OS_CPU.H開始 1:Ucos作者為了讓ucso具有較強(qiáng)的移植性,在ucos源碼中所有的數(shù)據(jù)類型,均不使用我們C語言中的int,short,long,double之類,而是用BOOLEAN,INT8U,INT8S, INT16U,INT16S, INT32U,INT32S, FP16, FP32, OS_STK. 為什么呢?,二:移植,int,short,long,double的數(shù)據(jù)寬度與CPU的數(shù)據(jù)的寬度有關(guān)。比如對于16位處理器來說,編譯器將int編譯成16位寬度的整型數(shù)據(jù);而對于32位處理器來說,編譯器將in
5、t編譯成32位寬度的整型數(shù)據(jù)。如果將ucos中的數(shù)據(jù)類型是用int,short,long,double定義,就會導(dǎo)致在不同的處理器中數(shù)據(jù)寬度是不一樣的,很容易導(dǎo)致溢出等一些問題。,二:移植,為此ucos源碼作者直接使用而是用BOOLEAN,INT8U,INT8S, INT16U,INT16S, INT32U,INT32S, FP16, FP32, OS_STK.作為數(shù)據(jù)變量類型。比如INT8U表示一個8bits的整型數(shù)據(jù)類型。然而,這些類型,編譯器是不認(rèn)識,編譯器只認(rèn)識int之類的定義類型。所以我們移植的第一個工作,就是將BOOLEAN,INT8U,INT8S, INT16U,INT16S,
6、INT32U,INT32S, FP16, FP32, OS_STK.轉(zhuǎn)換成編譯器能識辨的類型。,對于32位處理器來說,我們可以這樣 typedef unsigned char BOOLEAN; /* 布爾 */ typedef unsigned char INT8U; /* 無符號8位整型*/ typedef signed char INT8S; /* 有符號8位整型 */ typedef unsigned short INT16U; /* 無符號16位整型*/ typedef signed short INT16S; /* 有符號16位整型*/ typedef unsigned int IN
7、T32U; /* 無符號32位整型*/ typedef signed int INT32S; /* 有符號32位整型*/ typedef float FP32; /* 單精度浮點(diǎn)數(shù)(32位長度)*/ typedef INT32U OS_STK; /* 堆棧是32位寬度 */,二:移植,對于16位處理器來說,我們可以這樣 typedef unsigned char BOOLEAN; /* 布爾 */ typedef unsigned char INT8U; /* 無符號8位整型*/ typedef signed char INT8S; /* 有符號8位整型 */ typedef unsigned
8、 int INT16U; /* 無符號16位整型*/ typedef signed int INT16S; /* 有符號16位整型*/ typedef unsigned double INT32U; /* 無符號32位整型*/ typedef signed double INT32S; /* 有符號32位整型*/ typedef double FP32; /* 單精度浮點(diǎn)數(shù)(32位長度)*/ typedef INT32U OS_STK; /* 堆棧是32位寬度 */,二:移植,二:移植,2:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL() 與所有的實(shí)時內(nèi)核一樣,C/
9、OS-需要先禁止中斷再訪問代碼的臨界段,并且在訪問完畢后重新允許中斷。這就使得C/OS-能夠保護(hù)臨界段代碼免受多任務(wù)或中斷服務(wù)例程(ISRs)的破壞。中斷禁止時間是商業(yè)實(shí)時內(nèi)核公司提供的重要指標(biāo)之一,因?yàn)樗鼘⒂绊懙接脩舻南到y(tǒng)對實(shí)時事件的響應(yīng)能力。雖然C/OS-盡量使中斷禁止時間達(dá)到最短,但是C/OS-的中斷禁止時間還主要依賴于處理器結(jié)構(gòu)和編譯器產(chǎn)生的代碼的質(zhì)量。,二:移植,通常每個處理器都會提供一定的指令來禁止/允許中斷,因此用戶的C 編譯器必須要有一定的機(jī)制來直接從C中執(zhí)行這些操作。有些編譯器能夠允許用戶在C 源代碼中插入?yún)R編語言聲明。這樣就使得插入處理器指令來允許和禁止中斷變得很容易了。其
10、它一些編譯器實(shí)際上包括了語言擴(kuò)展功能,可以直接從C 中允許和禁止中斷。為了隱藏編譯器廠商提供的具體實(shí)現(xiàn)方法,C/OS- 定義了兩個宏來禁止和允許中斷: OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL(),二:移植,因?yàn)椴煌奶幚砥鲗χ袛嗟目刂朴兴煌?,所以移植工程師需要根?jù)自己的情況編寫這一段代碼:,二:移植,AREA OS_CPU_SR_Save_CODE,CODE,READONLY CODE32 OS_CPU_SR_Save MRS R0,CPSR ORR R1,R0,#NO_INT MSR CPSR_c,R1 MRS R1,CPSR AND R1,R1,#NO
11、_INT CMP R1,#NO_INT BNE OS_CPU_SR_Save MOV PC,LR OS_CPU_SR_Restore MSR CPSR_c,R0 MOV PC,LR,二:移植,#define OS_ENTER_CRITICAL() cpu_sr = OS_CPU_SR_Save(); #define OS_EXIT_CRITICAL() OS_CPU_IntDisMeasStop();,二:移植,3:OS_STK_GROWTH 設(shè)置系統(tǒng)堆棧的生長方式。 UCOS工作的時候,我們要使用到堆棧,如任務(wù)切換時候,要將當(dāng)前正在處理的任務(wù)工作狀態(tài)零時保存到堆棧中去,以備這個任務(wù)重新執(zhí)行時
12、候,ucos知道任務(wù)執(zhí)行的切入點(diǎn)。而堆棧的生長方式對于不同處理器是不同的,有些處理器只能支持單向增長方式。,二:移植,對于arm來說,支持雙向增長方式,所以這個很簡單。 #define OS_STK_GROWTH 1 /* Stack grows from HIGH to LOW memory on ARM */ 或者 #define OS_STK_GROWTH 0 /* Stack grows from LOW to HIGH memory on ARM */,二:移植,4: OS_TASK_SW() OS_TASK_SW()是一個宏,它是在C/OS-從低優(yōu)先級任務(wù)切換到最高優(yōu)先級任務(wù)時被調(diào)
13、用的。OS_TASK_SW()總是在任務(wù)級代碼中被調(diào)用的。另一個函數(shù)OSIntExit()被用來在ISR使得更高優(yōu)先級任務(wù)處于就緒狀態(tài)時,執(zhí)行任務(wù)切換功能。任務(wù)切換只是簡單的將處理器寄存器保存到將被掛起的任務(wù)的堆棧中,并且將更高優(yōu)先級的任務(wù)從堆棧中恢復(fù)出來。,二:移植,#define OS_TASK_SW() OSCtxSw() 至于OSCtxSw()如何實(shí)現(xiàn)。具體實(shí)現(xiàn)參看移植工程。 至此,第一個文件移植的主要工作已經(jīng)完成,下面進(jìn)入OS_CPU_A.ASM的移植工作。,二:移植,在OS_CPU_A.ASM 中,uC/OS-II需要用戶編寫的7個簡單的匯編語言函數(shù): OS_CPU_SR_Save
14、 OS_CPU_SR_Restore OSStartHighRdy OSCtxSw OSIntCtxSw OS_CPU_IRQ_ISR OS_CPU_FIQ_ISR,二:移植,5:OS_CPU_SR_Save 和OS_CPU_SR_Restore 前面已經(jīng)介紹過如何實(shí)現(xiàn),主要實(shí)現(xiàn)對中斷的使能和禁止,二:移植,6:OSStartHighRdy Ucos剛開始啟動時,會調(diào)用OSStartHighRdy用于啟動當(dāng)前優(yōu)先級最高的任務(wù)。在后面正常代碼執(zhí)行時,就不會用這個函數(shù)來啟動優(yōu)先級最高的函數(shù)了。具體代碼參考移植工程。,二:移植,MSR CPSR_c, #(NoInt | SYS32Mode) ;進(jìn)入
15、管理模式關(guān)掉中斷 LDR R4, =OSRunning ;告訴OS任務(wù)正在運(yùn)行 MOV R5, #1 STRB R5, R4 BL OSTaskSwHook ;調(diào)用鉤子函數(shù) LDR R6, =OSTCBHighRdy ;獲取最高就緒任務(wù)堆棧指針的指針 LDR R6, R6 ;獲取新任務(wù)堆棧指針 LDR R4, R6 ;得到確切地址 ADD SP, R4, #68 ;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP LDR LR, SP, #-8 MSR CPSR_c, #(NoInt | SVC32Mode) ;進(jìn)入管理模式 MOV SP, R4 ;設(shè)置堆棧指針 LDMFD
16、SP!, R4, R5 ;CPSR,OsEnterSum ;恢復(fù)新任務(wù)的OsEnterSum LDR R3, =OsEnterSum STR R4, R3 MSR SPSR_cxsf, R5 ;恢復(fù)CPSR LDMFD SP!, R0-R12, LR, PC ;運(yùn)行新任務(wù),二:移植,7:OSCtxSw 當(dāng)優(yōu)先級更高的任務(wù)已經(jīng)就緒時,當(dāng)前任務(wù)需要交出cpu控制權(quán),而進(jìn)行切換,這是通過OSCtxSw實(shí)現(xiàn)的,主要任務(wù)為,保存當(dāng)前任務(wù)的寄存器狀態(tài)至堆棧,裝在更高任務(wù)的堆棧內(nèi)容至寄存器。,二:移植,8: OSIntCtxSw 這個函數(shù)和OSCtxSw類似,也用于任務(wù)的切換,所不同的是,是從中斷服務(wù)程序退
17、出時,進(jìn)行任務(wù)切換時調(diào)用的函數(shù)。同為任務(wù)切換,為何需要兩個函數(shù)來實(shí)現(xiàn)。因?yàn)閺娜蝿?wù)切換到另一個任務(wù)時,需要保存任務(wù)狀態(tài),和裝載任務(wù)狀態(tài)過程。 而從中斷切換另一個任務(wù)時,因?yàn)橹袛鄷r,任務(wù)的工作狀態(tài)已經(jīng)保存,現(xiàn)在切換只需要裝載更高級的任務(wù)狀態(tài)就可以了。,二:移植,大家可以觀察工程中這兩個函數(shù)的源碼,OSIntCtxSw的工作量確實(shí)只有OSCtxSw的一半,二:移植,9:OS_CPU_IRQ_ISR和OS_CPU_FRQ_ISR 這連個函數(shù)是arm被中斷時,ucos提供的響應(yīng)函數(shù),分別對應(yīng)普通中斷和快速中斷。實(shí)現(xiàn)方法類似,都包括寄存器數(shù)據(jù)保存,和根據(jù)中斷號調(diào)用對應(yīng)中斷服務(wù)。,二:移植,我們知道,當(dāng)ar
18、m中斷時,程序會跳入0 x18地址或0 x1c運(yùn)行,主要看是普通中斷和快速中斷了。而ucos提供的中斷相應(yīng)函數(shù)是OS_CPU_IRQ_ISR和OS_CPU_FRQ_ISR。所以我們需要將這兩個函數(shù)映射到這兩個地址中去。實(shí)現(xiàn)方法:,二:移植,b HandlerIRQ; 0 x18 . HandlerIRQ HANDLER HandleIRQ ;可見調(diào)用地址為HandleIRQ的函數(shù),二:移植, _ISR_STARTADDRESS;這一段空間存儲中斷服務(wù)函數(shù)的地址。 HandleReset # 4 HandleUndef # 4 HandleSWI # 4 HandlePabort # 4 Han
19、dleDabort # 4 HandleReserved # 4 HandleIRQ # 4 可見HandleIRQ的地址位于(*(unsigned *)(_ISR_STARTADDRESS+0 x18),二:移植,而44b.h文件中又有另一段定義: #define pISR_IRQ (*(unsigned *)(_ISR_STARTADDRESS+0 x18) #define pISR_FIQ (*(unsigned *)(_ISR_STARTADDRESS+0 x1c),二:移植,事實(shí)上pISR_IRQ和HandleIRQ是完全相同的,只是前者習(xí)慣于C語言上用,而后者習(xí)慣于匯編。,二:移植
20、,后面只需要將ucos提供的OS_CPU_IRQ_ISR服務(wù)函數(shù)存儲在地址為pISR_IRQ 既可以了 : pISR_IRQ=(int)OS_CPU_IRQ_ISR;,二:移植,OS_CPU_IRQ_ISR如何工作呢?它首先將當(dāng)前任務(wù)的寄存器狀態(tài)壓入堆棧,然后調(diào)用OS_CPU_IRQ_ISR_Handler函數(shù)。 OS_CPU_IRQ_ISR_Handler是要求我們來寫的,我們根據(jù)不同的中斷號調(diào)用不同的函數(shù),不過這就可以用C語言實(shí)現(xiàn)了,如:,void OS_CPU_IRQ_ISR_Handler(void) INT32U temp,temp1; temp1 = rINTMSK; temp =
21、 rI_ISPR ,二:移植,void timer0_int(void)/很重要 OSTimeTick(); 這個函數(shù)用于提供時鐘節(jié)拍,當(dāng)然之前要將timer0初始化到200Hz的中斷頻率。,二:移植,void Uart0irq() char ch; while(rUFSTAT0 ,二:移植,OS_CPU_C.C文件的實(shí)現(xiàn) OSTaskStkInit() OSTaskCreateHook() OSTaskDelHook() OSTaskSwHook() OSTaskStatHook() OSTimeTickHook(),二:移植,事實(shí)上,我們只需要實(shí)現(xiàn)第一個函數(shù)就可以了。而其它函數(shù)成為掛鉤函數(shù)
22、。是ucos源碼作者為應(yīng)用工程師提供擴(kuò)展功能用的,當(dāng)然一般是不用實(shí)現(xiàn)的。,二:移植,10: OSTaskStkInit() OSTaskCreate()和OSTaskCreateExt()通過調(diào)用OSTaskStkInt()來初始化任務(wù)的堆棧結(jié)構(gòu).實(shí)現(xiàn)起來很簡單,根據(jù)堆棧的增長方式,隨機(jī)賦予初始值就可以了。,二:移植,OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt) OS_STK *stk; opt = opt; /* opt is not used, prevent wa
23、rning */ stk = ptos; /* Load stack pointer */ *(stk) = (OS_STK)task; /* Entry Point */ *(-stk) = (INT32U)0 x14141414L; /* R14 (LR) */ *(-stk) = (INT32U)0 x12121212L; /* R12 */ *(-stk) = (INT32U)0 x11111111L; /* R11 */ *(-stk) = (INT32U)0 x10101010L; /* R10 */ *(-stk) = (INT32U)0 x09090909L; /* R9 */ *(-stk) = (INT32U)0 x08080808L; /* R8 */ *(-
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年農(nóng)業(yè)全產(chǎn)業(yè)鏈融合發(fā)展路徑
- 2026年無人駕駛車輛測試技術(shù)培訓(xùn)
- 存儲系統(tǒng)容災(zāi)備份建設(shè)手冊
- 2026科技部監(jiān)管中心招聘派遣制職工2人備考題庫及一套完整答案詳解
- 2026年RPA機(jī)器人流程自動化應(yīng)用
- 財務(wù)資金安全培訓(xùn)課件
- 職業(yè)壓力與職業(yè)病的醫(yī)療化防治
- 職業(yè)健康監(jiān)護(hù)中認(rèn)知功能的重要性
- 陽江2025年廣東陽江市陽西縣溪頭鎮(zhèn)人民政府招聘合同制禁毒工作人員筆試歷年參考題庫附帶答案詳解
- 邢臺2025年河北邢臺沙河市招聘中小學(xué)教師100人筆試歷年參考題庫附帶答案詳解
- 民法典物業(yè)管理解讀課件
- 新華書店管理辦法
- 企業(yè)文化與員工滿意度關(guān)系研究
- 中國重癥超聲臨床應(yīng)用專家共識
- 糖水店員工管理制度
- 來料檢驗(yàn)控制程序(含表格)
- 醫(yī)院供氧、供電、供水故障脆弱性分析報告
- 分布式基站光伏電站建設(shè)標(biāo)準(zhǔn)
- 潔凈區(qū)環(huán)境監(jiān)測培訓(xùn)課件
- 酸棗扦插快繁技術(shù)規(guī)程DB1305T+098-2016
- 鋁材銷售技巧培訓(xùn)
評論
0/150
提交評論