疏國(guó)會(huì),金 鑫
SHU Guo-hui, JIN Xin
(安慶職業(yè)技術(shù)學(xué)院,安慶 246008)
嵌入式系統(tǒng)具有很高的先進(jìn)性,它綜合了多種高新技術(shù),包括計(jì)算機(jī)技術(shù)和電子技術(shù)以及半導(dǎo)體技術(shù)等,是多種技術(shù)結(jié)合的產(chǎn)物。日常生活的點(diǎn)滴都滲透了嵌入式系統(tǒng),大大方便了人們的生活、豐富了人們的精神世界。它的應(yīng)用領(lǐng)域非常廣闊,大到工業(yè)、服務(wù)業(yè),小到人們的日常娛樂(lè)活動(dòng),并且隨著經(jīng)濟(jì)的發(fā)展,嵌入式系統(tǒng)的應(yīng)用范圍更加擴(kuò)大。從專業(yè)的角度我們定義嵌入式系統(tǒng)為把計(jì)算機(jī)作為基礎(chǔ)技術(shù),將應(yīng)用作為中心,可裁減軟硬件的,具備應(yīng)用系統(tǒng)要求的功能、功耗、成本等要求的專用計(jì)算機(jī)系統(tǒng)。嵌入式系統(tǒng)有三個(gè)主要的特征,分別是較強(qiáng)的專用性、精簡(jiǎn)的系統(tǒng)和具有較小的內(nèi)核。嵌入式系統(tǒng)對(duì)軟件的要求很高,符合要求的軟件必須具有很高的高實(shí)時(shí)性,另外軟件必須具備高質(zhì)量和可靠性。我們需要專門的工具和環(huán)境對(duì)嵌入式系統(tǒng)進(jìn)行開發(fā)[1]。
嵌入式μC/OS的體系結(jié)構(gòu)比較簡(jiǎn)單,所以大部分使用的是C語(yǔ)言進(jìn)行編程,大部分的友好界面的編譯器都能夠生成編譯的目標(biāo)代碼,友好的編譯器有Borland C、Keil等。嵌入式μC/OS的體系的內(nèi)核可以很小,小到幾十KB的都有,所以它在移植時(shí)支持體系結(jié)構(gòu)多種多樣的微處理器。這樣留給用戶的工作就很少了,由于源代碼是開放的這就方便了學(xué)習(xí)。μC/OS-II有幾大組成部分,分別是:核心部分(OSCore.c),這是操作系統(tǒng)的處理核心,它又包括了多個(gè)組成部分,主要有操作系統(tǒng)初始化、中斷進(jìn)出的前導(dǎo)、任務(wù)調(diào)度等。任務(wù)處理部分(OSTask.c)的操作是用來(lái)完成任務(wù)的,它又包括了建立任務(wù)、刪除任務(wù)、掛起任務(wù)、恢復(fù)任務(wù)等。時(shí)鐘部分(OSTime.c)主要用來(lái)完成延時(shí)任務(wù)等。
嵌入式系統(tǒng)包括兩大部分,分別是硬件部分和軟件部分。嵌入式系統(tǒng)的主要特性如下:
1)其系統(tǒng)采用的是公開的源代碼,這也是它最大的特點(diǎn),在這一點(diǎn)上超越了其它的商業(yè)實(shí)時(shí)內(nèi)核。源代碼開放的好處是為在不同硬件平臺(tái)上移植操作系統(tǒng)提供了很大的便利。
2)嵌入式系統(tǒng)的可移植性能非常好,μC/OS的嵌入式系統(tǒng)源代碼大量采用了ANSI C進(jìn)行編寫,所以具有很強(qiáng)的可移植性,另外采用匯編語(yǔ)言編寫了和微處理硬件有關(guān)的部分,這樣的目的是方面了μC/OS的嵌入式系統(tǒng)的移植,可以適應(yīng)8、16、32位等。
3)嵌入式應(yīng)用和μC/OS的聯(lián)系十分緊密,因?yàn)楹笳呤沁m應(yīng)前者而設(shè)計(jì)的,所以可固化。開發(fā)者需要擁有一些固化手段,包括編譯、下載等就可以使μC/OS嵌入到產(chǎn)品中。
4)可以進(jìn)行裁減,對(duì)于μC/OS的嵌入式系統(tǒng)中不被需要的東西可以進(jìn)行裁減,只選取有用的應(yīng)用程序,這樣一來(lái)μC/OS所需的存儲(chǔ)空間就會(huì)得到釋放。
5)μC/OS的嵌入式系統(tǒng)的另一個(gè)特色就是占先式和多任務(wù)。級(jí)最高的任務(wù)在μC/OS的嵌入式系統(tǒng)中是被優(yōu)先運(yùn)行的,不過(guò)輪轉(zhuǎn)法的任務(wù)調(diào)度還是不被支持的,實(shí)時(shí)內(nèi)核是完全占先式的[2]。
6)其它特性,包括系統(tǒng)服務(wù)、穩(wěn)定性、可確定性等都是μC/OS的嵌入式系統(tǒng)具有很大吸引力的原因,對(duì)于安全要求很高的系統(tǒng)來(lái)說(shuō)μC/OS的嵌入式系統(tǒng)是一個(gè)不錯(cuò)的選擇。另外值得一提的是μC/OS中每個(gè)任務(wù)有獨(dú)立的棧,對(duì)于任務(wù)的獨(dú)立??臻g是允許的[3]。
在嵌入式系統(tǒng)的開發(fā)之前我們需要構(gòu)建一個(gè)平臺(tái)進(jìn)行開發(fā),μC/OS系統(tǒng)并不提供開發(fā)平臺(tái),它提供的只是調(diào)度任務(wù)的內(nèi)核。內(nèi)核的作用是提供軟件系統(tǒng)的基礎(chǔ),如果想開發(fā)一個(gè)實(shí)用完整的操作系統(tǒng)需要首先進(jìn)行μC/OS的移植,將其移植到微處理器上之后擴(kuò)展操作系統(tǒng),然后得到一個(gè)符合標(biāo)準(zhǔn)的操作系統(tǒng)之后才能對(duì)應(yīng)用程序進(jìn)行開發(fā)。
微處理器上移植有μC/OS是內(nèi)核正常運(yùn)轉(zhuǎn)的前提,只有內(nèi)核正常運(yùn)行起來(lái)才能進(jìn)一步擴(kuò)展。μC/OS進(jìn)行移植的例子不少了,所以可修改現(xiàn)有的這些移植代碼,這需要結(jié)合自己選擇的微處理器。微處理器需要滿足一定條件才能夠進(jìn)行μC/OS的移植,例如C編譯器可產(chǎn)生重入編碼、允許打開和中斷C編譯器等。
本文中的例子是S a m s u n g公司的ARM7TDMI,通過(guò)它來(lái)進(jìn)行μC/OS的移植,其中移植主要是對(duì)OS-CPU.H.OS、OS-CPU-A.ASM和OS-CPU-C.C這三個(gè)文件的數(shù)據(jù)和參數(shù)進(jìn)行改寫,目的就是進(jìn)行移植。
2.1.1 對(duì)OS-CPU-C.C進(jìn)行修改
所有和移植有關(guān)聯(lián)的C函數(shù)都在OS-CPU-C.C中,和操作系統(tǒng)相關(guān)的6個(gè)函數(shù)編寫語(yǔ)言為C語(yǔ)言。這6個(gè)函數(shù)分別是5個(gè)鉤子函數(shù)和一個(gè)堆棧初始化,后者是必要的函數(shù),剩下的5個(gè)函數(shù)需要聲
明,不過(guò)任何代碼可以省略。
2.1.2 對(duì)OS-CPU-A.ASM的修改
OS-CPU-A.ASM中的4個(gè)關(guān)聯(lián)處理器的函數(shù)由匯編語(yǔ)言編寫,這4個(gè)函數(shù)是OSStartHighRdy()、OSCtxSw()、OSTickISR()、OSInitCtxSw()。這4個(gè)函數(shù)各有分工,例如可以運(yùn)行優(yōu)先級(jí)別的最高級(jí)的任務(wù)的函數(shù)是OSStartHighRdy();當(dāng)前任務(wù)TCB的地址可以由LDRr4.addr-OSTCBCur.獲得;LDRsp[r5]可以切換到新堆棧。再編寫幾個(gè)相關(guān)函數(shù)就完成了OS-CPU-A.ASM的移植工作。
2.1.3 修改OS-CPU.H
設(shè)置OS-CPU.H代碼和ARM具有相關(guān)性,并設(shè)置數(shù)據(jù)類型和編譯器保持相關(guān)性。
對(duì)ARM中的數(shù)據(jù)類型進(jìn)行定義:
#de fi ne unsigned char BOOLEAN;
#de fi ne unsigned char INT8U /*8位無(wú)符號(hào)整數(shù)*/
#de fi ne signed char INT8S /*8位有符號(hào)整數(shù)*/
#de fi ne unsigned char INT16U /*16位無(wú)符號(hào)整數(shù)*/
#de fi ne signed int INT8S /*16位有符號(hào)整數(shù)*/
#de fi ne unsigned long INT32U /*32位無(wú)符號(hào)整數(shù)*/
#de fi ne signed long INT32S /*32位有符號(hào)整數(shù)*/
#de fi ne fl oat FP32 /*單精度浮點(diǎn)數(shù)*/
#de fi ne double FP64 /*雙精度浮點(diǎn)數(shù)*/
定義16位的ARM的數(shù)據(jù)類型為typed unsigned int OS-STK。
μC/OS只有完成了以上三個(gè)方面的移植才能夠在ARM的微處理器上運(yùn)行正常。完成移植工作后需要?jiǎng)澐窒到y(tǒng)任務(wù)、配置存儲(chǔ)的空間和實(shí)現(xiàn)任務(wù)的調(diào)度[4]。
μC/OS是一個(gè)內(nèi)核,它可以執(zhí)行實(shí)時(shí)多任務(wù),但是僅僅有μC/OS還是不夠的,不能實(shí)現(xiàn)完整的嵌入式系統(tǒng),如果想擁有完整實(shí)用的操作系統(tǒng)還需要進(jìn)行除了移植以外的擴(kuò)展工作。擴(kuò)展指的是文件系統(tǒng)的建立和建立外部設(shè)備驅(qū)動(dòng)、對(duì)有關(guān)的API函數(shù)進(jìn)行規(guī)范化、GUI函數(shù)的創(chuàng)建等等。

