-3節(jié)嵌入式系統(tǒng)(uCOS-II移植)模版課件_第1頁
-3節(jié)嵌入式系統(tǒng)(uCOS-II移植)模版課件_第2頁
-3節(jié)嵌入式系統(tǒng)(uCOS-II移植)模版課件_第3頁
-3節(jié)嵌入式系統(tǒng)(uCOS-II移植)模版課件_第4頁
-3節(jié)嵌入式系統(tǒng)(uCOS-II移植)模版課件_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、本章學習的主要內(nèi)容:1、ROTS應用舉例2、ROTS概述3、uC/OS-II的工作原理4、uC/OS-II移植本章的重點及難點:1、各模塊的根本原理2、各模塊的綜合應用學習方法:1、讀懂教科書及參考資料代碼2、掌握實驗手冊的相關(guān)內(nèi)容3、加強并投入時間實驗4、做好學習筆記5、uC/OS-II應用實例8/17/2021 第4節(jié) C/OS-II 的移植8/17/20217.1 概述User目錄Main.CMain.HIncludes.HOS_Cfg.HC/OS-II Source目錄OS_CORE.C OS_FLAG.C OS_MBOX.C OS_MEM.C OS_MUTEX.C OS_Q.C OS

2、_SEM.C OS_TASK.C OS_TIME.C OS_TMR.C uCOS_II.HC/OS-II Ports目錄Cortex M3 OS_CPU_C.C OS_CPU_A.ASM OS_CPU.HBSP(板級支持包)Startup.STarget.CTarget.H ARM Cortex-M3 目標板與處理器無關(guān)操作系統(tǒng)內(nèi)核代碼與處理器有關(guān)需要移植代碼開發(fā)板相關(guān)代碼8/17/2021內(nèi)核文件移植的局部用戶代碼板級代碼主程序8/17/2021ARM Cortex-M3的存放器模型 LM3S系列單片機采用ARM Cortex-M3內(nèi)核;在移植之前,先簡述可見存放器模型。 ARM Corte

3、x-M3總共有20個存放器,每個都是32位寬度。R0-R12 通用寄存器,可存儲數(shù)據(jù)也可存放指針R13 用于存放堆棧指針。實際上有兩個堆棧指針SP_process(進程堆棧)和 SP_main(主堆棧),但任何時候只有一個是可見的。在本移植中, SP_process用于任務代碼(即線程模式),SP_main用于異常代碼 (即處理模式)。R14 連接寄存器LR。在執(zhí)行分支鏈接指令(BL)或帶交換的分支鏈接指 令(BLX)時,存儲來自PC的返回地址;也用作異常的返回。R15 程序計數(shù)寄存器PC。用于指示當前正被執(zhí)行的指令。根據(jù)不同的指 令,每執(zhí)行一條,PC增加2或增加4。8/17/20218/17

4、/2021狀態(tài)中斷8/17/2021控制存放器8/17/20217.1.1 移植條件移植C/OS-II到處理器上必須滿足以下條件(1)處理器的C編譯器能產(chǎn)生可重入代碼 C/OS是多任務內(nèi)核,函數(shù)可能會被多個任務調(diào)用,代碼的重入性是保證完成多任務的根底??芍厝氪a指的是可被多個體任務同時調(diào)用,而不會破壞數(shù)據(jù)的一段代碼,或者說代碼具有在執(zhí)行過程中打斷后再次被調(diào)用的能力。舉例說明:Swap1函數(shù)代碼:Int temp;void swap1(int *x,int *y) temp=*x; *x=*y; *y=temp;舉例說明:Swap2函數(shù)代碼:void swap2(int *x,int *y) i

5、nt temp; temp=*x; *x=*y; *y=temp;可重入不可重入編譯器還得支持,MDK開發(fā)環(huán)境,可生成可重入代碼8/17/20212用C語言可翻開和關(guān)閉中斷 ARM處理器核包含一個CPSR存放器,該存放器包括一個全局的中斷禁止位,控制它便可翻開和關(guān)閉中斷。PRIMASK3處理器支持中斷并且能產(chǎn)生定時中斷 C/OS-II通過處理器產(chǎn)生的定時器中斷來實現(xiàn)多任務之間的調(diào)度。ARM Cortex-M3的處理器都支持中斷并能產(chǎn)生定時器中斷,專門有一個SysTick定時器來實現(xiàn)。(4)處理器支持能夠容納一定量數(shù)據(jù)的硬件堆棧通常需要幾十KByte字節(jié) 比方AT98C51處理器,內(nèi)部只有128

