uCOS-II在STM32上的移植_第1頁(yè)
uCOS-II在STM32上的移植_第2頁(yè)
uCOS-II在STM32上的移植_第3頁(yè)
uCOS-II在STM32上的移植_第4頁(yè)
uCOS-II在STM32上的移植_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、8/17/2010,1,C/OS-II 的移植,8/17/2010,2,7.1 概述,User目錄 Main.C Main.H Includes.H OS_Cfg.H,C/OS-II Source目錄 OS_CORE.C OS_FLAG.C OS_MBOX.C OS_MEM.C OS_MUTEX.C OS_Q.C OS_SEM.C OS_TASK.C OS_TIME.C OS_TMR.C uCOS_II.H,C/OS-II Ports目錄Cortex M3 OS_CPU_C.C OS_CPU_A.ASM OS_CPU.H,BSP(板級(jí)支持包) Startup.S Target.C Target

2、.H,ARM Cortex-M3 目標(biāo)板,與處理器無(wú)關(guān)操作系統(tǒng)內(nèi)核代碼,與處理器有關(guān)需要移植代碼,開(kāi)發(fā)板相關(guān)代碼,8/17/2010,3,內(nèi)核文件,移植的部分,用戶代碼,板級(jí)代碼,主程序,8/17/2010,4,ARM Cortex-M3的寄存器模型,LM3S系列單片機(jī)采用ARM Cortex-M3內(nèi)核;在移植之前,先簡(jiǎn)述可見(jiàn)寄存器模型。 ARM Cortex-M3總共有20個(gè)寄存器,每個(gè)都是32位寬度。,8/17/2010,5,8/17/2010,6,狀態(tài),中斷,8/17/2010,7,控制寄存器,8/17/2010,8,7.1.1 移植條件,移植C/OS-II到處理器上必須滿足以下條件,(

3、1)處理器的C編譯器能產(chǎn)生可重入代碼,C/OS是多任務(wù)內(nèi)核,函數(shù)可能會(huì)被多個(gè)任務(wù)調(diào)用,代碼的重入性是保證完成多任務(wù)的基礎(chǔ)??芍厝氪a指的是可被多個(gè)體任務(wù)同時(shí)調(diào)用,而不會(huì)破壞數(shù)據(jù)的一段代碼,或者說(shuō)代碼具有在執(zhí)行過(guò)程中打斷后再次被調(diào)用的能力。,舉例說(shuō)明: Swap1函數(shù)代碼: Int temp; void swap1(int *x,int *y) temp=*x; *x=*y; *y=temp; ,舉例說(shuō)明: Swap2函數(shù)代碼: void swap2(int *x,int *y) int temp; temp=*x; *x=*y; *y=temp; ,可重入,不可重入,編譯器還得支持,MDK開(kāi)

4、發(fā)環(huán)境,可生成可重入代碼,8/17/2010,9,(2)用C語(yǔ)言可打開(kāi)和關(guān)閉中斷,ARM處理器核包含一個(gè)CPSR寄存器,該寄存器包括一個(gè)全局的中斷禁止位,控制它便可打開(kāi)和關(guān)閉中斷。,PRIMASK,(3)處理器支持中斷并且能產(chǎn)生定時(shí)中斷,C/OS-II通過(guò)處理器產(chǎn)生的定時(shí)器中斷來(lái)實(shí)現(xiàn)多任務(wù)之間的調(diào)度。ARM Cortex-M3的處理器都支持中斷并能產(chǎn)生定時(shí)器中斷,專(zhuān)門(mén)有一個(gè)SysTick定時(shí)器來(lái)實(shí)現(xiàn)。,(4)處理器支持能夠容納一定量數(shù)據(jù)的硬件堆棧(通常需要幾十KByte字節(jié)),比如AT98C51處理器,內(nèi)部只有128字節(jié)的RAM,要運(yùn)行,需外擴(kuò)RAM。CM3的芯片,內(nèi)部可多達(dá)128KByte的

5、容量,因此可直接使用。,(5)處理器有將堆棧指針和其他CPU寄存器讀出和存儲(chǔ)到堆棧(或內(nèi)存)的指令,C/OS-II進(jìn)行任務(wù)調(diào)度時(shí),會(huì)把當(dāng)前任務(wù)的CPU寄存器存到此任務(wù)的堆棧中,然后,再?gòu)牧硪粋€(gè)任務(wù)的堆棧中恢復(fù)原來(lái)的工作寄存器,繼續(xù)運(yùn)行另一個(gè)任務(wù)。所以,寄存器的入棧和出棧是C/OS-II多任務(wù)調(diào)度的基礎(chǔ)。,運(yùn)行TCP、UDP需要的內(nèi)存會(huì)更大,通常要100K左右,8/17/2010,10,7.1.2 移植步驟,所謂移植,就是使一個(gè)實(shí)時(shí)操作系統(tǒng)能夠在某個(gè)微處理器平臺(tái)上或微控制器平臺(tái)上運(yùn)行。由C/OS-II的文件系統(tǒng)可知,在移植過(guò)程中,用戶需要關(guān)注的就是與處理器相關(guān)的代碼。這部分包括一個(gè)頭文件OS_C

