新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > μCOSII在基于Cortex-M3核的ARM處理器上的移植

μCOSII在基于Cortex-M3核的ARM處理器上的移植

作者: 時間:2009-03-27 來源:網(wǎng)絡 收藏
目前,技術已被廣泛應用到汽車電子、無線通信、數(shù)碼產(chǎn)品等各個領域。操作系統(tǒng)及技術發(fā)展迅猛,嵌入式操作系統(tǒng)典型代表有μCOS―II、μClinux、Winclow CE、VxWorks等;嵌入式包括、MIPS、PowerPC等。隨著軟硬件技術的發(fā)展,人們開始意識到嵌入式操作系統(tǒng)的程序開發(fā)模式的便利性及可靠性,并且在程序開發(fā)過程中開始傾向于從傳統(tǒng)超循環(huán)開發(fā)模式轉向嵌入式操作系統(tǒng)的開發(fā)模式。

1 軟硬件開發(fā)環(huán)境及介紹
1.1 軟件硬開發(fā)環(huán)境
過程使用的軟件環(huán)境是RealView MDK開發(fā)套件,此產(chǎn)品是公司最新推出的針對各種嵌入式處理器的軟件開發(fā)工具,該開發(fā)套件功能強大,包括了μVision3集成開發(fā)環(huán)境和RealView編譯器。使用的硬件平臺是深圳英蓓特公司推出的全功能評估板STMl03V100,其上所采用的處理器是ST意法半導體公司生產(chǎn)的32位哈佛結構處理器STM32F103VBT6,該處理器內(nèi)置ARM公司最新的Cortex―M3核,并且具有非常豐富的片上資源。
1.2 關于的ARM處理器的介紹
基于Cortex―M3核的ARM處理器支持兩種模式,分別稱為線程模式和處理模式。程序可以在系統(tǒng)復位時或中斷返回時兩種情況下進入線程模式,而處理模式只能通過中斷或異常的方式來進入。處于線程模式中代碼可以分別運行在特權方式下和非特權方式下。處于處理模式中的代碼總是運行在特權方式下。運行在特權方式下的代碼對系統(tǒng)資源具有完全訪問權,而運行在非特權方式下的代碼對系統(tǒng)資源的訪問權受到一定限制。處理器可以運行在Thumb狀態(tài)或Debug狀態(tài)。在指令流正常執(zhí)行期間,處理器處于Thumb狀態(tài)。當進行程序調(diào)試時,指令流可以暫停執(zhí)行,這時處理器處于Debug狀態(tài)。處理器有兩個獨立的堆棧指針,分別稱為MSP和PSP。系統(tǒng)復位時總是處于線程模式的特權方式下,并且默認使用的堆棧指針是MSP。本過程中假設任務總是運行在線程模式的特權方式下且總是使用堆棧指針PSP。

本文引用地址:http://butianyuan.cn/article/152559.htm

2 過程詳解
2.1 μCOS-II內(nèi)核介紹

μCOS―II是一個實時可剝奪型操作系統(tǒng)內(nèi)核,該操作系統(tǒng)支持最多64個任務,但每個任務的優(yōu)先級必須互不相同,優(yōu)先級號小的任務比優(yōu)先級號大的任務具有更高的優(yōu)先級,并且該操作系統(tǒng)總是調(diào)度優(yōu)先級最高的就緒態(tài)任務運行。此內(nèi)核的代碼是美國人Jean J.Labrosse用C語言編寫的,具有很好的可移植性,其2.52版本通過了美國航天航空管理局的安全認證,可靠性非常高。文中所述的移植過程使用的就是該版本的源代碼。
2.2 開始移植
μCOS―II v2.52的源代碼按照移植要求分為需要修改部分和不需要修改部分。其中需要修改源代碼的文件包括頭文件OS_CPU.H、C語言文件OS_CPU.C以及匯編格式文件OS_CPU_A.ASM。
2.2.1 修改頭文件OS_CPU.H
頭文件OS_CPU.H中需要修改的內(nèi)容有與編譯器相關的數(shù)據(jù)類型重定義部分和與處理器相關的少量代碼。由于本移植過程中使用的是RealView編譯器,因此通過查閱此編譯器的相關說明文檔可以得到其所支持的基本數(shù)據(jù)類型,據(jù)此修改OS_CPU.H中與編譯器相關的數(shù)據(jù)類型重定義部分。修改后代碼如下所示:


其中定義的數(shù)據(jù)類型OS_STK指出了處理器堆棧中的數(shù)據(jù)是32位的,OS_CPU_SR指出了處理器狀態(tài)寄存器字長也為32位。
頭文件中與處理器相關部分代碼包括臨界區(qū)訪問處理、處理器堆棧增長方向及任務切換宏定義。臨界區(qū)代碼訪問涉及到全局中斷開關指令,由文獻可以得知關中斷和開中斷可以分別由指令CPSID i和CPSIE i實現(xiàn),文中臨界段訪問處理如下:


