摘要:嵌入式操作系統(tǒng)的移植是設(shè)計(jì)開(kāi)發(fā)的重要一環(huán),文章從全局和細(xì)節(jié)上分別研究了UCOS-II移植過(guò)程中的技術(shù)要點(diǎn),并著重從移植后代碼的可靠性、健壯性和通用性等方面進(jìn)行了研究。
關(guān)鍵詞:嵌入式;操作系統(tǒng)移植;UCOS
中圖分類(lèi)號(hào):TP316文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1006-8937(2012)05-0068-01
由于基于ARM7內(nèi)核的各種芯片之間有著很大的差異,這些差異主要表現(xiàn)在存儲(chǔ)系統(tǒng)不同、片內(nèi)外設(shè)不同、中斷源不同等。這就造成了嵌入式操作系統(tǒng)移植的不可避免性,而嵌入式操作系統(tǒng)移植效果的優(yōu)劣直接影響著目標(biāo)系統(tǒng)的整體質(zhì)量。文中采用LPC2000系列ARM7微控制器以及ADS編譯器對(duì)UCOS-II的移植過(guò)程進(jìn)行了測(cè)試研究。
1UC/OS-II的移植步驟
UC/OS-II是一個(gè)占先式的實(shí)時(shí)多任務(wù)內(nèi)核,由ANSI C語(yǔ)言編寫(xiě),包含小部分匯編代碼供不同架構(gòu)的處理器使用,能夠管理64個(gè)任務(wù),主要系統(tǒng)功能包括:內(nèi)存塊管理、任務(wù)管理、消息隊(duì)列管理、信號(hào)量、互斥信號(hào)量、事件標(biāo)志組、消息郵箱等。從移植UCOS-II的過(guò)程來(lái)看,邏輯上可分作三大組成部分:與處理器無(wú)關(guān)的內(nèi)核代碼、與處理器有關(guān)的核心代碼、與軟硬件環(huán)境設(shè)置有關(guān)的配置代碼。其中與處理器無(wú)關(guān)的內(nèi)核代碼主要包括OS_CORE.C、OS_FLAG.C、OS_MBOX.C、OS_MEM.C、OS_MUTEX.C、OS_Q.C、OS_SEM.C、OS_TASK.C、OS_TIME.C、UCOS_II.C、UCOS_II.H,它們主要實(shí)現(xiàn)任務(wù)管理、信號(hào)量、內(nèi)存管理、消息隊(duì)列、系統(tǒng)調(diào)度等功能;與處理器有關(guān)的核心代碼主要包括OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C,它們主要與操作系統(tǒng)的移植相關(guān);與軟硬件環(huán)境設(shè)置有關(guān)的配置代碼主要包括OS_CFG.H、INCLUDES.H,它們主要用于剪裁和設(shè)置操作系統(tǒng)。以上文件名為UCOS-II的默認(rèn)設(shè)置,無(wú)須嚴(yán)格按照上述名稱(chēng)命名文件。
由UCOS-II的邏輯結(jié)構(gòu)可以看出,其移植工作主要集中在與處理器有關(guān)的核心代碼部分。實(shí)際測(cè)試中遵循了如下步驟。第一,對(duì)OS_CPU.H進(jìn)行移植,這部分工作主要包括:首先定義與處理器有關(guān)的數(shù)據(jù)類(lèi)型,如BOOLEAN、INT8U、INT8S等;其次進(jìn)行與處理器有關(guān)的宏定義主要包括OS_ENTER_CRITICAL以及OS_EXIT_CRITICAL;再次編寫(xiě)軟中斷函數(shù)主要包括OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。第二,對(duì)OS_CPU_A.ASM進(jìn)行移植,依據(jù)ADS編譯器擴(kuò)展名規(guī)則將文件名改為OS_CPU_A.S,主要工作是編寫(xiě)4個(gè)匯編語(yǔ)言函數(shù),名稱(chēng)為OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。USOS-II啟動(dòng)時(shí)調(diào)用OSStart(),而OSStart()又調(diào)用OSStartHighRdy()運(yùn)行優(yōu)先級(jí)最高的任務(wù)。第三,移植OS_CPU.H。在OS_CPU_C.C文件中,需要編寫(xiě)以下10個(gè)C函數(shù),名稱(chēng)分別為OSTaskStkInit()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskIdleHook()、OSTaskStatHook()、OSTaskTickHook()、OSInitHookBegin()、OSInitHookEnd()、OSTCBInitHook()。任務(wù)堆棧初始化函數(shù)OSTaskStkInit的定義按照移植時(shí)規(guī)定的堆棧結(jié)構(gòu)進(jìn)行,其他九個(gè)函數(shù)按照設(shè)計(jì)要求編寫(xiě),或者為空。
2UCOS-II移植的技術(shù)要點(diǎn)
2.1數(shù)據(jù)類(lèi)型的處理
在C語(yǔ)言中常用的int、short等數(shù)據(jù)類(lèi)型與處理器類(lèi)型密切相關(guān),這就意味著采用上述類(lèi)型定義后的程序本身具有不可移植性,為此在代碼編寫(xiě)中需要采用移植性強(qiáng)的數(shù)據(jù)類(lèi)型進(jìn)行替換,因此這些數(shù)據(jù)類(lèi)型定義也便成了代碼移植工作的一部分,當(dāng)然依編譯器的選擇不同也會(huì)略有差異,在ADS編譯器中部分相關(guān)參考代碼如下:
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned short INT16U;
typedef signed short INT16S;
typedef unsigned int INT32U;
typedef signed int INT32S;
2.2任務(wù)與函數(shù)調(diào)用的封裝
ARM7內(nèi)核具有7中工作模式,帶T后綴的具有兩套指令集,在提升處理器功能和效率的同時(shí)也帶來(lái)了復(fù)雜性。在移植過(guò)程中應(yīng)設(shè)法編制接口函數(shù)將底層復(fù)雜性與操作系統(tǒng)層的管理和應(yīng)用隔離開(kāi),為了達(dá)到這個(gè)目的可以采用軟件終端SWI(software interruption),而且在ADS編譯器中也提供了相應(yīng)的支持,即__swi關(guān)鍵字。采用該關(guān)鍵字聲明一個(gè)莫須有的函數(shù),調(diào)用時(shí)則在該處插入SWI指令,且可以設(shè)定中斷功能編號(hào),以及完成參數(shù)傳遞等。比如:
__swi(0x00) void OS_TASK_SW(void)/*任務(wù)切換函數(shù)*/
__swi(0x00) void _ OSStartHighRdy(void) /*運(yùn)行頂級(jí)優(yōu)先任務(wù)*/
__swi(0x00) void _ OS_ENTER_CRITICAL (void) /*關(guān)中*/
__swi(0x00)void_OS_EXIT_CRITICAL(void)/*開(kāi)中*/
2.3中斷服務(wù)的切換
如果在OS_CPU.H做過(guò)相應(yīng)的聲明,采用OS_TASK_SW函數(shù)切換任務(wù),則函數(shù)OSCtxSw是可以省略的,所以通常情況下OSCtxSw并不是移植初期需要關(guān)注的要點(diǎn)。前文提到基于ARM7的不同芯片之間的中斷系統(tǒng)存在差異,這就要求移植后的操作系統(tǒng)要保證目標(biāo)機(jī)的中斷系統(tǒng)穩(wěn)定運(yùn)行保障系統(tǒng)的可靠性。而在中斷服務(wù)程序中切換任務(wù)時(shí)需要調(diào)用函數(shù)OSIntCtxSw,因此OS_CPU_A.S的移植要點(diǎn)在與保證OSIntCtxSw準(zhǔn)確性,其代碼主要任務(wù)包括保護(hù)現(xiàn)場(chǎng)、將當(dāng)前任務(wù)堆棧指針保存到對(duì)應(yīng)的任務(wù)控制塊TCB(task control block)、獲取新任務(wù)的堆棧指針等。OS_CPU_A.S中的__ OSStartHighRdy()與之存在調(diào)用關(guān)系,OSStartHighRdy()須在OS_CPU_C.C中定義。部分相關(guān)代碼如下:
OSIntCtxSw_OSHR
獲取新任務(wù)堆棧指針
LDR R4,[R6]
ADD SP,R4,#68;
LDR LR,[SP, #-8]
MSR CPSR_c,#(NoInt|SVC32Mode);切換至管理模式
MOV SP,R4;設(shè)置堆棧指針
LDMFD SP!,{R4, R5};CPSR,關(guān)中次數(shù)
恢復(fù)新任務(wù)的關(guān)中計(jì)數(shù)器
LDR R3,=IECounter;為關(guān)中計(jì)數(shù)器分配寄存器
STR R4,[R3]
MSR SPSR_cxsf,R5;恢復(fù)CPSR
LDMFD SP!,{R0-R12, LR, PC }^;運(yùn)行新任務(wù)
關(guān)中計(jì)數(shù)器為全局變量,不同的任務(wù)由各自的關(guān)中計(jì)數(shù)器,在任務(wù)切換時(shí)分別堆?;ゲ挥绊懀瑥亩綦x了任務(wù)切換時(shí)可能造成的相互影響。
3結(jié)語(yǔ)
嵌入式操作系統(tǒng)的移植往往是影響全局且復(fù)雜性較強(qiáng)的工作。這類(lèi)系統(tǒng)的移植也必然要建立在移植者對(duì)整體軟硬件系統(tǒng)有深入準(zhǔn)確的掌握基礎(chǔ)之上。文中針對(duì)UCOS-II結(jié)合ARM7內(nèi)核處理器以及ADS編譯器測(cè)試并總結(jié)了移植的步驟和部分技術(shù)要點(diǎn),此類(lèi)工作需要豐富的實(shí)踐和理論研究才能日臻完善。文中所論有很多不足之處和不全面的地方,需要在日后的實(shí)踐中不斷更正總結(jié)。
參考文獻(xiàn):
[1] 武國(guó)平,史儀凱.ARM7處理器Bootloader的設(shè)計(jì)與實(shí)現(xiàn)[J].
微處理機(jī),2010,(5).
[2] 周立功.ARM嵌入式系統(tǒng)基礎(chǔ)教程[M].北京:北京航空航
天大學(xué)出版社,2006.
[3] 寧杰城,王春,周新志.ARM7內(nèi)核上的uC/OS—II嵌入式系
統(tǒng)移植[J].中國(guó)測(cè)試技術(shù),2005,(2).