6、PU.H、一個(gè)匯編文件OS_CPU_A.ASM和一個(gè)C代碼文件OS_CPU_C.C。,OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM,#define設(shè)置一個(gè)常量的值 聲明10個(gè)數(shù)據(jù)類(lèi)型 用#define聲明三個(gè)宏,用C語(yǔ)言編寫(xiě)六個(gè)簡(jiǎn)單的函數(shù),編寫(xiě)四個(gè)匯編語(yǔ)言函數(shù),移植,實(shí)際中,寫(xiě)一個(gè)就行,8/17/2010,11,1、INCLUDES.H,INCLUDES.H是一個(gè)頭文件,它在所有.C文件的第一行被包含。,#include includes.h,INCLUDES.H使得用戶項(xiàng)目中的每個(gè).C文件不用分別去考慮它實(shí)際上需要哪些頭文件。使用INCLUDES.H的唯一缺點(diǎn)是它可能會(huì)包

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

8、數(shù)據(jù)類(lèi)型的定義,因?yàn)樗鼈兣c處理器類(lèi)型有關(guān),隱含著不可移植性。程序中自己定義了一套數(shù)據(jù)類(lèi)型,如INT16U表示16位無(wú)符號(hào)整型。對(duì)于ARM這樣的32位內(nèi)核,INT16U是unsigned short型;如果是16位處理器,則是unsinged int型。,typedef unsigned char BOOLEAN; /* Boolean 布爾變量 */ typedef unsigned char INT8U; /* 無(wú)符號(hào)8位實(shí)體 */ typedef signed char INT8S; /* 有符號(hào)8位實(shí)體 */ typedef unsigned short INT16U; /* 無(wú)符號(hào)16

9、位實(shí)體 */ typedef signed short INT16S; /* 有符號(hào)16位實(shí)體 */ typedef unsigned int INT32U; /* 無(wú)符號(hào)32位實(shí)體 */ typedef signed int INT32S; /* 有符號(hào)32位實(shí)體 */ typedef float FP32 /* 單精度浮點(diǎn)數(shù) */ typedef double FP64; /* 雙精度浮點(diǎn)數(shù) */ typedef unsigned int OS_STK; /* 堆棧是32位寬度 */ typedef unsigned int OS_CPU_SR; /* 申明狀態(tài)寄存器是32位 */,C/O

10、S-II內(nèi)核的代碼需要與處理器位有關(guān),8/17/2010,13,(3)定義臨界段(允許和禁止中斷宏),與所有實(shí)時(shí)內(nèi)核一樣,C/OS-II需要先禁止中斷,再訪問(wèn)代碼的臨界區(qū),并且在訪問(wèn)完畢后,重新允計(jì)中斷。這就是C/OS-II能夠保護(hù)臨界段代碼免受多任務(wù)或中斷服務(wù)例程ISR的破壞。中斷禁止時(shí)間是商業(yè)實(shí)時(shí)內(nèi)核公司提供的重要指標(biāo)之一,因?yàn)樗鼘⒂绊懙接脩舻南到y(tǒng)對(duì)實(shí)時(shí)事件的響應(yīng)能力。雖然C/OS-II盡量使中斷禁止時(shí)間達(dá)到最短,但是C/OS-II的中斷禁止時(shí)間還主要依賴于處理器結(jié)構(gòu)和編譯器產(chǎn)生的代碼的質(zhì)量。通常每個(gè)處理器都會(huì)提供一定的指令來(lái)禁止/允許中斷,因此用戶的C編譯器必須由一定的機(jī)制來(lái)直接從C中執(zhí)

11、行這些操作。,OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL(),C/OS-II定義了兩個(gè)宏來(lái)禁止和允許中斷:,#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中具體實(shí)現(xiàn),C/OS-II定義了三種方法關(guān)閉和打開(kāi)中斷 (OS_CRITICAL_METHED=1,2,3),通常情況下,我們都是選用的方法3。,8/17/201

