摘 要:本文研究了實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ在ARM微處理器上的內(nèi)核移植。首先介紹了實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ和ARM7微處理器,在此基礎(chǔ)上,分析了內(nèi)核移植的條件和主要內(nèi)容,最后對(duì)代碼移植的正確性進(jìn)行測(cè)試。
關(guān)鍵詞:ARM;μC/OS-Ⅱ;移植
1 引言
嵌入式系統(tǒng)是一個(gè)分散的工業(yè),充滿了競(jìng)爭(zhēng)、機(jī)遇與創(chuàng)新,沒有哪個(gè)系列的處理器和操作系統(tǒng)能夠壟斷全部市場(chǎng),因此留給各個(gè)公司的創(chuàng)新余地很大。研究嵌入式系統(tǒng),一個(gè)必不可少的基礎(chǔ)工作就是實(shí)現(xiàn)嵌入式操作系統(tǒng)在相關(guān)處理器平臺(tái)上的移植。本文基于目前應(yīng)用非常廣泛的ARM處理器體系結(jié)構(gòu),對(duì)μC/OS-II嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核的移植工作做了分析和介紹,并對(duì)代碼移植的正確性進(jìn)行驗(yàn)證。
2 μC/OS-Ⅱ操作系統(tǒng)簡(jiǎn)介
μC/OS-Ⅱ是一個(gè)著名的源代碼開放的嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS),由美國(guó)人Jean J.Labrosse編寫出來。μC/OS-Ⅱ讀作\"micro controller OS 2\",意為\"微控制器操作系統(tǒng)版本 2\"。μC/OS-Ⅱ結(jié)構(gòu)小巧,適合小型控制系統(tǒng),具有執(zhí)行效率高,占用空間小,實(shí)時(shí)性能優(yōu)良和可擴(kuò)展性能強(qiáng)等特點(diǎn),具有可剝奪實(shí)時(shí)內(nèi)核,提供了實(shí)時(shí)系統(tǒng)所需的基本功能,其中包括任務(wù)的調(diào)度與管理,時(shí)間管理,任務(wù)間同步與通信,內(nèi)存管理和中斷服務(wù)等功能。
μC/OS-Ⅱ可用于8位、16位和32位單片機(jī)或DSP。良好的持續(xù)發(fā)展能力、高性能的內(nèi)核以及友好的用戶開發(fā)壞境,使其迅速在嵌入式實(shí)時(shí)操作系統(tǒng)領(lǐng)域占據(jù)一席之地。
3 ARM7微處理器簡(jiǎn)介
ARM(Advanced RISC Machines),是英國(guó)Advanced RISC Machines Limited公司設(shè)計(jì)開發(fā)的通用32位RISC微處理器體系結(jié)構(gòu)。ARM處理器因其卓越的性能和顯著優(yōu)點(diǎn),已成為高性能、低功耗、低成本嵌入式處理器的代名詞,成為32位嵌入式應(yīng)用領(lǐng)域、全球范圍內(nèi)最廣泛使用的處理器。ARM7系列微處理器采用亞微米制造工藝,是一種低電壓、低功耗的32位RISC處理器,其內(nèi)核基于ARMV4T(馮·諾依曼)體系結(jié)構(gòu),分為3級(jí)流水線,最高時(shí)鐘頻率為66MHz,使用3V/5V供電模式,最適合用于對(duì)價(jià)位和功耗要求較高的消費(fèi)類應(yīng)用。ARM7系列微處理器具有如下特點(diǎn):具有嵌入式ICE-RT邏輯,調(diào)試開發(fā)方便;極低的功耗,適合對(duì)功耗要求較高的應(yīng)用,如便攜式產(chǎn)品;能夠提供0.9MIPS/MHz的三級(jí)流水線結(jié)構(gòu);代碼密度高并兼容16位的Thumb指令集;對(duì)操作系統(tǒng)的支持廣泛,包括Windows CE、Linux、Palm OS等;指令系統(tǒng)與ARM9系列、ARM9E系列和ARM10E系列兼容,便于用戶的產(chǎn)品升級(jí)換代;主頻最高可達(dá)130MIPS,高速的運(yùn)算處理能力能勝任絕大多數(shù)的復(fù)雜應(yīng)用。
4 實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ在ARM上的內(nèi)核移植
4.1 移植的條件
處理器的C編譯器能產(chǎn)生可重入代碼;在程序中用C語(yǔ)言就可以打開或關(guān)閉中斷;處理器支持中斷,并且能夠產(chǎn)生定時(shí)中斷;處理器能夠容納一定數(shù)量的硬件堆棧;處理器有將堆棧指針和其他CPU寄存器存儲(chǔ)和讀出到堆棧(或者內(nèi)存)的指令。
4.2 移植μC/OS-Ⅱ主要包括的內(nèi)容
重新定義一系列與編譯器相關(guān)的數(shù)據(jù)類型。具體定義代碼如下:
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;/*8位無符號(hào)整數(shù)*/
typedef signed char INT8S;/*8位有符號(hào)整數(shù)*/
typedef unsigned short INT16U;/*16位有符號(hào)整數(shù)*/
typedef signed short INT16S;/*16位無符號(hào)整數(shù)*/
typedef unsigned long INT32U;/*32位無符號(hào)整數(shù)*/
typedef signed long INT32S;/*32位有符號(hào)整數(shù)*/
typedef float FP32;/*單精度浮點(diǎn)數(shù)*/
typedef double FP64;/*雙精度浮點(diǎn)數(shù)*/
設(shè)置一個(gè)常量來標(biāo)識(shí)堆棧增長(zhǎng)方向。
typedef unsigned int OS_STK /*堆棧的單位,堆棧入口寬度為16位*/
#define OS STK GROWTH 1/*定義堆棧的增長(zhǎng)方向,1表示高地址向低地址增長(zhǎng)*/
聲明用于開關(guān)中斷和任務(wù)切換的宏。具體代碼如下:
#define OS_ENTER_CRITICAL() ARMEnableInt() /*開啟中斷*/
#define OS_NTER_CRITICAL() ARMDisabIeInt() /*關(guān)閉中斷*/
#define OS_TASK_SW() OSCtxSw() /*任務(wù)切換*/
用匯編語(yǔ)言編寫與處理器相關(guān)的函數(shù)(OS_CPU.A.ASM)
為了方便移植,大部分的μC/OS-Ⅱ代碼是用C語(yǔ)言寫的,但仍需要用C和匯編語(yǔ)言寫一些與處理器相關(guān)的代碼,這是因?yàn)棣藽/OS-Ⅱ在讀寫處理器寄存器時(shí)只能通過匯編語(yǔ)言來實(shí)現(xiàn)。它包括以下四個(gè)子函數(shù):OSStartHighRdy()是運(yùn)行優(yōu)先級(jí)最高的就緒任務(wù)、OSCtxsw()是任務(wù)級(jí)的任務(wù)切換函數(shù)、OSIntCtxSw()是中斷級(jí)的任務(wù)切換函數(shù)、OSTickISR()是系統(tǒng)時(shí)鐘節(jié)拍中斷服務(wù)函數(shù)
5 用C語(yǔ)言編寫6個(gè)與操作系統(tǒng)相關(guān)的函數(shù)(OS_CPU_C.C)
OSTaskInit:OSTaskCreate()和OSTaskCreateExt()通過調(diào)用OSTaskStkInit()來初始化任務(wù)的堆棧結(jié)構(gòu)。在用戶建立任務(wù)的時(shí)候,用戶傳遞任務(wù)的地址,pdata指針,任務(wù)的堆棧棧頂和任務(wù)的優(yōu)先級(jí)給OSTaskCreate()和OSTaskCreateExt()。一旦用戶初始化了堆棧,OSTaskStkInit()就需要返回堆棧指針?biāo)傅牡刂?。OSTaskCreate()和OSTaskCreateExt()會(huì)獲得該地址并將它保存到任務(wù)控制塊(OS_TCB)中。
OSTaskCreateHook:當(dāng)用OSTaskCreate()和OSTaskCreateExt()建立任務(wù)時(shí)就會(huì)調(diào)用OSTaskCreateHook()。當(dāng)μC/OS-Ⅱ設(shè)置完自己內(nèi)部結(jié)構(gòu)以后,會(huì)在調(diào)用任務(wù)調(diào)度程序之前調(diào)用OSTaskCreateHook()。 當(dāng) OSTaskCreateHook()被調(diào)用時(shí),會(huì)收到指向已建立任務(wù)的OS_TCB指針,這樣可訪問所有的結(jié)構(gòu)成員。
OSTaskDelHook:當(dāng)任務(wù)被刪除時(shí)會(huì)調(diào)用OSTaskDelHook()。該函數(shù)在任務(wù)從μC/OS-Ⅱ的內(nèi)部任務(wù)鏈表中解開之前被調(diào)用。當(dāng)它被調(diào)用時(shí),會(huì)收到指向正被刪除任務(wù)的OSJCB指針,這樣可訪問所有的結(jié)構(gòu)成員。
OSTaskSwHook:當(dāng)發(fā)生任務(wù)切換的時(shí)候就會(huì)調(diào)用OSTaskSwHook()。OSTaskSwHook()可以直接訪問OSTCBCur和OSTCBHighRdy,因?yàn)樗鼈兪侨肿兞俊STCBCur指向被切換出去的任務(wù)的OS_TCB,而OSTCBHighRdy指向新任務(wù) OS_TCB。
OSTaskStatHook:OSTaskStatHook()每秒鐘都會(huì)被OSTaskStat()調(diào)用一次。用戶可以用OSTaskStatHook()來擴(kuò)展統(tǒng)計(jì)功能。
OSTimeTickHook:OSTimeTickHook()在每個(gè)時(shí)鐘節(jié)拍都會(huì)被OSTaskTick()調(diào)用。OSTimeTickHook()是在節(jié)拍被μC/OS-Ⅱ真正處理并通知用戶的移植實(shí)例或應(yīng)用程序之前被調(diào)用的。
完成了上述工作以后,μC/OS-Ⅱ就可以正常的運(yùn)行在ARM處理器上了
結(jié)束語(yǔ)
μC/OS-II作為一個(gè)優(yōu)秀的實(shí)時(shí)操作系統(tǒng)已經(jīng)被移植到各種體系結(jié)構(gòu)的微處理器上,而ARM體系結(jié)構(gòu)在嵌入式領(lǐng)域也獲得了廣泛的應(yīng)用和支持。將μC/OS-II移植到ARM平臺(tái)上,能夠使我們更深入地了解實(shí)時(shí)操作系統(tǒng)的構(gòu)造,加快在ARM平臺(tái)上的應(yīng)用和開發(fā),并為更高層次上的擴(kuò)展和改進(jìn)打下基礎(chǔ)。
參考文獻(xiàn)
[1]Jean J, 邵貝貝譯. Labrosse. 嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II. 北京 航空航天大學(xué)出版社. 2003.
[2]田澤. 嵌入式系統(tǒng)開發(fā)與應(yīng)用教程. 北京: 北京航空航天大學(xué)出版社, 2004.