6、字節(jié)的RAM,要運行,需外擴RAM。CM3的芯片,內(nèi)部可多達128KByte的容量,因此可直接使用。5處理器有將堆棧指針和其他CPU存放器讀出和存儲到堆?;騼?nèi)存的指令 C/OS-II進行任務調(diào)度時,會把當前任務的CPU存放器存到此任務的堆棧中,然后,再從另一個任務的堆棧中恢復原來的工作存放器,繼續(xù)運行另一個任務。所以,存放器的入棧和出棧是C/OS-II多任務調(diào)度的根底。運行TCP、UDP需要的內(nèi)存會更大,通常要100K左右8/17/20217.1.2 移植步驟 所謂移植,就是使一個實時操作系統(tǒng)能夠在某個微處理器平臺上或微控制器平臺上運行。由C/OS-II的文件系統(tǒng)可知,在移植過程中,用戶需要關(guān)

7、注的就是與處理器相關(guān)的代碼。這局部包括一個頭文件OS_CPU.H、一個匯編文件OS_CPU_A.ASM和一個C代碼文件OS_CPU_C.C。OS_CPU.HOS_CPU_C.COS_CPU_A.ASM#define設置一個常量的值聲明10個數(shù)據(jù)類型用#define聲明三個宏用C語言編寫六個簡單的函數(shù)編寫四個匯編語言函數(shù)移植實際中,寫一個就行8/17/20211、INCLUDES.HINCLUDES.H是一個頭文件,它在所有.C文件的第一行被包含。 #include includes.h INCLUDES.H使得用戶工程中的每個.C文件不用分別去考慮它實際上需要哪些頭文件。使用INCLUDES.

8、H的唯一缺點是它可能會包含一些實際不相關(guān)的頭文件。這意味著每個文件的編譯時間可能會增加。但由于它增強了代碼的可移植性,所以我們還是決定使用這一方法。用戶可以通過編輯INCLUDES.H來增加自己的頭文件,但是用戶的頭文件必須添加在頭文件列表的最后。2、根本配置和定義OS_CPU.H(1)用#define 設置一個常量的值#ifdef OS_CPU_GLOBALS#define OS_CPU_EXT#else #define OS_CPU_EXT extern#endif8/17/2021(2)定義與編譯器相關(guān)的數(shù)據(jù)類型 為了保證可移植性,程序中沒有直接使用C語言中的short、int和long

9、等數(shù)據(jù)類型的定義,因為它們與處理器類型有關(guān),隱含著不可移植性。程序中自己定義了一套數(shù)據(jù)類型,如INT16U表示16位無符號整型。對于ARM這樣的32位內(nèi)核,INT16U是unsigned short型;如果是16位處理器,那么是unsinged int型。typedef unsigned char BOOLEAN; /* Boolean 布爾變量 */typedef unsigned char INT8U; /* 無符號8位實體 */ typedef signed char INT8S; /* 有符號8位實體 */ typedef unsigned short INT16U; /* 無符號16

10、位實體 */typedef signed short INT16S; /* 有符號16位實體 */typedef unsigned int INT32U; /* 無符號32位實體 */typedef signed int INT32S; /* 有符號32位實體 */typedef float FP32 /* 單精度浮點數(shù) */typedef double FP64; /* 雙精度浮點數(shù) */typedef unsigned int OS_STK; /* 堆棧是32位寬度 */ typedef unsigned int OS_CPU_SR; /* 申明狀態(tài)存放器是32位 */C/OS-II內(nèi)核的

11、代碼需要與處理器位有關(guān)8/17/2021(3)定義臨界段允許和禁止中斷宏 與所有實時內(nèi)核一樣,C/OS-II需要先禁止中斷,再訪問代碼的臨界區(qū),并且在訪問完畢后,重新允計中斷。這就是C/OS-II能夠保護臨界段代碼免受多任務或中斷效勞例程ISR的破壞。中斷禁止時間是商業(yè)實時內(nèi)核公司提供的重要指標之一,因為它將影響到用戶的系統(tǒng)對實時事件的響應能力。雖然C/OS-II盡量使中斷禁止時間到達最短,但是C/OS-II的中斷禁止時間還主要依賴于處理器結(jié)構(gòu)和編譯器產(chǎn)生的代碼的質(zhì)量。通常每個處理器都會提供一定的指令來禁止/允許中斷,因此用戶的C編譯器必須由一定的機制來直接從C中執(zhí)行這些操作。OS_ENTER

12、_CRITICAL()OS_EXIT_CRITICAL()C/OS-II定義了兩個宏來禁止和允許中斷:#define OS_CRITICAL_METHOD 3 #define OS_ENTER_CRITICAL() cpu_sr = OS_CPU_SR_Save(); #define OS_EXIT_CRITICAL() OS_CPU_SR_Restore(cpu_sr);OS_CPU_A.ASM中具體實現(xiàn)C/OS-II定義了三種方法關(guān)閉和翻開中斷 OS_CRITICAL_METHED=1,2,3,通常情況下,我們都是選用的方法3。8/17/2021OS_CPU_SR_Save MRS R0,

