相關(guān)鏈接: 北京安全網(wǎng) 北京質(zhì)量網(wǎng) 北京論文網(wǎng) 北京資訊網(wǎng)
摘要:當(dāng)前,傳統(tǒng)的前后臺(tái)系統(tǒng)已成為阻礙嵌入式系統(tǒng)發(fā)展的一大瓶頸,嵌入式操作系統(tǒng)的使用,能夠簡(jiǎn)化嵌入式系統(tǒng)的應(yīng)用開發(fā),有效地確保系統(tǒng)的實(shí)時(shí)性和穩(wěn)定性。本文以此為背景,闡述了嵌入式操作系統(tǒng)µc/OS -Ⅱ移植到基于ARM7的S3C44B0X芯片移植過程。最終使嵌入式系統(tǒng)開發(fā)平臺(tái)得以實(shí)現(xiàn)。
論文關(guān)鍵詞:嵌入式,S3C44B0X,實(shí)時(shí)內(nèi)核µc/OS-Ⅱ,移植
是非常必要的。而操作系統(tǒng)是一個(gè)通用的程序,要在自己的嵌入式系統(tǒng)中應(yīng)用它,必須結(jié)合所用處理器的不同進(jìn)行相應(yīng)邊編寫或改寫。本文結(jié)合實(shí)例,對(duì)基于S3C44B0X的嵌入式操作系統(tǒng)µc/0S-Ⅱ平臺(tái)的實(shí)現(xiàn)的移植過程進(jìn)行研究,最后通過測(cè)試,驗(yàn)證了嵌入式開發(fā)平臺(tái)的成功實(shí)現(xiàn)。
1、 實(shí)時(shí)內(nèi)核µc/OS-Ⅱ
µc/OS-Ⅱ,是一個(gè)可固化、可裁剪、占先式的實(shí)時(shí)多任務(wù)操作系統(tǒng),它運(yùn)行就緒狀態(tài)下優(yōu)先級(jí)最高的任務(wù),絕大部分源代碼是用便于移植的C語言編寫,小部分匯編語言代碼已被壓縮到最低限度,使之可供不同構(gòu)架的微處理器上使用[3]。µc/OS -Ⅱ所具有源代碼公開、執(zhí)行效率高、占用空間小等特點(diǎn)受到廣大用戶的青睞。
2 μC/ OS - II 在S3C44B0X上的移植
移植就是指使一個(gè)實(shí)時(shí)內(nèi)核能在其它微處理器或微控制器上運(yùn)行。本文采用S3C44B0X芯片,開發(fā)環(huán)境采用Keil uVision3 ,基本滿足開發(fā)要求。S3C44BOX是一款基于ARM7的SOC芯片。該芯片片上功能強(qiáng)大,技術(shù)成熟,具有低成本、低功耗、高性能等優(yōu)點(diǎn)[1]。
移植工作主要集中在與處理器相關(guān)的3個(gè)文件中[2]:OS_CPU.H 、OS_ CPU_ C. C 、OS_ CPU_A.S。其中:OS_ CPU.H 文件主要包含與編譯器相關(guān)的數(shù)據(jù)類型定義、堆棧類型定義、兩個(gè)宏定義和幾個(gè)函數(shù)說明;OS_ CPU_ C. C 包含與移植有關(guān)6個(gè)C函數(shù),為OSTaskStkInit(), OSTaskCreateHook(),OSTaskDelHook(),OSTaskSwHook(),OSTaskStatHook(),OSTimeTick_
Hook(),其中后面5個(gè)函數(shù)為鉤子函數(shù),可以沒有實(shí)際內(nèi)容, 但必須要聲明,用于擴(kuò)充自己需要的功能。OS_CPU_A.S 中包含與移植有關(guān)的4個(gè)匯編語言函數(shù),為OSStartHigh()、OSCtxSW()
、OSIntCtxSw(),OSTickISR()。
2.1 OS_CPU. H文件移植
此文件中主要包含與編譯器相關(guān)數(shù)據(jù)類型定義、堆棧類型定義、兩個(gè)宏定義和幾個(gè)函數(shù)說明。數(shù)據(jù)類型定義部分代碼如下[3]:
typedef unsigned short INT16U; /*16位有符號(hào)整數(shù)*/
typedef unsigned long INT32U; /*32位無符號(hào)整數(shù)*/
typedef unsigned int OS_STK;/*堆棧入口寬度為16位*/
#define OS_STK_GROWTH 1 /*堆棧增長(zhǎng)方向從上向下滿遞減堆棧*/
#define OS_ENTER_CRITICAL() {cpu_sr =OS_CPU_SR_Save();}/*關(guān)中斷,執(zhí)行臨界代碼*/
#define OS_EXIT_CRITICAL() { OS_CPU_SR_Restore (cpu_sr);}/*開中斷*/
在本例移植中,使用軟中斷指令SWI作為底層接口,使用不同功能號(hào)區(qū)分不同函數(shù)。用關(guān)鍵字_swi 聲明一個(gè)不存在的函數(shù),則調(diào)用該函數(shù)就在調(diào)用的地方插入一條SWI指令并可指定功能號(hào)。SWI函數(shù)部分代碼如下[3]:
_swi(0x00) void OS_TASK_SW(void); /*任務(wù)級(jí)任務(wù)切換函數(shù)*/
_swi(0x01) void_OSStartHighRdy( void);/ *運(yùn)行優(yōu)先級(jí)最高的任務(wù)*/
_swi(0x02) void OS_ENTER_CRITICAL(void) ; /*關(guān)中斷* /
_swi(0x03) void OS_EXIT_CRITICAL(void) ; / * 開中斷* /
2.2 OS_CPU_C. C 文件移植
µc/OS-Ⅱ中,每個(gè)任務(wù)要有自己的堆?臻g,以便進(jìn)行任務(wù)切換時(shí)保存和恢復(fù)現(xiàn)場(chǎng)。因此必先確定任務(wù)堆棧結(jié)構(gòu),而任務(wù)堆棧結(jié)構(gòu)與CPU體系結(jié)構(gòu)、編譯器密切關(guān)聯(lián)。
OSTaskStkInit() 函數(shù)關(guān)鍵代碼如下:
*--stk=(unsigned int)task; /*pc*/
*--stk=(unsigned int)task /*lr*/
*--stk=0; /*r12.....r1,其它同理*/
*--stk=(unsigned int)pdata; /*r0,第一個(gè)參數(shù)用r0傳遞*/
*--stk=(SVC32MODE|0x0|); /* cpsr 關(guān)閉irq,fiq*/
*--stk=(SVC32MODE|0x0); /*spsr IRQ,關(guān)閉FIQ*/
return((OS_STK *)stk);/*堆棧指針保存在任務(wù)的OS_TCB中*/
此文件中的幾個(gè)系統(tǒng)規(guī)定的hook函數(shù)在本移植均將它們都設(shè)置為空函數(shù)。
2.3 OS_CPU_ A. S 文件移植
此文件中需要編寫4 個(gè)匯編語言函數(shù)[3]:
OSStartHighRdy()、OSCtxSw()、OSIntCtxSw( )、OSTickISR( )。
多任務(wù)啟動(dòng)函數(shù)OSStart( )調(diào)用OSStartHightRdy( )函數(shù), 運(yùn)行優(yōu)先級(jí)最高的任務(wù)。OSCtxSw()函數(shù)是由任務(wù)級(jí)任務(wù)切換函數(shù)OS_TASK_SW()調(diào)用,實(shí)現(xiàn)從低優(yōu)先級(jí)向高優(yōu)先級(jí)切換。文中任務(wù)級(jí)切換是通過SWI軟中斷來實(shí)現(xiàn)的。軟中斷的異常處理程序掛接到CPU內(nèi)核,通過修改啟動(dòng)代碼里的異常向量表實(shí)現(xiàn)。中斷服務(wù)程序與CPU 芯片相關(guān),中斷源的掛接通過增加匯編接口的支持來實(shí)現(xiàn),即在文件IRQ.S的適當(dāng)位置添加如下的程序代碼[2]:
IRQ.Handler HANDL ER IRQ.Exception ; IRQ 中斷
OSIntCtxSw()是中斷級(jí)任務(wù)切換函數(shù),在中斷退出時(shí)由函數(shù)OSIntExit()調(diào)用。此函數(shù)基本原理與任務(wù)級(jí)切換相同,只是由于進(jìn)入中斷時(shí)已保存了被中斷任務(wù)的環(huán)境變量,就不進(jìn)行類似操作,只需要對(duì)堆棧指針進(jìn)行調(diào)整即可。
部分代碼如下:
LDR r4,addr_OSTCBCur;/*得到當(dāng)前任務(wù)的TCB地址*/
LDR r5,addr_OSTCBHighRdy;/*得到高優(yōu)先級(jí)任務(wù)的TCB地址*/
LDR r5,[r5];/*得到堆棧指針*/
LDR sp,[r5];/*切換到新的堆棧*/
STR r5,[r4];/*設(shè)置新的當(dāng)前任務(wù)的TCB地址*/
LDMFD sp!,{r4} /*新任務(wù)cpsr出棧*/
MSR CPSR_cxsf,r4
LDMFD sp!,{r0-r12,lr,pc}^;/*r0-r12,lr&pc出棧,運(yùn)行新任務(wù)*/
系統(tǒng)時(shí)鐘節(jié)拍中斷函數(shù)OSTickISR()為內(nèi)核提供時(shí)鐘節(jié)拍。其周期決定了內(nèi)核所能給應(yīng)用系統(tǒng)提供的最小時(shí)間間隔服務(wù)。本移植中,IRQ是受μC/OS-II管理的中斷,對(duì)FIQ不處理。時(shí)鐘節(jié)拍的移植可通過匯編宏完成。
完成上述工作后,μC/OS-II就可以運(yùn)行在ARM處理器上了。
3 移植測(cè)試
測(cè)試操作系統(tǒng)移植代碼的正確性可以在沒有應(yīng)用程序的情況下進(jìn)行,即讓內(nèi)核自己測(cè)試自己。筆者通過以下測(cè)試用例,經(jīng)過編譯、鏈接及下載到目標(biāo)板中。驗(yàn)證系統(tǒng)移植是成功的。
void OSTaskIdleHook (void)
{
static i=0;
if(i%20000==0) /*每20000次點(diǎn)亮一個(gè)LED,*/
{
sysUtilsLightLed(LED_ALL,FALSE); /*關(guān)閉所有的LED */
sysUtilsLightLed(i%3+1,TRUE); /*循環(huán)點(diǎn)亮一個(gè)LED*/
}
i++;
return ;
}
4 結(jié)語
μC/OS-II 是一個(gè)具有良好應(yīng)用前景的嵌入式實(shí)時(shí)內(nèi)核,本文通過具體事例,成功實(shí)現(xiàn)了μC/OS-II在S3C44B0X上的移植。通過簡(jiǎn)單的測(cè)試用例,驗(yàn)證了移植是正確的,此成功移植為μC/OS-II 嵌入式實(shí)時(shí)系統(tǒng)的復(fù)雜應(yīng)用,提供了基本的條件。
參考文獻(xiàn):
[1] Samsung Electronics Co. Ltd. S3C44B0 322BIT RISC MICROPRO2CESSOR USER’S MANUAL
[2] 杜春雷. ARM體系結(jié)構(gòu)與編程[M ]. 北京:清華大學(xué)出版社, 2003
[3] 黃燕平著. µC/OS ARM 移植要點(diǎn)詳解.北京:北京航空航天大學(xué)出版社.2005