新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > mC/OS-II操作系統(tǒng)向ARM7開發(fā)平臺的移植

mC/OS-II操作系統(tǒng)向ARM7開發(fā)平臺的移植

作者:■ 北京工業(yè)大學電控學院 蔣路 時間:2005-04-28 來源:eaw 收藏

工程開發(fā)中,為了實現(xiàn)功能復雜的資源復用,提高軟件功能設計效率,簡化開發(fā)難度,需要采用高性能的實時嵌入式操作系統(tǒng)mC/OS-II作為軟件設計平臺。因此,將mC/OS-II移植到開發(fā)平臺是一項難度極高但十分必要的工作。通常移植工作對開發(fā)人員有非常高的要求,開發(fā)人員不僅要熟練掌握嵌入式系統(tǒng)的開發(fā)模式和方法,而且還要對操作系統(tǒng)、處理器和硬件系統(tǒng)的特性有深入的認識和研究。mC/OS-II移植工作已由作者獨立完成,在實際應用后,證明mC/OS-II工作十分穩(wěn)定。
移植的硬件平臺采用高性能7TDMI內核的AT91m40800嵌入式處理器,開發(fā)調試平臺采用ARM SDT2.51,軟件平臺采用實時嵌入式操作系統(tǒng)mC/OS-II。

mC/OS-II實時操作系統(tǒng)的結構及可移植性分析
mC/OS-II操作系統(tǒng)特點
mC/OS-II是一個高性能的嵌入式實時操作系統(tǒng),是由多任務、多中斷和高效實時內核組成的一個有機整體。應用系統(tǒng)在實時內核的統(tǒng)一管理下協(xié)調工作,能夠高效地實現(xiàn)任務切換、任務調度、任務間通信、同步、互斥、實時時鐘管理、中斷管理等功能。
為了提高系統(tǒng)的實時能力,mC/OS-II可以將一個復雜的應用劃分為多個相互獨立的任務,并根據(jù)任務的重要性來分配優(yōu)先級。每個任務擁有自己的堆??臻g,并且當前任務運行時獨占CPU資源。任務的調度完全由mC/OS-II的實時內核完成,主要包括任務的狀態(tài)管理、選擇最高優(yōu)先權的任務、執(zhí)行任務和撤消任務等。mC/OS-II內核還負責CPU時間分配,CPU時間總是優(yōu)先分配給中斷事件,其次是任務隊列中當前優(yōu)先級最高的任務。不同任務間的通信可以通過mC/OS-II提供的信號量、郵箱、消息隊列等機制完成。
作為一個優(yōu)秀的實時操作系統(tǒng),mC/OS-II具有如下優(yōu)點:
?可移植—絕大部分的mC/OS-II代碼由ANSI C編寫,只有和處理器相關的部分才使用匯編,這使得mC/OS-II便于移植;
?可裁減—如果只使用部分功能,可以通過條件編譯來裁減mC/OS-II的代碼;
?多任務—mC/OS-II可以管理64個任務,目前系統(tǒng)保留了8個,用戶的應用程序最多可以有56個任務。每個任務的優(yōu)先級不同,這意味著mC/OS-II不支持時間片輪轉調度法;
?占先式—mC/OS-II是占先式的實時內核,它總是運行就緒條件下優(yōu)先級最高的任務;
?可確定性—mC/OS-II的全部函數(shù)調用與服務的時間是可知的,mC/OS-II系統(tǒng)服務的時間不依賴于應用程序任務的多少;
?任務棧—每個任務有自己單獨的堆棧;
?系統(tǒng)服務—mC/OS-II提供郵箱、消息隊列、信號量、塊大小固定的內存申請與釋放、時間相關函數(shù)等;
?中斷管理— 中斷可以使正在執(zhí)行的任務掛起,可能會在中斷結束的時候發(fā)生任務切換,中斷嵌套層數(shù)可達255層;
?穩(wěn)定性與可靠性—mC/OS -II和mC/OS自1992年以來已經有幾百個商業(yè)應用;
?公開源代碼—使得系統(tǒng)在商業(yè)應用中具有明顯的價格優(yōu)勢。
mC/OS-II的硬件和軟件體系結構及可移植性分析
圖1說明了mC/OS-II的結構及其與硬件的關系。
由圖1可以看出,mC/OS-II的移植的主要工作是修改與處理器相關部分的代碼,它們集中在三個文件中。其中,OS_CPU.H包含與處理器相關的常量、宏和結構體的定義;OS_CPU_C.C和 OS_CPU_ASM中定義了用于底層的任務切換,退出中斷服務程序,在CPU級屏蔽中斷、打開中斷,對任務棧初始化以及時鐘的中斷服務程序的函數(shù)。
為了使應用程序運行于mC/OS-II上,還要相應地修改應用中使用的硬件設備驅動。
要使mC/OS-II正常運行,處理器必須滿足以下要求:
1. 處理器的C編譯器能夠產生可重入代碼。
2. 用C語言就可以打開和關閉中斷。
3. 處理器支持中斷,且能產生定時中斷(通常在10~100Hz之間)。
4. 處理器支撐能夠容納一定容量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。
5. 處理器有將堆棧指針和其他CPU寄存器讀出,并存儲到堆棧或內存中的指令。
ARM7處理器及開發(fā)環(huán)境ARM SDT2.51所使用的編譯器armcc可以滿足上述要求。但是根據(jù)對mC/OS-II工作原理的分析,上述第3點并不是運行mC/OS-II所必需的。如果應用中不需要定時器,就沒有必要在系統(tǒng)中加入時鐘節(jié)拍功能。在某些系統(tǒng)中沒有使用時鐘節(jié)拍,應用中任務的切換完全依靠任務間的消息機制來完成,這大大提高了系統(tǒng)的實時性。上述要求是能夠移植mC/OS-II全部代碼的條件。
下面將結合mC/OS-II中與操作系統(tǒng)有關部分的功能分析、ARM7處理器體系結構說明mC/OS-II向ARM SDT開發(fā)環(huán)境的移植。