12、0,14,OS_CPU_SR_Save MRS R0,PRIMASK CPSID I BX LR,OS_CPU_SR_Restore MSR PRIMASK, R0 BX LR,關(guān)中斷,開(kāi)中斷,(4)定義棧的增長(zhǎng)方向,C/OS-II使用結(jié)構(gòu)常量OS_STK_GROWTH來(lái)指定堆棧的增長(zhǎng)方式: 置OS_STK_GROWTH為0,表示堆棧從下往上增長(zhǎng); 置OS_STK_GROWTH為1,表示堆棧從上往下增長(zhǎng)。 Cortex-M3支持從上往下增長(zhǎng)的方式。因此,我們?cè)谝浦矔r(shí),需將OS_STK_GROWTH=1,如果是51系列單片機(jī),則OS_STK_GROWTH=0。,#define OS_STK_GR

13、OWTH 1,8/17/2010,15,(5)定義OS_TASK_SW()宏,任務(wù)級(jí)上下文切換,任務(wù)級(jí)上下文切換(即任務(wù)切換)調(diào)用宏定義OS_TASK_SW()。因?yàn)樯舷挛那袚Q跟處理器有密切關(guān)系,OS_TASK_SW()實(shí)質(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,原型如下:,打開(kāi)MDK查看

14、原始代碼,NVIC_INT_CTRL EQU 0 xE000ED04 NVIC_PENDSVSET EQU 0 x10000000,當(dāng)執(zhí)行完這段代后,自運(yùn)的產(chǎn)生PendSV中斷,也即14號(hào)異常,自動(dòng)跳到14號(hào)異常服務(wù)程序執(zhí)行。 在本移植中則會(huì)直接去執(zhí)行:OSPendSV部分內(nèi)容,8/17/2010,16,中斷控制及狀態(tài)寄存器ICSR 0 xE000_ED04,設(shè)置1將掛起中斷,8/17/2010,17,#ifndef _OS_CPU_H #define _OS_CPU_H #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU

15、_EXT extern #endif /* Date types(Compiler specific) 數(shù)據(jù)類(lèi)型(和編譯器相關(guān)) */ 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 */ typede

16、f signed short INT16S; /* Signed 16 bit quantity */ typedef unsigned 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

17、 int OS_STK; /* wide 堆棧是32位寬度 */ typedef unsigned int OS_CPU_SR; /* Define 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)

18、 原型聲明(見(jiàn)OS_CPU_A.ASM)*/,#if OS_CRITICAL_METHOD = 4 void OS_ENTER_CRITICAL (void); void OS_EXIT_CRITICAL (void); #endif void OSCtxSw (void); void OSIntCtxSw (void); void OSStartHighRdy (void); void OSPendSV (void); OS_CPU_EXT INT32U OsEnterSum; #endif /* END FILE*/,8/17/2010,18,3、移植匯編語(yǔ)言編寫(xiě)的4個(gè)與處理器相關(guān)的函數(shù)O

19、S_CPU_A.ASM,(1)OSStartHighRdy():運(yùn)行優(yōu)先級(jí)最高的就緒任務(wù),OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR(),OSStartHighRdy()函數(shù)是在OSStart()多任務(wù)啟動(dòng)之后,負(fù)責(zé)從最高優(yōu)先級(jí)任務(wù)的TCB控制中獲得該任務(wù)的堆棧指針SP,并通過(guò)SP依次將CPU現(xiàn)場(chǎng)恢復(fù)。這時(shí)系統(tǒng)就將控制權(quán)交給用戶創(chuàng)建的任務(wù)進(jìn)程,直到該任務(wù)被阻塞或都被其他更高優(yōu)先級(jí)的任務(wù)搶占CPU。該函數(shù)僅僅在多任務(wù)啟動(dòng)時(shí)被執(zhí)行一次,用來(lái)啟動(dòng)最高優(yōu)先級(jí)的任務(wù)執(zhí)行。移植該函數(shù)的原因是,它涉及將處理器寄存器保存到堆棧的操作。,8/17/2010

20、,19,8/17/2010,20,(2)OSCtxSw():任務(wù)優(yōu)先級(jí)切換函數(shù),該函數(shù)由OS_TASK_SW()宏調(diào)用,OS_TASK_SW()由OSSched()函數(shù)調(diào)用,OSSched()函數(shù)負(fù)責(zé)任務(wù)之間的調(diào)度。OSCtxSw()函數(shù)的工作是,先將當(dāng)前任務(wù)的CPU現(xiàn)場(chǎng)保存到該任務(wù)的堆棧中,然后獲得最高優(yōu)先級(jí)任務(wù)的堆棧指針,并從該堆棧中恢復(fù)此任務(wù)的CPU現(xiàn)場(chǎng),使之繼續(xù)執(zhí)行,該函數(shù)就完了一次任切換。,OSCtxSw PUSH R4, R5 LDR R4, =NVIC_INT_CTRL ; 觸發(fā)軟件中斷 LDR R5, =NVIC_PENDSVSET STR R5, R4 POP R4, R5

21、BX LR,產(chǎn)生PendSV異常,PendSV并沒(méi)有馬上執(zhí)行,因?yàn)镺S_TASK_SW()(實(shí)際是OSCtxSw())被調(diào)用前中斷是關(guān)閉的。PednSV只能在中斷使能后才能執(zhí)行。OS_TASK_SW()總是被OS_Sched()調(diào)用(見(jiàn)OS_CORE.C文件),8/17/2010,21,8/17/2010,22,觸發(fā)PendSV異常,當(dāng)PendSV使能,執(zhí)行此后將進(jìn)入中斷服務(wù)程序,8/17/2010,23,(3)OSInitCtxSw():中斷級(jí)的任務(wù)切換函數(shù),該函數(shù)由OSIntExit()調(diào)用。由于中斷可能會(huì)使更高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒態(tài),因此,為了讓更高優(yōu)先級(jí)的任務(wù)能立即運(yùn)行,在中斷服務(wù)子程