13、PRIMASK CPSID I BX LROS_CPU_SR_Restore MSR PRIMASK, R0 BX LR關(guān)中斷開中斷(4)定義棧的增長方向C/OS-II使用結(jié)構(gòu)常量OS_STK_GROWTH來指定堆棧的增長方式:置OS_STK_GROWTH為0,表示堆棧從下往上增長;置OS_STK_GROWTH為1,表示堆棧從上往下增長。Cortex-M3支持從上往下增長的方式。因此,我們在移植時,需將OS_STK_GROWTH=1,如果是51系列單片機,那么OS_STK_GROWTH=0。#define OS_STK_GROWTH 1 8/17/2021(5)定義OS_TASK_SW()宏,

14、任務級上下文切換 任務級上下文切換即任務切換調(diào)用宏定義OS_TASK_SW()。因為上下文切換跟處理器有密切關(guān)系,OS_TASK_SW()實質(zhì)上是調(diào)用匯編函數(shù)OSCtxSW() ,它在OS_CPU_A.ASM文件中定義。#define OS_TASK_SW() OSCtxSw()OSCtxSw PUSH R4, R5 LDR R4, =NVIC_INT_CTRL ; 觸發(fā)軟件中斷 LDR R5, =NVIC_PENDSVSET STR R5, R4 POP R4, R5 BX LR原型如下:翻開MDK查看原始代碼NVIC_INT_CTRL EQU 0 xE000ED04 NVIC_PENDSV

15、SET EQU 0 x10000000 當執(zhí)行完這段代后,自運的產(chǎn)生PendSV中斷,也即14號異常,自動跳到14號異常效勞程序執(zhí)行。在本移植中那么會直接去執(zhí)行:OSPendSV局部內(nèi)容8/17/2021中斷控制及狀態(tài)存放器ICSR 0 xE000_ED04 設置1將掛起中斷8/17/2021#ifndef _OS_CPU_H#define _OS_CPU_H #ifdef OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endif/* Date types(Compiler specific) 數(shù)據(jù)類型和編譯器相關(guān)

16、 */typedef unsigned char BOOLEAN; /* Boolean 布爾變量 */typedef unsigned char INT8U; /* Unsigned 8 bit quantity */ typedef signed char INT8S; /* Signed 8 bit quantity */ typedef unsigned short INT16U; /* Unsigned 16 bit quantity */typedef signed short INT16S; /* Signed 16 bit quantity */typedef unsigned

17、 int INT32U; /* Unsigned 32 bit quantity */typedef signed int INT32S; /* Signed 32 bit quantity */typedef float FP32; /* Single precision floating point*/typedef double FP64; /* Double precision floating point */typedef unsigned int OS_STK; /* wide 堆棧是32位寬度 */ typedef unsigned int OS_CPU_SR; /* Defi

18、ne size of CPU statusregister */* Method of critical section management 臨界區(qū)管理方法*/#define OS_CRITICAL_METHOD 4/* Other definitions 其他定義 */#define OS_STK_GROWTH 1 #define OS_TASK_SW() OSCtxSw()/* Prototypes(see OS_CPU_A.ASM) 原型聲明見OS_CPU_A.ASM*/#if OS_CRITICAL_METHOD = 4void OS_ENTER_CRITICAL (void);vo

19、id OS_EXIT_CRITICAL (void); #endifvoid OSCtxSw (void);void OSIntCtxSw (void);void OSStartHighRdy (void);void OSPendSV (void);OS_CPU_EXT INT32U OsEnterSum; #endif/* END FILE*/8/17/20213、移植匯編語言編寫的4個與處理器相關(guān)的函數(shù)OS_CPU_A.ASM(1)OSStartHighRdy():運行優(yōu)先級最高的就緒任務OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR() OS

20、StartHighRdy()函數(shù)是在OSStart()多任務啟動之后,負責從最高優(yōu)先級任務的TCB控制中獲得該任務的堆棧指針SP,并通過SP依次將CPU現(xiàn)場恢復。這時系統(tǒng)就將控制權(quán)交給用戶創(chuàng)立的任務進程,直到該任務被阻塞或都被其他更高優(yōu)先級的任務搶占CPU。該函數(shù)僅僅在多任務啟動時被執(zhí)行一次,用來啟動最高優(yōu)先級的任務執(zhí)行。移植該函數(shù)的原因是,它涉及將處理器存放器保存到堆棧的操作。8/17/2021OSStartHighRdy LDR R4, =NVIC_SYSPRI2 ; set the PendSV exception ; priority設置PendSV優(yōu)先級 LDR R5, =NVIC_