mC/OS-II向ARM SDT2.51開發(fā)環(huán)境的移植
將mC/OS-II向ARM移植,需要修改與處理器相關的數(shù)據(jù)類型和函數(shù)。修改數(shù)據(jù)類型的聲明,需要對ARM處理器的字長及開發(fā)平臺編譯器使用的數(shù)據(jù)類型進行綜合分析。修改與處理器相關的函數(shù),需要對ARM處理器體系結構,ARM匯編程序的編寫,操作系統(tǒng)在任務或中斷切換時對被中斷的任務的現(xiàn)場保護和恢復機制進行綜合分析。下文將結合ARM處理器說明數(shù)據(jù)類型及相關函數(shù)的修改。
數(shù)據(jù)類型及宏的聲明
移植中對OS_CPU.H的修改主要是,改變了與處理器有關的數(shù)據(jù)類型和宏定義。
由于不同處理器有不同字長,mC/OS-II的移植需要重新定義一系列的數(shù)據(jù)類型。使用armcc編譯器,Char類型長度8位,Short類型長度16位,Int和Long類型長度32位。ARM寄存器都是32位的,所以將堆棧數(shù)據(jù)類型OS_STK聲明為32位。所有的堆棧都必須使用OS_STK聲明。
在該文件中,還將開關中斷的宏OS_ENTER_CRITICAL和OS_EXIT_CRITCAL定義為OS_CPU_ASM.S中的函數(shù)ARMDisableINT和ARMEnableINT。
mC/OS-II任務堆棧及任務切換
ARM處理器模式及寄存器
ARM處理器共有7種運行模式,如表1所示。
mC/OS-II作為操作系統(tǒng)可以工作在sys模式和svc模式下。
ARM處理器共有31個通用寄存器(包括程序計數(shù)器PC)和6個狀態(tài)寄存器(PSR),具體組成為:
?未備份寄存器R0~R7。在所有的處理器模式下指的都是同一個物理寄存器。
?備份寄存器R8~R12。每個寄存器對應兩個不同的物理寄存器。   
?R13和R4,每個寄存器對應6個不同的物理地址,usr模式和sys模式公用一個物理寄存器,其余每個模式有各自的R13和R14。寄存器R13常用做棧指針(sp),R14存放函數(shù)或異常模式的返回地址。
?程序計數(shù)器R15。
?當前程序狀態(tài)寄存器(CPSR)和5個備份程序狀態(tài)寄存器(SPSR)。
mC/OS-II任務堆棧
mC/OS-II為每個任務建立堆棧,用于保存處理器的寄存器。其結構體定義為OS_STK[16],保存處理器工作模式(svc模式)的R0~R12、R14、CPSR和SPSR。
mC/OS-II在OS_CPU_C.C中由任務堆棧初始化函數(shù)OSTaskStkInit,需要將任務棧內的CPSR和SPSR設為svc模式。
mC/OS-II的任務切換
mC/OS-II的任務調度函數(shù)OSShed()獲得當前就緒的優(yōu)先級最高任務的TCB(任務控制塊)指針,存入全局變量OSTCBHighRdy,將當前任務的TCB指針存入OSTCBCur。然后調用函數(shù)OS_TASK_SW()進行最底層的任務切換。
OS_CPU_ASM.S內的任務切換函數(shù)OS_TASK_SW()完成的工作有兩步:將被掛起任務的微處理器寄存器推入任務堆棧(OSTCBCur->OSTCBSTK),然后將較高優(yōu)先級的任務的寄存器從棧(OSTCBHighRdy->OSTCBSTK)恢復到寄存器。
屏蔽中斷與開中斷
PSR寄存器格式說明
程序寄存器構造如下:
位  31  30  29  28  27-----
      N    Z   C    V  
-----7  6  5  4  3  2  1  0
       I  F  T   工作模式