其中INT_DIS()和INT_EN()分別對應關中斷和開中斷處理過程。
根據(jù)文獻可知文中所使用的處理器支持的堆棧為滿遞減方式,即堆棧的增長方向是從內(nèi)存高地址向低地址方向遞減并且堆棧指針總是指向棧頂?shù)臄?shù)據(jù)。在頭文件OS_CPU.H中相應代碼只須修改一條,如下所示
#define OS_STK_GROWTH1
此定義中的1代表堆棧方向是向下遞減的。
頭文件OS_CPU.H中最后一個要修改的地方是任務切換宏定義,μCOS―II內(nèi)核就是通過這個宏調(diào)用來觸發(fā)任務級的任務切換。任務切換一般是通過陷阱或軟件中斷來實現(xiàn)的,在基于Cortex―M3核的處理器中支持一條稱為超級用戶調(diào)用的指令SVC,此指令是ARM軟件中斷指令SWI的升級版。此處的宏定義代碼修改為如下形式
#define OS_TASK_SW()OS_SVC()
其中OS_SVC()之中包含了SVC指令,它可以由嵌入?yún)R編的方式在C語言代碼中進行定義,如下所示
_asm void OS_SVC(void){SVCOx00}
以上代碼以嵌入?yún)R編的方式定義了一個輸入?yún)?shù)和返回值都為空的C語言函數(shù),嵌入?yún)R編的格式在RealView編譯器的說明文檔中有詳細的說明。
2.2.2 修改C語言文件OS_CPU.C
根據(jù)文獻可知文件OS_CPU.C中有10個C語言函數(shù)需要編寫,這些函數(shù)中唯一必要的函數(shù)是OSTaskStkInit,其他9個函數(shù)必須聲明,但不一定要包含任何代碼。為了簡潔起見,本移植過程只編寫了OSTaskStkInit,此函數(shù)的作用是把任務堆棧初始化成好像剛發(fā)生過中斷一樣。要初始化堆棧首先必須了解微處理器在中斷發(fā)生前后的堆棧結構,根據(jù)文獻易知微處理器在中斷發(fā)生前后的堆棧結構,并且可知寄存器xPSR、PC、LR、R12、R3、R2、R1、RO是中斷時由硬件自動保存的。初始化時需要注意的地方是xPSR、PC和LR的初值,對于其他寄存器的初值沒有特別的要求。xPSR比特位是Thumb狀態(tài)位,初始化時須置1,否則執(zhí)行代碼時會引起一個稱為Invstate的異常,這是因為內(nèi)置Cortex―M3核的微處理器只支持Thumb和Thumb2指令集。堆棧中PC和LR須初始化為任務的入口地址值,這樣才能在任務切換時跳轉到正確的地方開始執(zhí)行。此函數(shù)可以用以下代碼來實現(xiàn)


2.2.3 修改匯編語言文件OS_CPU_A.ASM
匯編文件OS_CPU_A.ASM中需要編寫的函數(shù)分別為OSStartHighRdy、OSCtxSw、OSIntCtxSw和OSTickISR。第一個函數(shù)的作用是啟動多任務調(diào)度,此函數(shù)只在操作系統(tǒng)開始調(diào)度任務前執(zhí)行一次,以后不再調(diào)用。按照文獻中所述須將堆棧中的寄存器依次彈出,然后執(zhí)行一條中斷返回指令來開始第一個用戶任務的調(diào)度。但基于Cortex―M3核的ARM處理器在執(zhí)行中斷返回指令時必須處于處理模式下,否則將會引起內(nèi)存訪問異常。當系統(tǒng)上電啟動時或程序重置后,處理器會進入線程模式,而要在函數(shù)OSStartHighRdy中執(zhí)行中斷返回指令就首先需要進行模式轉換,進入處理模式,而進行同步可控制模式轉換的途徑是超級用戶調(diào)用,即通過SVC指令產(chǎn)生軟件中斷可轉換到處理模式。實際上考慮到此函數(shù)只在啟動多任務調(diào)度開始前被調(diào)用一次,并且第一次調(diào)度任務運行時任務堆棧中除了xPSR、PC和LR的初值以外,其他寄存器的初值無關緊要。因此可以簡化該函數(shù)的編寫,只須從第一個任務的堆棧中取出該任務的首地址,然后修改堆棧指針使其指向任務堆棧中內(nèi)存地址最高處,即相當于拋棄任務堆棧中所有數(shù)據(jù),最后根據(jù)取出的地址直接跳轉到任務入口地址處開始執(zhí)行。這樣可以免去軟件中斷和模式切換,從而簡化了對此函數(shù)的編寫。需要說明的是在拋棄任務堆棧中所用數(shù)據(jù)的同時也將xPSR的初值拋棄了,但這并不影響第一個任務投人運行,因為在跳轉到第一個任務運行之前,指令流是在Thumb狀態(tài)下正常執(zhí)行的,xPSR已經(jīng)有了確定的值。此函數(shù)代碼如下所示

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

上一頁 1 2 3 下一頁

評論


相關推薦

技術專區(qū)

關閉