C語(yǔ)言編程程序優(yōu)化方案
在C語(yǔ)言中,宏是產(chǎn)生內(nèi)嵌代碼的唯一方法。對(duì)于嵌入式系統(tǒng)而言,為了能達(dá)到性能要求,宏是一種很好的代替函數(shù)的方法。
寫一個(gè)“標(biāo)準(zhǔn)”宏MIN ,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè):
錯(cuò)誤做法:
#define MIN(A,B) ( A 《= B ? A : B )
正確做法:
#define MIN(A,B) ((A)《= (B) ? (A) : (B) )
對(duì)于宏,我們需要知道三點(diǎn):
?。?)宏定義“像”函數(shù);
?。?)宏定義不是函數(shù),因而需要括上所有“參數(shù)”;
(3)宏定義可能產(chǎn)生副作用。
下面的代碼:
least = MIN(*p++, b);
將被替換為:
?。?(*p++) 《= (b) ?(*p++):(b) )
發(fā)生的事情無(wú)法預(yù)料。
因而不要給宏定義傳入有副作用的“參數(shù)”。
使用寄存器變量
當(dāng)對(duì)一個(gè)變量頻繁被讀寫時(shí),需要反復(fù)訪問(wèn)內(nèi)存,從而花費(fèi)大量的存取時(shí)間。為此,C語(yǔ)言提供了一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時(shí),不需要訪問(wèn)內(nèi)存,而直接從寄存器中讀寫,從而提高效率。寄存器變量的說(shuō)明符是register。對(duì)于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量,而循環(huán)計(jì)數(shù)是應(yīng)用寄存器變量的最好候選者。
?。?) 只有局部自動(dòng)變量和形參才可以定義為寄存器變量。因?yàn)榧拇嫫髯兞繉儆趧?dòng)態(tài)存儲(chǔ)方式,凡需要采用靜態(tài)存儲(chǔ)方式的量都不能定義為寄存器變量,包括:模塊間全局變量、模塊內(nèi)全局變量、局部static變量;
?。?) register是一個(gè)“建議”型關(guān)鍵字,意指程序建議該變量放在寄存器中,但最終該變量可能因?yàn)闂l件不滿足并未成為寄存器變量,而是被放在了存儲(chǔ)器中,但編譯器中并不報(bào)錯(cuò)(在C++語(yǔ)言中有另一個(gè)“建議”型關(guān)鍵字:inline)。
下面是一個(gè)采用寄存器變量的例子:
/* 求1+2+3+….+n的值 */
{
register i,s=0;
for(i=1;i《=n;i++)
return s;
}
本程序循環(huán)n次,i和s都被頻繁使用,因此可定義為寄存器變量。
內(nèi)嵌匯編
程序中對(duì)時(shí)間要求苛刻的部分可以用內(nèi)嵌匯編來(lái)重寫,以帶來(lái)速度上的顯著提高。但是,開發(fā)和測(cè)試匯編代碼是一件辛苦的工作,它將花費(fèi)更長(zhǎng)的時(shí)間,因而要慎重選擇要用匯編的部分。
在程序中,存在一個(gè)80-20原則,即20%的程序消耗了80%的運(yùn)行時(shí)間,因而我們要改進(jìn)效率,最主要是考慮改進(jìn)那20%的代碼。
嵌入式C程序中主要使用在線匯編,即在C程序中直接插入_asm{ }內(nèi)嵌匯編語(yǔ)句:
/* 把兩個(gè)輸入?yún)?shù)的值相加,結(jié)果存放到另外一個(gè)全局變量中 */
int result;
void Add(long a, long *b)
{
_asm
{
MOV AX, a
MOV BX, b
ADD AX, [BX]
MOV result, AX
}
}
利用硬件特性
首先要明白CPU對(duì)各種存儲(chǔ)器的訪問(wèn)速度,基本上是:
CPU內(nèi)部RAM 》 外部同步RAM 》 外部異步RAM 》 FLASH/ROM
對(duì)于程序代碼,已經(jīng)被燒錄在FLASH或ROM中,我們可以讓CPU直接從其中讀取代碼執(zhí)行,但通常這不是一個(gè)好辦法,我們最好在系統(tǒng)啟動(dòng)后將FLASH或ROM中的目標(biāo)代碼拷貝入RAM中后再執(zhí)行以提高取指令速度;
對(duì)于UART等設(shè)備,其內(nèi)部有一定容量的接收BUFFER,我們應(yīng)盡量在BUFFER被占滿后再向CPU提出中斷。例如計(jì)算機(jī)終端在向目標(biāo)機(jī)通過(guò)RS-232傳遞數(shù)據(jù)時(shí),不宜設(shè)置UART只接收到一個(gè)BYTE就向CPU提中斷,從而無(wú)謂浪費(fèi)中斷處理時(shí)間;
如果對(duì)某設(shè)備能采取DMA方式讀取,就采用DMA讀取,DMA讀取方式在讀取目標(biāo)中包含的存儲(chǔ)信息較大時(shí)效率較高,其數(shù)據(jù)傳輸?shù)幕締挝皇菈K,而所傳輸?shù)臄?shù)據(jù)是從設(shè)備直接送入內(nèi)存的(或者相反)。DMA方式較之中斷驅(qū)動(dòng)方式,減少了CPU 對(duì)外設(shè)的干預(yù),進(jìn)一步提高了CPU與外設(shè)的并行操作程度。
活用位操作
使用C語(yǔ)言的位操作可以減少除法和取模的運(yùn)算。在計(jì)算機(jī)程序中數(shù)據(jù)的位是可以操作的最小數(shù)據(jù)單位,理論上可以用“位運(yùn)算”來(lái)完成所有的運(yùn)算和操作,因而,靈活的位操作可以有效地提高程序運(yùn)行的效率。舉例如下:
/* 方法1 */
int i,j;
i = 879 / 16;
j = 562 % 32;
/* 方法2 */
int i,j;
i = 879 》》 4;
j = 562 - (562 》》 5 《《 5);
對(duì)于以2的指數(shù)次方為“*”、“/”或“%”因子的數(shù)學(xué)運(yùn)算,轉(zhuǎn)化為移位運(yùn)算“《《 》》”通??梢蕴岣咚惴ㄐ?。因?yàn)槌顺\(yùn)算指令周期通常比移位運(yùn)算大。
C語(yǔ)言位運(yùn)算除了可以提高運(yùn)算效率外,在嵌入式系統(tǒng)的編程中,它的另一個(gè)最典型的應(yīng)用,而且十分廣泛地正在被使用著的是位間的與(&)、或(|)、非(~)操作,這跟嵌入式系統(tǒng)的編程特點(diǎn)有很大關(guān)系。我們通常要對(duì)硬件寄存器進(jìn)行位設(shè)置,譬如,我們通過(guò)將AM186ER型80186處理器的中斷屏蔽控制寄存器的第低6位設(shè)置為0(開中斷2),最通用的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
outword(INT_MASK, wTemp &~INT_I2_MASK);
而將該位設(shè)置為1的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
outword(INT_MASK, wTemp | INT_I2_MASK);
判斷該位是否為1的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
if(wTemp & INT_I2_MASK)
{
… /* 該位為1 */
}
上述方法在嵌入式系統(tǒng)的編程中是非常常見(jiàn)的,我們需要牢固掌握。
總結(jié)
在性能優(yōu)化方面永遠(yuǎn)注意80-20準(zhǔn)備,不要優(yōu)化程序中開銷不大的那80%,這是勞而無(wú)功的。
宏定義是C語(yǔ)言中實(shí)現(xiàn)類似函數(shù)功能而又不具函數(shù)調(diào)用和返回開銷的較好方法,但宏在本質(zhì)上不是函數(shù),因而要防止宏展開后出現(xiàn)不可預(yù)料的結(jié)果,對(duì)宏的定義和使用要慎而處之。很遺憾,標(biāo)準(zhǔn)C至今沒(méi)有包括C++中inline函數(shù)的功能,inline函數(shù)兼具無(wú)調(diào)用開銷和安全的優(yōu)點(diǎn)。
使用寄存器變量、內(nèi)嵌匯編和活用位操作也是提高程序效率的有效方法。
除了編程上的技巧外,為提高系統(tǒng)的運(yùn)行效率,我們通常也需要最大可能地利用各種硬件設(shè)備自身的特點(diǎn)來(lái)減小其運(yùn)轉(zhuǎn)開銷,例如減小中斷次數(shù)、利用DMA傳輸方式等。
如何選擇一個(gè)ARM品牌核心處理器操作系統(tǒng)
ARM公司是世界最大的半導(dǎo)體知識(shí)產(chǎn)權(quán)供應(yīng)商,擁有全球近200家半導(dǎo)體公司的客戶。目前,80%的GSM手機(jī),99%的CDMA手機(jī),以及未來(lái)3G手機(jī)也都是采用基于ARM核的嵌入式處理器。提供研究分析信息的機(jī)構(gòu)Gartner Inc,2003年6月份統(tǒng)計(jì),2002年ARM在全球半導(dǎo)體IP供應(yīng)商中排名第一,占市場(chǎng)份額的19.8%,銷售收入達(dá)1.8億美圓,比2001年增長(zhǎng)10%。
目前,除了像TI OMAP, Intel的Xscale和Motorola的IMX系列這樣的移動(dòng)終端處理器采用ARM核外,也還有象Samsung, Atmel, Sharp, OKI和Philip等半導(dǎo)體公司設(shè)計(jì)一些通用ARM核的處理器,可以廣泛應(yīng)用在各種嵌入式系統(tǒng),現(xiàn)在在市場(chǎng)上看到比較多的有S3C44B0, 4510,2410,AT91系列和Intel PXA255等。
ARM處理器是32位設(shè)計(jì),同時(shí)也配置了16位指令集,軟件可以以16位編碼與等價(jià)32位代碼相比,占用的存儲(chǔ)器空間可以節(jié)省約35%。ARM處理器目前有ARM7, ARM9, ARM9E, ARM10, ARM11系列產(chǎn)品和來(lái)自合作伙伴Intel Xscale和Strong ARM系列ARM7,適合于中低端的網(wǎng)絡(luò)設(shè)備、終端、各種通用型的嵌入式應(yīng)用和工業(yè)控制等領(lǐng)域。ARM9適合于智能手機(jī)、PDA和先進(jìn)的控制管理和儀器儀表應(yīng)用。Intel Xscale系列產(chǎn)品提供了高性能價(jià)格比、低功耗、適用于智能無(wú)線終端、PDA、家庭網(wǎng)絡(luò)和網(wǎng)絡(luò)存儲(chǔ)器設(shè)備等應(yīng)用。
嵌入式操作系統(tǒng)是ARM CPU重要的軟件基礎(chǔ)
從8位/16位單片機(jī)發(fā)展到以ARM CPU核為代表的32位嵌入式處理器,嵌入式操作系統(tǒng)將替代傳統(tǒng)的由手工編制的監(jiān)控程序或調(diào)度程序,成為重要的基礎(chǔ)組件。嵌入式操作系統(tǒng)可以提供ARM CPU核和外設(shè)的設(shè)備管理,如核的初始化、MMU(內(nèi)存管理單元)、定時(shí)器、中斷、串口、SPI、GPIO、以太網(wǎng)、圖形接口等,嵌入式操作系統(tǒng)提供任務(wù)調(diào)度、內(nèi)存管理、中斷處理、同步互斥機(jī)制、文件系統(tǒng)和網(wǎng)絡(luò)功能,更重要的一點(diǎn)是嵌入式操作系統(tǒng)對(duì)應(yīng)用程序可以起到屏蔽的作用,讓應(yīng)用程序員面向操作系統(tǒng)級(jí)開發(fā)應(yīng)用軟件,并易于在不同的基于ARM核的嵌入式處理器上移植。
嵌入式操作系統(tǒng)都一般具有一定的實(shí)時(shí)性,易于裁剪和伸縮,可以適合于從ARM7到Xscale各種ARM CPU和各種檔次的應(yīng)用,嵌入式操作系統(tǒng)可以使用廣泛流行的ARM開發(fā)工具,如ARM公司的SDT/ADS和Real View、IAR EW等也可以使用開源的軟件,如GCC/GDB、KDE或Eclipe開發(fā)環(huán)境,市場(chǎng)上還有商業(yè)廠商的專用的開發(fā)工具,如Tornado、μC/View、μC/KA、CODE/Lab、Metroworks等。
本文就目前國(guó)內(nèi)在ARM CPU上廣泛采用的三種嵌入式操作系統(tǒng)做個(gè)分析,μC/OS-II、μCLinux和嵌入式Linux。后兩種同屬于Linux,前者是針對(duì)沒(méi)有MMU的微處理器,如ARM7 TDMI核,后者可適用于絕大多數(shù)有MMU的微處理器中,如ARM920T,當(dāng)然,文章也會(huì)涉及到其它支持ARM CPU的嵌入式操作系統(tǒng)。
μC/OS-II嵌入式實(shí)時(shí)內(nèi)核
由Jean Labrosse先生著,邵貝貝老師翻譯的《嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II》先后由電力出版社(第一版)和航空航天大學(xué)出版社出版(第二版)發(fā)行了近萬(wàn)冊(cè),相信有數(shù)以千計(jì)的學(xué)生、老師和工程師正在使用μC/OS-II,在過(guò)去的一年中(2003),在《電子產(chǎn)品世界》、《電子設(shè)計(jì)應(yīng)用》和《單片機(jī)和嵌入式系統(tǒng)應(yīng)用》等雜志和各種學(xué)術(shù)會(huì)議上的有μC/OS-II相關(guān)論文就有幾十余篇。全世界數(shù)百種設(shè)備已經(jīng)在使用μC/OS-II,包括如手機(jī)、路由器、不間斷電源、飛行器、醫(yī)療設(shè)備和工業(yè)控制設(shè)備,在中國(guó)也已經(jīng)有包括香港權(quán)智,首科希電,安控科技在內(nèi)的10余家公司購(gòu)買了產(chǎn)品授權(quán)。
μC/OS-II已經(jīng)有ARM7TDMI、ARM9和Strong ARM等各種ARM CPU的移植,支持包含Atmel、Hynix、Intel、Motorola、Philips、Samsung、Sharp等公司的ARM核的CPU。μC/OS-II的移植也相當(dāng)容易,與CPU相關(guān)的代碼包裝在三個(gè)文件中,os_cpu.h,os_cpu_a.asm,os_cpu_c.c,而且Jean Labrosse先生的應(yīng)用筆記AN-1011和AN-1012對(duì)ARM7、AN-1337對(duì)ARM9的移植過(guò)程都做了詳細(xì)的說(shuō)明。
μC/OS-II有60余個(gè)系統(tǒng)調(diào)用,覆蓋任務(wù)、定時(shí)器、信號(hào)量、事件標(biāo)志、郵箱、隊(duì)列和內(nèi)存管理,已經(jīng)包含了傳統(tǒng)嵌入式操作系統(tǒng)內(nèi)核(如PSOS,VRTX)的功能,還支持互斥型信號(hào)量(Mutual Exclusion Semaphone),這是90年代的嵌入式操作系統(tǒng)內(nèi)核,如Vxworks和VRTXsa才有的技術(shù)。
μC/OS-II因?yàn)槭强蓳屨嫉膶?shí)時(shí)內(nèi)核,所以μC/OS-II與商業(yè)嵌入式實(shí)時(shí)內(nèi)核在性能上沒(méi)有什么差異,μC/OS-II沒(méi)有用戶態(tài)和內(nèi)核態(tài),任務(wù)(線程)或中斷和任務(wù)切換的響應(yīng)可以很快,主要是和不同的ARM CPU相關(guān)的。最新的2.7x版本還增加了算法以避免在移植中修改OSINTCEXSW()中的堆棧指針。這樣可以保證μC/OS-II在不同的CPU上運(yùn)行更穩(wěn)定,移植更方便。
總之,μC/OS-II是一個(gè)非常容易學(xué)習(xí)(有一本很好的講解很清楚的書),結(jié)構(gòu)簡(jiǎn)單,功能完備和實(shí)時(shí)性很強(qiáng)的嵌入式操作系統(tǒng)內(nèi)核,適合于各種嵌入式應(yīng)用以及大專院校教學(xué)和科研。
μC/OS-II目前除了內(nèi)核外還有商業(yè)化文件系統(tǒng)μC/FS,圖形系統(tǒng)μC/GUI以及任務(wù)調(diào)試工具μC KA和μC View,但是μC/OS-II自己目前還沒(méi)有TCP/IP(有計(jì)劃)如果需要,可以購(gòu)買商用的TCP/IP,如InterNiche (www.iniche.com),但價(jià)格還是很貴,免費(fèi)的TCP/IP項(xiàng)目如LWIP (http://www.sics.se/~adam/lwip/),但無(wú)論在功能還是穩(wěn)定性與商業(yè)代碼無(wú)法比擬,這可能也是目前μC/OS-II的弱點(diǎn)。
最后需要說(shuō)明,μC/OS-II不是免費(fèi)軟件,任何人學(xué)習(xí)使用μC/OS-II需要購(gòu)買《嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II》一書,使用了μC/OS-II的產(chǎn)品需要購(gòu)買產(chǎn)品生產(chǎn)授權(quán),購(gòu)買了此授權(quán)的還可以得到開發(fā)期間的技術(shù)支持和升級(jí)服務(wù)。
μCLinux操作系統(tǒng)
μCLinux是Linux小型化后,適合于沒(méi)有MMU的微處理器芯片而裁剪成的小型化Linux操作系統(tǒng),在ARM CPU系列中,ARM7 TDMI,ARM940T等ARM核的CPU產(chǎn)品,如果希望使用Linux操作系統(tǒng),只能用μCLinux,當(dāng)然,μCLinux也支持Motorola Dragonball, Coldfire等其它中低端嵌入式處理器。
μCLinux保持了傳統(tǒng)Linux操作系統(tǒng)的主要特性,包括穩(wěn)定、強(qiáng)大的網(wǎng)絡(luò)和文件系統(tǒng)的支持,μCLinux裁剪了大量的Linux內(nèi)核以縮小尺寸,適合象512k RAM,1M Flash這樣小容量,低成本的嵌入式系統(tǒng)。
μCLinux的項(xiàng)目是由Linux 2.0.38內(nèi)核開始的,第一個(gè)項(xiàng)目是Motorola 68EZ328,目前已經(jīng)有2.4 Linux支持的一些移植的版本,如S3C2500, 44B0等ARM芯片,這些,你可以在μCLinux的官方網(wǎng)站www.uclinux.org上找到,μCLinux近期主要是在發(fā)展各種2.4.x版本的移植,以期跟上Linux社會(huì)主流的發(fā)展趨勢(shì)(因?yàn)榻衲闘inux 2.6將開始成為主流的內(nèi)核)。
μCLinux系統(tǒng)小型化的另一個(gè)重要原因是采用了μCLib庫(kù)替代Linux的Glib庫(kù),使用μCLib可以大大減少應(yīng)用程序的代碼尺寸,對(duì)于中小型嵌入式應(yīng)用,μCLib功能可以滿足需要,所以目前即使是某些采用Linux 2.4內(nèi)核的嵌入式LINUX系統(tǒng)也采用μCLib庫(kù)的做法。μCLinux中,由于沒(méi)有內(nèi)存保護(hù)機(jī)制,應(yīng)用代碼一般采用靜態(tài)連接的方式,而且在μCLinux中采用Flat文件執(zhí)行格式(Linux是Coff或Elf格式), μCLinux和應(yīng)用代碼都可以支持固化,存儲(chǔ)在Flash存儲(chǔ)介質(zhì)中,不需象Linux需要經(jīng)過(guò)一次Flash到RAM的拷貝。所有這些,使得μCLinux更象傳統(tǒng)意義上的嵌入式操作系統(tǒng)。
μCLinux主要是針對(duì)沒(méi)有MMU的嵌入式處理器開發(fā)設(shè)計(jì),那么它也失去了有MMU所帶來(lái)的Linux操作系統(tǒng)的特色,比如,上面已經(jīng)提到的靜態(tài)加載(Linux支持動(dòng)態(tài)應(yīng)用的加載),μCLinux對(duì)內(nèi)存操作是直接的物理內(nèi)存,這樣,任何程序的異常都可能導(dǎo)致內(nèi)核崩潰,μCLinux采用Vfovk(),支持多進(jìn)程,但需要父子進(jìn)程協(xié)調(diào)同步,μCLinux的文件系統(tǒng)相對(duì)比較陳舊,支持的CPU和參考設(shè)計(jì)還比較少,社區(qū)的發(fā)展和維護(hù)也相對(duì)緩慢。更重要的是,在國(guó)內(nèi)外沒(méi)有一家軟件公司有商業(yè)化的μCLinux軟件產(chǎn)品和服務(wù)支持,目前μCLinux官方網(wǎng)站還很少看見(jiàn)象IBM、Intel這樣的巨型公司身影,只有2~3家小型的硬件或方案提供商,這對(duì)于商業(yè)化的產(chǎn)品開發(fā)中采用是有一定的風(fēng)險(xiǎn)。
嵌入式Linux操作系統(tǒng)
我們這里要討論的是可以嵌入在ARM CPU上的,有MMU功能的Linux操作系統(tǒng),也可以稱是嵌入式Linux操作系統(tǒng)。芬蘭學(xué)生Linux Torvalds在91年寫完第一個(gè)Linux版本時(shí),怎樣也無(wú)法想象到今天Linux在全世界范圍被廣泛注目和應(yīng)用。嵌入式系統(tǒng)作為L(zhǎng)inux應(yīng)用的一個(gè)重要領(lǐng)域,由于它的廣泛性和多樣化正在迅速發(fā)展。
和微軟的軟件不一樣,Linux不是由一家公司所擁有、維護(hù)開發(fā)的,Linux在市場(chǎng)有多種發(fā)行版本,所有發(fā)行版本都包含一樣的Linux內(nèi)核、基本工具和應(yīng)用,不同的發(fā)行版本主要是在附加的工具鏈、應(yīng)用、配置以及各種內(nèi)核補(bǔ)丁上有所不同。嵌入式Linux主要是在實(shí)時(shí)性增強(qiáng)、內(nèi)核精簡(jiǎn)和裁減、支持多種CPU結(jié)構(gòu)(如ARM CPU)等方面做了改進(jìn)和提高。
使用Linux在嵌入式系統(tǒng)中有兩種途徑。
第一是用戶自己裝配(稱為DIY內(nèi)核),你可以在www.kernel.org找到全部Linux代碼,或直接到ARM CPU的源代碼樹下www.ARMLinux.org.uk找到你需要的Linux版本在ARM下的移植,或者某些半導(dǎo)體公司,如三星、Motorola也在自己的網(wǎng)站或銷售自己的ARM評(píng)估板的時(shí)候送給一張CD,里面含有一個(gè)可以支持他們?cè)u(píng)估板的最小Linux內(nèi)核系統(tǒng)。如果這個(gè)最小內(nèi)核沒(méi)有包含GCC/GDB工具鏈,你可能還要到GNU的網(wǎng)站下載全部的源代碼,然后再編譯生成你需要版本的ARM工具鏈和應(yīng)用程序庫(kù),這個(gè)過(guò)程是相當(dāng)耗時(shí)和困難的。還需要指出,這種DIY內(nèi)核的配置,添加應(yīng)用和驅(qū)動(dòng)程序也是不標(biāo)準(zhǔn)的和復(fù)雜的,這是嵌入式系統(tǒng)的特殊性所在,比如說(shuō),有的基于ARM的應(yīng)用是網(wǎng)絡(luò)上的小型互連設(shè)備,他需要多個(gè)以太網(wǎng)、USB主機(jī)、小型的NOR Flash文件系統(tǒng),而一個(gè)ARM手持終端,它關(guān)心的是LCD的觸屏、紅外或藍(lán)牙的接口、USB用戶端、快速的啟動(dòng),動(dòng)態(tài)的電源管理和NADA FLASH,這樣,你就需要在數(shù)十家Linux相關(guān)網(wǎng)站下載各種補(bǔ)丁,應(yīng)用和工具,把它們和你拿到的這個(gè)內(nèi)核進(jìn)行反復(fù)的編譯和調(diào)試,確信它們之間以及它們?cè)谀闼玫腁RM CPU硬件評(píng)估板上是穩(wěn)定可靠工作的,這個(gè)過(guò)程是在沒(méi)有任何技術(shù)支持下完成的。當(dāng)然,如果可以從某家半導(dǎo)體公司或開源的網(wǎng)站能夠得到“最小內(nèi)核”,它所包含的組件(如驅(qū)動(dòng)、應(yīng)用和文件系統(tǒng))和你的應(yīng)用近似,而且代碼是可靠的,或者你及時(shí)正確得到Linux網(wǎng)友的指導(dǎo),那么你是幸運(yùn)的。據(jù)說(shuō),有一個(gè)著名的電信設(shè)備制造商花了2年的時(shí)間和150萬(wàn)美圓在一個(gè)項(xiàng)目中開發(fā)自己的Linux,而且最后還不得不停止了。
第二是選擇一個(gè)商業(yè)的嵌入式Linux操作系統(tǒng)平臺(tái)。商業(yè)化的嵌入式Linux版本是針對(duì)嵌入式處理器,如ARM所優(yōu)化設(shè)計(jì)的,已經(jīng)支持了各種半導(dǎo)體廠家的評(píng)估板和主要的設(shè)備驅(qū)動(dòng),商業(yè)化的嵌入式Linux包含了文件系統(tǒng)、應(yīng)用、實(shí)時(shí)性擴(kuò)展和技術(shù)支持培訓(xùn)服務(wù),現(xiàn)今國(guó)外著名的商業(yè)化嵌入式Linux產(chǎn)品有:MontaVista Linux, Bluecat Linux, Timesys Linux, Metrowork Linux(原Lineo), Vlinux(韓國(guó))和Redhat Linux等,國(guó)內(nèi)也有紅旗、中軟、新華嵌入式Linux。
MontaVista Linux是MontaVista軟件公司于99年推出的,它是目前全球最優(yōu)秀的嵌入式Linux操作系統(tǒng)和工具供應(yīng)商,MontaVista在嵌入式Linux的實(shí)時(shí)性、交叉開發(fā)工具、高可用性、動(dòng)態(tài)電源管理等Linux技術(shù)要點(diǎn)方面具有世界領(lǐng)先地位。
MontaVista Linux最版本是3.1,采用Linux 2.4.20,針對(duì)8種CPU系列(包含ARM和Xscale)優(yōu)化定制的商業(yè)化版本,包含了最新O(1)實(shí)時(shí)調(diào)度器,可搶占的內(nèi)核,微秒級(jí)的高分辨定時(shí)器,基于Eclipse的DevRocket開發(fā)環(huán)境,支持應(yīng)用、內(nèi)核和文件系統(tǒng)(固化)的配置和調(diào)試,以及測(cè)試和分析工具,純Windows, Linux和Solaris開發(fā)主機(jī),80余種評(píng)估板和應(yīng)用系統(tǒng)的設(shè)備驅(qū)動(dòng)支持。
選擇象MontaVista Linux這樣商業(yè)化嵌入式Linux,可以讓用戶把時(shí)間和資金放在應(yīng)用軟件和特定的硬件接口和設(shè)備驅(qū)動(dòng)程序,使用商業(yè)嵌入式Linux,可以得到一定時(shí)間(一般是1年)的技術(shù)支持,升級(jí)和培訓(xùn)(這很重要,因?yàn)長(zhǎng)inux是每天都在變化的)。
商業(yè)嵌入式Linux目前除國(guó)內(nèi)的產(chǎn)品外,價(jià)格還是很昂貴的,根據(jù)配置和服務(wù)時(shí)間,大約從幾千到幾萬(wàn)美圓,多數(shù)國(guó)內(nèi)用戶從資金和心理上還很難承受,商業(yè)嵌入式Linux開發(fā)工具相對(duì)于Microsoft和象Tornado/VXWORK的開發(fā)工具,在易于使用和豐富性方面還待于提高和改進(jìn)。
同作為L(zhǎng)inux操作系統(tǒng),我是推薦使用帶有MMU 的 Linux ,而不是μCLinux,因?yàn)榻^大多數(shù)新的ARM CPU 都是AMR9核,他們都帶有MMU 了,無(wú)論是開放源碼的LINUX 社區(qū)還是商業(yè)的嵌入式LINUX 公司的支持和維護(hù)都比μCLinux,要好,快和豐富的多。
結(jié)束語(yǔ)
前面我們對(duì)三種在ARM CPU上較為流行的嵌入式操作系統(tǒng)作了詳細(xì)的分析,在進(jìn)入一個(gè)總結(jié)之前,我還想提到幾個(gè)在國(guó)際上很有名氣的嵌入式操作系統(tǒng),它們是Windriver公司的Vxworks、ATI的Nucleus、日本人的iTron和WinCE。
Windriver的Vxworks在兩三年前曾經(jīng)是最具影響力的嵌入式操作系統(tǒng),幾乎主要的通信設(shè)備制造商都是采用PowerPC+Vxworks這種組合,但是在ARM CPU上,Vxworks的應(yīng)用并不多見(jiàn);ATI的Nucleus(現(xiàn)在已經(jīng)是Mentor的嵌入式部門)曾經(jīng)作為最有名氣的源代碼、沒(méi)有版稅的嵌入式操作系統(tǒng)而在北美和亞洲***流行,最成功的設(shè)計(jì)范例是各種GSM移動(dòng)電話,Nucleus只是一個(gè)實(shí)時(shí)內(nèi)核,用戶需要再購(gòu)買它的TCP/IP,GUI,文件系統(tǒng)和設(shè)備驅(qū)動(dòng)才能形成一個(gè)功能完整的嵌入式系統(tǒng),這使它在近些年失去了優(yōu)勢(shì);日本人的iTron是在日本幾乎家喻戶曉的嵌入式內(nèi)核,標(biāo)準(zhǔn)的編程接口、低廉的價(jià)格(1~3千美圓)、沒(méi)有版稅、支持幾乎所有的CPU(尤其是支持很多日本的CPU),但在除日本之外,iTron好象毫無(wú)建樹;微軟的WinCE,幾乎所有高端PDA都是采用它,它們使用的是 Xscale或ARM9這樣的CPU,但微軟只是關(guān)心有產(chǎn)量象PC一樣巨大的嵌入式設(shè)備制造商,所以他并沒(méi)有把自己的WinCE象Linux一樣易于移植到不同的CPU和增加設(shè)備驅(qū)動(dòng)程序,微軟更愿意象Windows一樣自己把所有事情做好,你只是拿去用好了,如果你沒(méi)有相當(dāng)?shù)募?jí)別,很難獲得它的個(gè)性化定制服務(wù)。
最后我們歸納一下選擇一個(gè)合適的ARM CPU的嵌入式操作系統(tǒng)的幾個(gè)重要因素。
第一是應(yīng)用。如果你想開發(fā)的嵌入式設(shè)備是一個(gè)和網(wǎng)絡(luò)應(yīng)用密切相關(guān)或者就是一個(gè)網(wǎng)絡(luò)設(shè)備,那么你應(yīng)該選擇用嵌入式Linux或者μCLinux,而不是μC/OS-II,因?yàn)長(zhǎng)inux不僅為你集成了TCP/IP協(xié)議,還有很豐富的其它網(wǎng)絡(luò)協(xié)議,如DHCP Server,PPPoe,webserver等等。
第二是實(shí)時(shí)性。沒(méi)有一個(gè)絕對(duì)的數(shù)字可以告訴你什么是硬實(shí)時(shí),什么是軟實(shí)時(shí),它們之間的界限也是十分模糊的,這與你選擇什么樣的ARM CPU,它的主頻,內(nèi)存等參數(shù)有一定的關(guān)系,象Intel Xscale這樣的處理器,即使配合普通Linux的內(nèi)核,內(nèi)核的搶占延時(shí)最壞情況也只有1.743毫秒,而99.9%的情況是1.42毫秒,而如果你使用加入實(shí)時(shí)補(bǔ)丁等技術(shù)的嵌入式Linux如MontaVista Linux(2.4.17版本內(nèi)核),最壞的情況只有436微秒,而99.9%的情況是195微秒,上面的數(shù)字以及考慮到最新的Linux在實(shí)時(shí)性方面的改進(jìn)(如低延時(shí)O(1)調(diào)試器,微秒級(jí)的高分辨率POSIX定時(shí)器),嵌入式Linux可以適合于90~95%的各種嵌入式系統(tǒng)應(yīng)用。當(dāng)然,你如果希望更高數(shù)量級(jí)的實(shí)時(shí)響應(yīng),如高速的A/D轉(zhuǎn)換需要幾個(gè)微秒以內(nèi)的中斷延時(shí),要求一個(gè)毫秒級(jí)沒(méi)有DMA方式的異步串行實(shí)時(shí)處理器等類似的應(yīng)用,可能是采用μC/OS-II是合適的。當(dāng)然,你采用象Vxworks這樣傳統(tǒng)的嵌入式操作系統(tǒng)也可以滿足這樣的強(qiáng)實(shí)時(shí)性要求。
第三是開發(fā)工具。坦言說(shuō),目前μC/OS-II、μCLinux和嵌入式Linux的開發(fā)工具與商業(yè)嵌入式操作系統(tǒng)工具還有一些差距,目前在ARM CPU上廣泛流行和使用的是ARM公司SDT/ADS工具鏈,產(chǎn)品無(wú)論在功能、穩(wěn)定性和眾多的第三方廠商支持方面,都很好,唯一不足的是缺少對(duì)嵌入式操作系統(tǒng)的支持,SDT/ADS的升級(jí)產(chǎn)品RealView計(jì)劃支持GCC和嵌入式Linux,但目前還沒(méi)有看到,μC/OS-II可以使用ARM SDT/ADS,但沒(méi)有OS調(diào)試功能。如果希望支持OS調(diào)試,可以使用IAR或Nohan調(diào)試器,μCLinux的調(diào)試除GDB外還有第三方調(diào)試器,并配合Cygwin形成Windows環(huán)境下μCLinux開發(fā)環(huán)境,象Aiji的 Spider和Micetek 的Hitool。
第四是你所選擇的ARM CPU和參考板,象ARM7TDMI和ARM940T(如S3C2500/2510)核是不能使用嵌入式Linux(MMU),如果你想用Linux,只能用μCLinux,如果你想用Vxworks,你需要了解一下提供評(píng)估板的公司是否有BSP(板支持包),Vxworks自己只有少數(shù)ARM公司評(píng)估板的支持。
最后是價(jià)格和技術(shù)服務(wù)。中國(guó)工程師的薪水大約是歐美日等國(guó)的十分之一,所以在考慮購(gòu)買商業(yè)嵌入式操作系統(tǒng)時(shí),會(huì)遇到是買還是自己做的問(wèn)題,這是很正常的,尤其是在采用開放源代碼技術(shù)時(shí),這個(gè)問(wèn)題就就更加突出。有一點(diǎn)需要注意的是,有些產(chǎn)品如Vxworks是既按用戶數(shù)(有License保護(hù)鎖)收取開發(fā)費(fèi),也按你產(chǎn)品售出的實(shí)際數(shù)量收取每個(gè)Vxworks軟件運(yùn)行的版稅。μC/OS-II只是收取每種產(chǎn)品一次性版稅(不限數(shù)量)。Nucleus和Threadx是一次性收取開發(fā)加上生產(chǎn)的費(fèi)用。Linux無(wú)論是μCLinux還是嵌入式Linux(即使是商業(yè)版本象MontaVista Linux)是不收版稅的,商用嵌入式Linux是以服務(wù)費(fèi)或訂閱方式收取開發(fā)時(shí)的費(fèi)用。很明顯,國(guó)外產(chǎn)品價(jià)格是貴一些(主要是他們?nèi)肆Τ杀靖撸?,但不能不承認(rèn)他們?cè)谇度胧讲僮飨到y(tǒng)的技術(shù)已經(jīng)遠(yuǎn)遠(yuǎn)走在了前方。值得提醒大家的是在ARM開發(fā)工具和評(píng)估板的眾多國(guó)內(nèi)供應(yīng)商中,有不少已經(jīng)做了開放源碼操作系統(tǒng)的移植和示范性的Demo,但應(yīng)該注意他們多數(shù)不具有維護(hù)和支持操作系統(tǒng)平臺(tái)的能力和經(jīng)驗(yàn),過(guò)多地依賴他們是有風(fēng)險(xiǎn)的。
品種眾多,價(jià)格適宜的ARM CPU加上開放源碼嵌入式操作系統(tǒng)為中國(guó)嵌入式系統(tǒng)和設(shè)備制造商的發(fā)展創(chuàng)造了一個(gè)有利的時(shí)機(jī),正確迅速地使用這些技術(shù),可以加快我們具有競(jìng)爭(zhēng)力的新一代電子產(chǎn)品上市的時(shí)間和提高產(chǎn)品的檔次。
評(píng)論
查看更多