I位為1屏蔽處理器的外部中斷,為0允許外部中斷。
F位為1屏蔽處理器的快速中斷,為0允許快速中斷。
屏蔽中斷與開中斷
OS_CPU_ASM.S中的屏蔽中斷函數(shù)ArmDisableInt()將CPSR的I位置1實現(xiàn)在處理器級將中斷屏蔽;開中斷函數(shù)ArmEnableInt()將CPSR的I位置0允許處理器響應中斷。
進入中斷程序和中斷返回程序
ARM處理器的中斷處理程序
處理器響應IRQ異常中斷時的處理過程是,在irq模式的R14保存程序返回的地址;在irq模式的SPSR保存CPSR;切換到irq模式,將CPSR中斷位(I位)置1,跳轉到中斷向量的地址。
mC/OS-II的中斷服務程序
在OS_CPU_ASM.S中的時鐘中斷服務程序OSTickISR是標準的中斷服務程序,函數(shù)的入口寫入AIC的中斷向量表,其實現(xiàn)的過程是:向m40800的AIC_IVR寫入任意的數(shù),讀取m40800的狀態(tài)寄存器清除中斷,保護CPU寄存器入棧,調用OSIntEnter對中斷嵌套標志加1。調用中斷服務程序OSTimeTick,調用OSIntExit判斷是否需要任務切換,如果需要會調用OSIntCtxSW來進行任務切換。此處沒有調用任務切換函數(shù)OS_TASK_SW()是因為CPU寄存器入棧的工作已經在進入中斷時完成。
OSIntCtxSW是OS_CPU_ASM內的函數(shù),完成的工作如下:向m40800的AIC_EOICR寄存器寫入值,將IRQ棧內保存的中斷CPU寄存器的值寫入被中斷的任務棧,將就緒的高優(yōu)先級的任務棧內容寫入對應的CPU寄存器。
OSTickISR是標準的中斷服務程序,其他設備的中斷服務程序可以仿照這一程序的結構編寫,只是對應的設備寄存器地址不同。
測試mC/OS-II內核
基于上述分析,對與處理器有關的4個匯編函數(shù)(ArmIntEnter,ArmIntExit,OSIntCtxSw,OS_Task_Sw),一個C函數(shù)(OSTaskStkInit)及相關的數(shù)據(jù)類型和宏定義進行分析修改就是mC/OS-II移植需要做的工作。
一旦代碼移植結束,下一步工作就是測試。測試一個mC/OS-II的多任務實時內核需要細致地考慮測試步驟。調試的過程應該由簡到繁,可以從一些最簡單的任務,甚至在沒有應用程序的情況下開始測試。這樣做有兩個好處:第一,避免使原本復雜的事情更加復雜;第二,如果出現(xiàn)問題,可以知道問題出現(xiàn)在內核代碼上而不是應用程序。剛開始的時候,可以添加一些簡單的任務和時鐘節(jié)拍的中斷服務例程。一旦多任務調度成功運行了,再添加應用程序就非常簡單了。
在實際測試中,按照由簡到繁的過程不斷使測試變得復雜,如下所述:
1. 添加三個任務,每個任務通過m40800的一個PIO口控制一個LED,在三個任務間互拋信號量。測試mC/OS-II系統(tǒng)內任務調度,任務間通信機制是否工作正確;測試移植的任務棧結構和任務切換函數(shù)OS_Task_SW是否正確(見圖2)。
2. 在上一步的基礎上,打開時鐘中斷,但沒有任務調用OSTimeDly等與時鐘中斷有關的操作。在時鐘中斷的OSTimeTickHook中通過一個PIO控制一個LED的亮滅。測試時鐘中斷的中斷服務程序OSTimeTickISR和中斷后沒有任務切換的情況系統(tǒng)運行是否正確(見圖3)。
3. 在上一步的基礎上,三個基本任務中的延時使用OSTimeDly實現(xiàn),即在時鐘中斷的中斷服務程序完成后需要任務切換。測試移植的OSIntCtxSW是否正確(見圖4)。
4. 在上一步的基礎上,加入第四個任務Task4和串口收數(shù)中斷,在中斷服務程序中將收到字節(jié)放入郵箱,在Task4等待郵箱,被喚醒后從串口發(fā)出收到的字節(jié)。這種情況接近一般工程設計的應用情況(見圖5)。

mC/OS-II向其他基于ARM7內核芯片的移植
以上所述的移植工作大部分針對ARM7內核,但其中涉及到中斷控制器及時鐘控制器的代碼是針對Atmel公司的AT91m40800芯片的專用外設編寫的,在向其他基于ARM7內核的芯片移植mC/OS-II時,只需修改相關外設的驅動程序或系統(tǒng)中OS_CPU文件的相關代碼即可。在使用中,還完成了將mC/OS-II向三星公司的S3C44B0芯片移植的工作?!?/P>



關鍵詞: ARM

評論


相關推薦

技術專區(qū)

關閉