表1 用戶程序結(jié)構(gòu)
μC/OS系統(tǒng)是沒(méi)有文件系統(tǒng)的,而嵌入式系統(tǒng)是需要使用文件系統(tǒng)的,這就意味著我們要建立一個(gè)文件系統(tǒng)。文件系統(tǒng)的建立過(guò)程是首先對(duì)文件系統(tǒng)進(jìn)行初始化,接下來(lái)打開一個(gè)系統(tǒng)的指定文件,然后對(duì)文件進(jìn)行讀取和寫入,最后關(guān)閉文件,將緩沖釋放,這就是實(shí)現(xiàn)文件系統(tǒng)的過(guò)程。實(shí)現(xiàn)文件系統(tǒng)的過(guò)程中必須要首先用intOSFile()函數(shù)來(lái)對(duì)系統(tǒng)文件進(jìn)行初始化,這樣做的目的是分配合理的文件結(jié)構(gòu)空間。系統(tǒng)的文件打開采用OpenOSFile()來(lái)打開,對(duì)打開模式進(jìn)行指定然后進(jìn)行FILE結(jié)構(gòu)的創(chuàng)建,分配文件讀取的緩沖區(qū)。文件的緩沖區(qū)數(shù)據(jù)由ReadOSFile()來(lái)直接進(jìn)行讀取,如果數(shù)據(jù)為空那么就對(duì)FAT進(jìn)行訪問(wèn),在文件緩沖區(qū)進(jìn)行下一個(gè)簇的讀取。WriteOSFile()負(fù)責(zé)在指定的文件中寫入緩沖區(qū)[5]。
μC/OS是目前流行的、十分優(yōu)秀的嵌入式操作系統(tǒng),它有眾多的優(yōu)點(diǎn),比如實(shí)時(shí)性好并且內(nèi)存的需求很小、具有較好的移植性等。這些優(yōu)點(diǎn)都能夠使開發(fā)的周期減少,對(duì)于開發(fā)嵌入式系統(tǒng)的應(yīng)用程序是十分有利的。在新世紀(jì)嵌入式系統(tǒng)的發(fā)展尤為迅速,隨著嵌入式系統(tǒng)的快速發(fā)展μC/OS的應(yīng)用前景也會(huì)越來(lái)越廣闊[6]。
[1] 陳渝,李明,楊曄.源碼開放的嵌入式系統(tǒng)軟件分析與實(shí)踐—基于SkyEye和ARM開發(fā)平臺(tái)[M].中國(guó)電力出版社.2004.
[2] Bruce Powel Douglass,柳翔.嵌入式與實(shí)時(shí)系統(tǒng)開發(fā)[M].中國(guó)電力出版社.2005.
[3] 毛德操,胡希明.嵌入式系統(tǒng)—采用公開源代碼和Strong ARM/Xscale處理器[M].清華大學(xué)出版社,2003.
[4] 王田苗.嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)[M].清華大學(xué)出版社,2002.
[5] 楊柳,盧清萍.嵌入式系統(tǒng)與Nios[J].安徽工程科技學(xué)院學(xué)報(bào)(自然科學(xué)版);2005,(02).
[6] 白智國(guó),王芳,馮丹.嵌入式系統(tǒng)移植問(wèn)題的研究[J].計(jì)算機(jī)工程與科學(xué).2005,(06).