21、PENDSV_PRI STR R5, R4 MOV R4, #0 ; set the PSP to 0 for initial ; context switch call 使PSP等于0 MSR PSP, R4 LDR R4, =OSRunning ; OSRunning = TRUE MOV R5, #1 STRB R5, R4 LDR R4, =NVIC_INT_CTRL ; trigger the PendSV exception ; 觸發(fā)軟件中斷 LDR R5, =NVIC_PENDSVSET STR R5, R4 CPSIE I ; enable interrupts at proc

22、essor ; level使能所有優(yōu)先級的中斷OSStartHang B OSStartHang8/17/2021(2)OSCtxSw():任務優(yōu)先級切換函數(shù) 該函數(shù)由OS_TASK_SW()宏調(diào)用,OS_TASK_SW()由OSSched()函數(shù)調(diào)用,OSSched()函數(shù)負責任務之間的調(diào)度。OSCtxSw()函數(shù)的工作是,先將當前任務的CPU現(xiàn)場保存到該任務的堆棧中,然后獲得最高優(yōu)先級任務的堆棧指針,并從該堆棧中恢復此任務的CPU現(xiàn)場,使之繼續(xù)執(zhí)行,該函數(shù)就完了一次任切換。OSCtxSw PUSH R4, R5 LDR R4, =NVIC_INT_CTRL ; 觸發(fā)軟件中斷 LDR R5,

23、 =NVIC_PENDSVSET STR R5, R4 POP R4, R5 BX LR產(chǎn)生PendSV異常 PendSV并沒有馬上執(zhí)行,因為OS_TASK_SW()實際是OSCtxSw()被調(diào)用前中斷是關(guān)閉的。PednSV只能在中斷使能后才能執(zhí)行。OS_TASK_SW()總是被OS_Sched()調(diào)用見OS_CORE.C文件8/17/20218/17/2021觸發(fā)PendSV異常當PendSV使能,執(zhí)行此后將進入中斷效勞程序8/17/2021(3)OSInitCtxSw():中斷級的任務切換函數(shù) 該函數(shù)由OSIntExit()調(diào)用。由于中斷可能會使更高優(yōu)先級的任務進入就緒態(tài),因此,為了讓更高

24、優(yōu)先級的任務能立即運行,在中斷效勞子程序的最后,OSInitExit()函數(shù)會調(diào)用OSInitCtxSw()做任務切換。這樣做的目的主要是能夠盡快地讓高優(yōu)先級的任務得到響應,保證系統(tǒng)的實時性能。 OSInitCtxSw()與OSCtxSw()都是用于任務切換函數(shù),其區(qū)別在于,在OSIntCtxSw()中無需再保存CPU存放器,因為在調(diào)用OSIntCtxSw()之前已發(fā)生了中斷,OSIntCtxSw()已將默認的CPU存放器保存到被中斷的任務堆棧中。OSIntCtxSw PUSH R4, R5 LDR R4, =NVIC_INT_CTRL; 觸發(fā)軟件中斷 LDR R5, =NVIC_PENDSV

25、SET STR R5, R4 POP R4, R5 BX LR NOPOSCtxSw() OSIntCtxSw()這兩個函最終都會觸發(fā)PendSV異常8/17/2021OSPendSV()函數(shù) OSPendSV()是PendSV(可掛起中斷效勞)的中斷處理函數(shù),它負責C/OS-II的全部上下文切換。這是ARM Cortex-M3提倡的上下文切換方法。使用這程方法的好處理當發(fā)生任何的異常時,Cortex-m3自動保存CPU的一半通用存放器到預先指定的堆棧中,并且在退出異常前按順序恢復存放器。OSPendSV()只需保存剩下的R4-R11存放器并且調(diào)整好堆棧指針。這種方法速度快,充分表達了ARM

26、Cortex-M3的優(yōu)勢,而且無論是任務還是異常均可觸發(fā)此函數(shù)切換上下文。注意使用前應在Startup.S中申明。8/17/20218/17/2021ARM Cortex-M3任務切換示意圖8/17/2021(4)OSTickISR():時鐘節(jié)拍中斷效勞函數(shù) 時鐘節(jié)拍是特定的周期性中斷,是由硬件定時器產(chǎn)生的。時鐘節(jié)拍式中斷使得內(nèi)核可將任務延時假設干個整數(shù)時鐘節(jié)拍,以及當任務等待事件發(fā)生時,提供等待超時的依據(jù)。時鐘節(jié)拍頻率越高,系統(tǒng)的額外開銷越大。中斷間的時間間隔取決于不同的應用。 OSTickISR()首先將CPU存放器的值保存在被中斷任務的堆棧中,之后調(diào)用OSIntEnter()。隨后,OSTickISR()調(diào)用OSTimeTick,檢查所有處于延時等待狀態(tài)的任務

溫馨提示

  • 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

提交評論