22、序的最后,OSInitExit()函數(shù)會(huì)調(diào)用OSInitCtxSw()做任務(wù)切換。這樣做的目的主要是能夠盡快地讓高優(yōu)先級(jí)的任務(wù)得到響應(yīng),保證系統(tǒng)的實(shí)時(shí)性能。 OSInitCtxSw()與OSCtxSw()都是用于任務(wù)切換函數(shù),其區(qū)別在于,在OSIntCtxSw()中無(wú)需再保存CPU寄存器,因?yàn)樵谡{(diào)用OSIntCtxSw()之前已發(fā)生了中斷,OSIntCtxSw()已將默認(rèn)的CPU寄存器保存到被中斷的任務(wù)堆棧中。,OSIntCtxSw PUSH R4, R5 LDR R4, =NVIC_INT_CTRL; 觸發(fā)軟件中斷 LDR R5, =NVIC_PENDSVSET STR R5, R4 POP

23、 R4, R5 BX LR NOP,OSCtxSw() OSIntCtxSw()這兩個(gè)函最終都會(huì)觸發(fā)PendSV異常,8/17/2010,24,OSPendSV()函數(shù),OSPendSV()是PendSV(可掛起中斷服務(wù))的中斷處理函數(shù),它負(fù)責(zé)C/OS-II的全部上下文切換。這是ARM Cortex-M3提倡的上下文切換方法。使用這程方法的好處理當(dāng)發(fā)生任何的異常時(shí),Cortex-m3自動(dòng)保存CPU的一半通用寄存器到預(yù)先指定的堆棧中,并且在退出異常前按順序恢復(fù)寄存器。OSPendSV()只需保存剩下的R4-R11寄存器并且調(diào)整好堆棧指針。這種方法速度快,充分體現(xiàn)了ARM Cortex-M3的優(yōu)勢(shì)

24、,而且無(wú)論是任務(wù)還是異常均可觸發(fā)此函數(shù)切換上下文。注意使用前應(yīng)在Startup.S中申明。,8/17/2010,25,8/17/2010,26,ARM Cortex-M3任務(wù)切換示意圖,8/17/2010,27,(4)OSTickISR():時(shí)鐘節(jié)拍中斷服務(wù)函數(shù),時(shí)鐘節(jié)拍是特定的周期性中斷,是由硬件定時(shí)器產(chǎn)生的。時(shí)鐘節(jié)拍式中斷使得內(nèi)核可將任務(wù)延時(shí)若干個(gè)整數(shù)時(shí)鐘節(jié)拍,以及當(dāng)任務(wù)等待事件發(fā)生時(shí),提供等待超時(shí)的依據(jù)。時(shí)鐘節(jié)拍頻率越高,系統(tǒng)的額外開(kāi)銷(xiāo)越大。中斷間的時(shí)間間隔取決于不同的應(yīng)用。 OSTickISR()首先將CPU寄存器的值保存在被中斷任務(wù)的堆棧中,之后調(diào)用OSIntEnter()。隨后,OSTickISR()調(diào)用OSTimeTick,檢查所有處于延時(shí)等待狀態(tài)的任務(wù),判斷是否有延時(shí)結(jié)束就緒的任務(wù)。OSTickISR()最后調(diào)用OSIntExit()。如果在中斷中(或其他嵌套的中斷)有更高優(yōu)先級(jí)的任務(wù)就緒,并且當(dāng)前中斷為中斷嵌套的最后一層,

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論