uC/OS-II在EP7312上的移植
關(guān)鍵詞:嵌入式操作系統 μC/OS-II EP7312
引 言
隨著(zhù)Internet和后PC時(shí)代的到來(lái),嵌入式系統的應用愈來(lái)愈廣泛,嵌入式產(chǎn)品在人們的生活中無(wú)處不在。今天,嵌入式系統帶來(lái)的工業(yè)年產(chǎn)值已超過(guò)1萬(wàn)億美元,已經(jīng)在IT產(chǎn)業(yè)中占有很大的比重。
通常,應用程序對嵌入式軟件的基本要求是體積小、執行速度快、具有較好的裁減性和可移植性。嵌入式軟件的靈魂是嵌入式操作系統。在特定的操作系統之上開(kāi)發(fā)應用軟件,可以讓程序開(kāi)發(fā)人員屏蔽掉很多低層硬件細節,使得應用程序調試方便、移植簡(jiǎn)單、易維護,同時(shí)開(kāi)發(fā)周期也短。目前,實(shí)時(shí)操作系統很多,如VxWorks、Window CE、pSOS、QNX、LynxOS等等。這些操作系統都具有高可靠性、很強的實(shí)時(shí)性等特點(diǎn),但它們都是商業(yè)操作系統,價(jià)格昂貴,人們往往很難接受。μC/OS-II的出現是對這些商業(yè)操作系統的一個(gè)很大的沖擊。μC/OS-II是源碼公開(kāi)的實(shí)時(shí)操作系統,是一個(gè)自由操作系統。程序開(kāi)發(fā)人員可以改寫(xiě)源代碼,使之符合自己的要求。裁減掉不需要的部分,使操作系統變得小巧、靈活,并且能滿(mǎn)足用戶(hù)特定操作系統的需要。
1 μC/OS-II簡(jiǎn)介
μC/OS-II并非一個(gè)完整的實(shí)時(shí)操作系統,它只是一個(gè)實(shí)時(shí)內核。μC/OS-II不像其它實(shí)時(shí)操作系統一樣,提供給用戶(hù)的是一個(gè)標準的API函數,程序開(kāi)發(fā)人員利用操作系統提供的API函數進(jìn)行應用程序的開(kāi)發(fā)。要想在μC/OS-II內核上進(jìn)行應用程序的開(kāi)發(fā),就需要程序開(kāi)發(fā)人員在實(shí)時(shí)內核的基礎上建立自己的實(shí)時(shí)操作系統。首先,把μC/OS-II移植到自己的硬件目標板上,寫(xiě)出相應的驅動(dòng)程序以及用戶(hù)圖形界面等等;在這些接口函數之上,加上用戶(hù)自己的應用程序,就構成了嵌入式軟件。
2 μC/OS-II在EP7312上的移植
μC/OS-II的移植條件是:只要該處理器有堆棧,有CPU內部寄存器入棧、出棧指令;使用的C編譯器支持內嵌匯編(inline assembly)或者該C語(yǔ)言可擴展,可連接匯編模塊,使得關(guān)中斷、開(kāi)中斷能在C語(yǔ)言程序中實(shí)現。Cirrus Logic公司生產(chǎn)的EP7312芯片內部采用的是ARM720T處理器,內部有37個(gè)寄存器。其中R13通常用作堆棧指針。堆棧尋址是隱含的,堆棧指針所指定的存儲單元就是堆棧的棧頂,堆棧尋址通常有兩種方式向上生長(cháng)和向下生長(cháng)。ARM處理器有ARM和Thumb兩種指令集。每種指令集都有豐富的指令可以對堆棧進(jìn)行操作。堆棧指針指向最后壓入堆棧的有效數據,稱(chēng)為滿(mǎn)堆棧(full stack);堆棧指針指向下一個(gè)數據項放入的空位置,稱(chēng)為空堆棧(empty stack)。根據堆棧的生長(cháng)方向不同,可以生成4種類(lèi)型的堆棧,即滿(mǎn)遞增、空遞增、滿(mǎn)遞減、空遞減。我們所使用的ARM SDT(ARM Software Development Kit)開(kāi)發(fā)系統內含的編譯器,同樣也支持內嵌匯編,所以μC/OS-II完全可以移植到EP7312上。
μC/OS-II核心代碼很小,程序開(kāi)發(fā)人員要把它移植到自己的目標板中只需做少量的工作。圖1是μC/OS-II硬件和軟件的體系結構。
雖然μC/OS-II大部分源代碼是用C語(yǔ)言寫(xiě)的,但是完成和處理器一些有關(guān)的代碼時(shí),還是必須要用匯編語(yǔ)言來(lái)實(shí)現的。寄存器的讀、寫(xiě)只能通過(guò)匯編語(yǔ)言的存儲和加載指令來(lái)實(shí)現。要使μC/OS-II能夠正常工作, 處理器必須滿(mǎn)足以下要求:
?、?處理器的C編譯器能產(chǎn)生可重入代碼;
?、?用C語(yǔ)言可以打開(kāi)和關(guān)閉中斷;
?、?處理器支持中斷,并且能夠產(chǎn)生定時(shí)中斷(通常在10~100Hz之間);
?、?處理器能夠支持容納一定量數據的硬件堆棧;
?、?處理器有將堆棧指針和其它寄存器讀出和存儲到堆?;騼却嬷械闹噶?。
μC/OS-II的移植包括以下幾個(gè)部分。
(1)設置與編譯器有關(guān)的代碼[OS_CPU.H]
在不同的處理器中有不同的字長(cháng),所以必須定義一系列數據類(lèi)型以確保移植的正確性。另外,在μC/OS-II中,不使用C的short、int和long等數據類(lèi)型,這些都是和編譯器相關(guān)的。下面就是μC/OS-II定義的一部分數據類(lèi)型。
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U; /*無(wú)符號8位整數 */
typedef signed char INT8S; /*有符號8位整數 */
typedef unsigned int INT16U; /*無(wú)符號16位整數 */
typedef signed int INT16S; /*有符號16位整數 */
typedef unsigned long INT32U; /*無(wú)符號32位整數 */
typedef signed long INT32S; /*有符號32位整數 */
typedef float FP32; /*單精度浮點(diǎn)數 */
typedef double FP64; /*雙精度浮點(diǎn)數 */
μC/OS-II需要先禁止中斷訪(fǎng)問(wèn)代碼的臨界區,并且在訪(fǎng)問(wèn)完畢后重新允許中斷。μC/OS-II定義了兩個(gè)宏來(lái)禁止和允許中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。
#define OS_ENTER_CRITICAL() IRQFIQDE
#define IRQFIQDE __asm
{
mrs r0, CPSR;
stmfd sp!, {r0};
orr r0, r0, #NOINT;
msr CPSR_c, r0;
}
#define OS_EXIT_CRITICAL() IRQFIQRE
#define IRQFIQRE __asm
{
ldmfd sp!, {r0};
msr CPSR_c, r0;
}
#endif
?。?)編寫(xiě)4個(gè)匯編語(yǔ)言函數[OS_CPU_A.S]
μC/OS-II的移植實(shí)例要求用戶(hù)編寫(xiě)4個(gè)簡(jiǎn)單的匯編語(yǔ)言函數:
OSStartHighRdy()
OSCtxSw()
OSIntCtxSw()
UCOS_IRQHandler
詳細內容見(jiàn)本刊網(wǎng)絡(luò )補充版(http://www.dpj.com.cn)。
?。?)用C語(yǔ)言編寫(xiě)6個(gè)與操作系統有關(guān)的函數[OS_CPU_C.C]
這6個(gè)函數是:
OSTaskStkInit()
OSTaskCreatHook()
OSTaskDelHook()
OSTaskSwHook()
OSTaskStatHook()
OSTaskTickHook()
這6個(gè)函數只對OSTaskStkInit()編寫(xiě)代碼,后5個(gè)函數必須聲明,但是內部并沒(méi)有代碼。OSTaskCreate()和OSTaskCreateExt()通過(guò)調用OSTaskStkInit()來(lái)初始化任務(wù)的堆棧結構。這個(gè)函數的移植代碼,可參考文獻[3]。
3 測試、編寫(xiě)驅動(dòng)和應用程序
做完以上工作以后,就要測試移植的是否正確。測試一個(gè)μC/OS-II實(shí)時(shí)內核并不復雜,就是讓這個(gè)實(shí)時(shí)內核在自己的目標板上跑起來(lái)。開(kāi)始時(shí),可以運行一些簡(jiǎn)單的任務(wù)和時(shí)鐘節拍中斷任務(wù),如果調試成功就可以在上面添加應用程序。
μC/OS-II移植完成以后,就要在這個(gè)實(shí)時(shí)內核之上編寫(xiě)接口驅動(dòng)程序。由于嵌入式操作系統體積更小,功能更強,且快速、穩定,更具有針對性,因此不像其它操作系統那樣,對系統的所有接口設備都需要驅動(dòng)、管理、調度和監視。由于嵌入式產(chǎn)品是針對特殊的用途而設計的,有很強的專(zhuān)一性,因此,在編寫(xiě)驅動(dòng)程序時(shí)內容更精簡(jiǎn),更具有穩定性,編寫(xiě)出的驅動(dòng)模塊更小。編寫(xiě)驅動(dòng)程序應完成以下基本功能:①對設備初始化和釋放;②把數據從內核傳送到硬件和從硬件讀取數據;③讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據;④檢測和處理設備出現的錯誤。實(shí)現了以上功能以后,一個(gè)嵌入式操作系統就基本構成了。
完成了μC/OS-II的移植和驅動(dòng)程序的編寫(xiě)以后,利用操作系統提供的API函數編寫(xiě)應用程序,調用μC/OS-II中與應用程序相關(guān)的系統服務(wù)。調試通過(guò)后,固化到目標板上,這個(gè)嵌入式應用軟件就完成了。
評論