一、嵌入式系統(tǒng)
嵌入式系統(tǒng)是以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),并且軟硬件是可裁剪的,適用于對(duì)功能、可靠性、成本、體積、功耗等有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。嵌入式系統(tǒng)最典型的特點(diǎn)是與人們的日常生活緊密相關(guān),任何一個(gè)普通人都可能擁有各類形形色色運(yùn)用了嵌入式技術(shù)的電子產(chǎn)品,小到MP3、PDA等微型數(shù)字化設(shè)備,大到信息家電、智能電器、車載GIS,各種新型嵌入式設(shè)備在數(shù)量上已經(jīng)遠(yuǎn)遠(yuǎn)超過了通用計(jì)算機(jī)。這也難怪美國著名未來學(xué)家尼葛洛龐帝在1999年1月訪華時(shí)就預(yù)言,4~5年后嵌入式智能工具將成為繼PC機(jī)和Internet之后計(jì)算機(jī)工業(yè)最偉大的發(fā)明。
1.1 歷史與現(xiàn)狀
雖然嵌入式系統(tǒng)是近幾年才開始真正風(fēng)靡起來的,但事實(shí)上嵌入式這個(gè)概念卻很早就已經(jīng)存在了,從上個(gè)世紀(jì)70年代單片機(jī)的出現(xiàn)到今天各種嵌入式微處理器、微控制器的廣泛應(yīng)用,嵌入式系統(tǒng)少說也有了近30年的歷史。縱觀嵌入式系統(tǒng)的發(fā)展歷程,大致經(jīng)歷了以下四個(gè)階段:
-
無操作系統(tǒng)階段
嵌入式系統(tǒng)最初的應(yīng)用是基于單片機(jī)的,大多以可編程控制器的形式出現(xiàn),具有監(jiān)測(cè)、伺服、設(shè)備指示等功能,通常應(yīng)用于各類工業(yè)控制和飛機(jī)、導(dǎo)彈等武器裝備中,一般沒有操作系統(tǒng)的支持,只能通過匯編語言對(duì)系統(tǒng)進(jìn)行直接控制,運(yùn)行結(jié)束后再清除內(nèi)存。這些裝置雖然已經(jīng)初步具備了嵌入式的應(yīng)用特點(diǎn),但僅僅只是使用8位的CPU芯片來執(zhí)行一些單線程的程序,因此嚴(yán)格地說還談不上"系統(tǒng)"的概念。
這一階段嵌入式系統(tǒng)的主要特點(diǎn)是:系統(tǒng)結(jié)構(gòu)和功能相對(duì)單一,處理效率較低,存儲(chǔ)容量較小,幾乎沒有用戶接口。由于這種嵌入式系統(tǒng)使用簡便、價(jià)格低廉,因而曾經(jīng)在工業(yè)控制領(lǐng)域中得到了非常廣泛的應(yīng)用,但卻無法滿足現(xiàn)今對(duì)執(zhí)行效率、存儲(chǔ)容量都有較高要求的信息家電等場(chǎng)合的需要。
-
簡單操作系統(tǒng)階段
20世紀(jì)80年代,隨著微電子工藝水平的提高,IC制造商開始把嵌入式應(yīng)用中所需要的微處理器、I/O接口、串行接口以及RAM、ROM等部件統(tǒng)統(tǒng)集成到一片VLSI中,制造出面向I/O設(shè)計(jì)的微控制器,并一舉成為嵌入式系統(tǒng)領(lǐng)域中異軍突起的新秀。與此同時(shí),嵌入式系統(tǒng)的程序員也開始基于一些簡單的"操作系統(tǒng)"開發(fā)嵌入式應(yīng)用軟件,大大縮短了開發(fā)周期、提高了開發(fā)效率。
這一階段嵌入式系統(tǒng)的主要特點(diǎn)是:出現(xiàn)了大量高可靠、低功耗的嵌入式CPU(如Power PC等),各種簡單的嵌入式操作系統(tǒng)開始出現(xiàn)并得到迅速發(fā)展。此時(shí)的嵌入式操作系統(tǒng)雖然還比較簡單,但已經(jīng)初步具有了一定的兼容性和擴(kuò)展性,內(nèi)核精巧且效率高,主要用來控制系統(tǒng)負(fù)載以及監(jiān)控應(yīng)用程序的運(yùn)行。
-
實(shí)時(shí)操作系統(tǒng)階段
20世紀(jì)90年代,在分布控制、柔性制造、數(shù)字化通信和信息家電等巨大需求的牽引下,嵌入式系統(tǒng)進(jìn)一步飛速發(fā)展,而面向?qū)崟r(shí)信號(hào)處理算法的DSP產(chǎn)品則向著高速度、高精度、低功耗的方向發(fā)展。隨著硬件實(shí)時(shí)性要求的提高,嵌入式系統(tǒng)的軟件規(guī)模也不斷擴(kuò)大,逐漸形成了實(shí)時(shí)多任務(wù)操作系統(tǒng)(RTOS),并開始成為嵌入式系統(tǒng)的主流。
這一階段嵌入式系統(tǒng)的主要特點(diǎn)是:操作系統(tǒng)的實(shí)時(shí)性得到了很大改善,已經(jīng)能夠運(yùn)行在各種不同類型的微處理器上,具有高度的模塊化和擴(kuò)展性。此時(shí)的嵌入式操作系統(tǒng)已經(jīng)具備了文件和目錄管理、設(shè)備管理、多任務(wù)、網(wǎng)絡(luò)、圖形用戶界面(GUI)等功能,并提供了大量的應(yīng)用程序接口(API),從而使得應(yīng)用軟件的開發(fā)變得更加簡單。
-
面向Internet階段
21世紀(jì)無疑將是一個(gè)網(wǎng)絡(luò)的時(shí)代,將嵌入式系統(tǒng)應(yīng)用到各種網(wǎng)絡(luò)環(huán)境中去的呼聲自然也越來越高。目前大多數(shù)嵌入式系統(tǒng)還孤立于Internet之外,隨著Internet的進(jìn)一步發(fā)展,以及Internet技術(shù)與信息家電、工業(yè)控制技術(shù)等的結(jié)合日益緊密,嵌入式設(shè)備與Internet的結(jié)合才是嵌入式技術(shù)的真正未來。
信息時(shí)代和數(shù)字時(shí)代的到來,為嵌入式系統(tǒng)的發(fā)展帶來了巨大的機(jī)遇,同時(shí)也對(duì)嵌入式系統(tǒng)廠商提出了新的挑戰(zhàn)。目前,嵌入式技術(shù)與Internet技術(shù)的結(jié)合正在推動(dòng)著嵌入式技術(shù)的飛速發(fā)展,嵌入式系統(tǒng)的研究和應(yīng)用產(chǎn)生了如下新的顯著變化:
- 新的微處理器層出不窮,嵌入式操作系統(tǒng)自身結(jié)構(gòu)的設(shè)計(jì)更加便于移植,能夠在短時(shí)間內(nèi)支持更多的微處理器。
- 嵌入式系統(tǒng)的開發(fā)成了一項(xiàng)系統(tǒng)工程,開發(fā)廠商不僅要提供嵌入式軟硬件系統(tǒng)本身,同時(shí)還要提供強(qiáng)大的硬件開發(fā)工具和軟件支持包。
- 通用計(jì)算機(jī)上使用的新技術(shù)、新觀念開始逐步移植到嵌入式系統(tǒng)中,如嵌入式數(shù)據(jù)庫、移動(dòng)代理、實(shí)時(shí)CORBA等,嵌入式軟件平臺(tái)得到進(jìn)一步完善。
- 各類嵌入式Linux操作系統(tǒng)迅速發(fā)展,由于具有源代碼開放、系統(tǒng)內(nèi)核小、執(zhí)行效率高、網(wǎng)絡(luò)結(jié)構(gòu)完整等特點(diǎn),很適合信息家電等嵌入式系統(tǒng)的需要,目前已經(jīng)形成了能與Windows CE、Palm OS等嵌入式操作系統(tǒng)進(jìn)行有力競(jìng)爭的局面。
- 網(wǎng)絡(luò)化、信息化的要求隨著Internet技術(shù)的成熟和帶寬的提高而日益突出,以往功能單一的設(shè)備如電話、手機(jī)、冰箱、微波爐等功能不再單一,結(jié)構(gòu)變得更加復(fù)雜,網(wǎng)絡(luò)互聯(lián)成為必然趨勢(shì)。
- 精簡系統(tǒng)內(nèi)核,優(yōu)化關(guān)鍵算法,降低功耗和軟硬件成本。
- 提供更加友好的多媒體人機(jī)交互界面。
1.2 體系結(jié)構(gòu)
根據(jù)國際電氣和電子工程師協(xié)會(huì)(IEEE)的定義,嵌入式系統(tǒng)是"控制、監(jiān)視或者輔助設(shè)備、機(jī)器和車間運(yùn)行的裝置"(devices used to control, monitor, or assist the operation of equipment, machinery or plants)。一般而言,整個(gè)嵌入式系統(tǒng)的體系結(jié)構(gòu)可以分成四個(gè)部分:嵌入式處理器、嵌入式外圍設(shè)備、嵌入式操作系統(tǒng)和嵌入式應(yīng)用軟件,如圖1所示。
圖1 嵌入式系統(tǒng)的組成
-
嵌入式處理器
嵌入式系統(tǒng)的核心是各種類型的嵌入式處理器,嵌入式處理器與通用處理器最大的不同點(diǎn)在于,嵌入式CPU大多工作在為特定用戶群所專門設(shè)計(jì)的系統(tǒng)中,它將通用CPU中許多由板卡完成的任務(wù)集成到芯片內(nèi)部,從而有利于嵌入式系統(tǒng)在設(shè)計(jì)時(shí)趨于小型化,同時(shí)還具有很高的效率和可靠性。
嵌入式處理器的體系結(jié)構(gòu)經(jīng)歷了從CISC(復(fù)雜指令集)至RISC(精簡指令集)和Compact RISC的轉(zhuǎn)變,位數(shù)則由4位、8位、16位、32位逐步發(fā)展到64位。目前常用的嵌入式處理器可分為低端的嵌入式微控制器(Micro Controller Unit,MCU)、中高端的嵌入式微處理器(Embedded Micro Processor Unit,EMPU)、用于計(jì)算機(jī)通信領(lǐng)域的嵌入式DSP處理器(Embedded Digital Signal Processor,EDSP)和高度集成的嵌入式片上系統(tǒng)(System On Chip,SOC)。
目前幾乎每個(gè)半導(dǎo)體制造商都生產(chǎn)嵌入式處理器,并且越來越多的公司開始擁有自主的處理器設(shè)計(jì)部門,據(jù)不完全統(tǒng)計(jì),全世界嵌入式處理器已經(jīng)超過1000多種,流行的體系結(jié)構(gòu)有30多個(gè)系列,其中以ARM、PowerPC、MC 68000、MIPS等使用得最為廣泛。
-
嵌入式外圍設(shè)備
在嵌入系統(tǒng)硬件系統(tǒng)中,除了中心控制部件(MCU、DSP、EMPU、SOC)以外,用于完成存儲(chǔ)、通信、調(diào)試、顯示等輔助功能的其他部件,事實(shí)上都可以算作嵌入式外圍設(shè)備。目前常用的嵌入式外圍設(shè)備按功能可以分為存儲(chǔ)設(shè)備、通信設(shè)備和顯示設(shè)備三類。
存儲(chǔ)設(shè)備主要用于各類數(shù)據(jù)的存儲(chǔ),常用的有靜態(tài)易失型存儲(chǔ)器(RAM、SRAM)、動(dòng)態(tài)存儲(chǔ)器(DRAM)和非易失型存儲(chǔ)器(ROM、EPROM、EEPROM、FLASH)三種,其中FLASH憑借其可擦寫次數(shù)多、存儲(chǔ)速度快、存儲(chǔ)容量大、價(jià)格便宜等優(yōu)點(diǎn),在嵌入式領(lǐng)域內(nèi)得到了廣泛應(yīng)用。
目前存在的絕大多數(shù)通信設(shè)備都可以直接在嵌入式系統(tǒng)中應(yīng)用,包括RS-232接口(串行通信接口)、SPI(串行外圍設(shè)備接口)、IrDA(紅外線接口)、I2C(現(xiàn)場(chǎng)總線)、USB(通用串行總線接口)、Ethernet(以太網(wǎng)接口)等。
由于嵌入式應(yīng)用場(chǎng)合的特殊性,通常使用的是陰極射線管(CRT)、液晶顯示器(LCD)和觸摸板(Touch Panel)等外圍顯示設(shè)備。
-
嵌入式操作系統(tǒng)
為了使嵌入式系統(tǒng)的開發(fā)更加方便和快捷,需要有專門負(fù)責(zé)管理存儲(chǔ)器分配、中斷處理、任務(wù)調(diào)度等功能的軟件模塊,這就是嵌入式操作系統(tǒng)。嵌入式操作系統(tǒng)是用來支持嵌入式應(yīng)用的系統(tǒng)軟件,是嵌入式系統(tǒng)極為重要的組成部分,通常包括與硬件相關(guān)的底層驅(qū)動(dòng)程序、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動(dòng)接口、通信協(xié)議、圖形用戶界面(GUI)等。嵌入式操作系統(tǒng)具有通用操作系統(tǒng)的基本特點(diǎn),如能夠有效管理復(fù)雜的系統(tǒng)資源,能夠?qū)τ布M(jìn)行抽象,能夠提供庫函數(shù)、驅(qū)動(dòng)程序、開發(fā)工具集等。但與通用操作系統(tǒng)相比較,嵌入式操作系統(tǒng)在系統(tǒng)實(shí)時(shí)性、硬件依賴性、軟件固化性以及應(yīng)用專用性等方面,具有更加鮮明的特點(diǎn)。
嵌入式操作系統(tǒng)根據(jù)應(yīng)用場(chǎng)合可以分為兩大類:一類是面向消費(fèi)電子產(chǎn)品的非實(shí)時(shí)系統(tǒng),這類設(shè)備包括個(gè)人數(shù)字助理(PDA)、移動(dòng)電話、機(jī)頂盒(STB)等;另一類則是面向控制、通信、醫(yī)療等領(lǐng)域的實(shí)時(shí)操作系統(tǒng),如WindRiver公司的VxWorks、QNX系統(tǒng)軟件公司的QNX等。實(shí)時(shí)系統(tǒng)(Real Time System)是一種能夠在指定或者確定時(shí)間內(nèi)完成系統(tǒng)功能,并且對(duì)外部和內(nèi)部事件在同步或者異步時(shí)間內(nèi)能做出及時(shí)響應(yīng)的系統(tǒng)。在實(shí)時(shí)系統(tǒng)中,操作的正確性不僅依賴于邏輯設(shè)計(jì)的正確程度,而且與這些操作進(jìn)行的時(shí)間有關(guān),也就是說,實(shí)時(shí)系統(tǒng)對(duì)邏輯和時(shí)序的要求非常嚴(yán)格,如果邏輯和時(shí)序控制出現(xiàn)偏差將會(huì)產(chǎn)生嚴(yán)重后果。
實(shí)時(shí)系統(tǒng)主要通過三個(gè)性能指標(biāo)來衡量系統(tǒng)的實(shí)時(shí)性,即響應(yīng)時(shí)間(Response Time)、生存時(shí)間(Survival Time)和吞吐量(Throughput):
-
響應(yīng)時(shí)間 是實(shí)時(shí)系統(tǒng)從識(shí)別出一個(gè)外部事件到做出響應(yīng)的時(shí)間;
-
生存時(shí)間 是數(shù)據(jù)的有效等待時(shí)間,數(shù)據(jù)只有在這段時(shí)間內(nèi)才是有效的;
-
吞吐量 是在給定的時(shí)間內(nèi)系統(tǒng)能夠處理的事件總數(shù),吞吐量通常比平均響應(yīng)時(shí)間的倒數(shù)要小一點(diǎn)。
實(shí)時(shí)系統(tǒng)根據(jù)響應(yīng)時(shí)間可以分為弱實(shí)時(shí)系統(tǒng)、一般實(shí)時(shí)系統(tǒng)和強(qiáng)實(shí)時(shí)系統(tǒng)三種。弱實(shí)時(shí)系統(tǒng)在設(shè)計(jì)時(shí)的宗旨是使各個(gè)任務(wù)運(yùn)行得越快越好,但沒有嚴(yán)格限定某一任務(wù)必須在多長時(shí)間內(nèi)完成,弱實(shí)時(shí)系統(tǒng)更多關(guān)注的是程序運(yùn)行結(jié)果的正確與否,以及系統(tǒng)安全性能等其他方面,對(duì)任務(wù)執(zhí)行時(shí)間的要求相對(duì)來講較為寬松,一般響應(yīng)時(shí)間可以是數(shù)十秒或者更長。一般實(shí)時(shí)系統(tǒng)是弱實(shí)時(shí)系統(tǒng)和強(qiáng)實(shí)時(shí)系統(tǒng)的一種折衷,它的響應(yīng)時(shí)間可以在秒的數(shù)量級(jí)上,廣泛應(yīng)用于消費(fèi)電子設(shè)備中。強(qiáng)實(shí)時(shí)系統(tǒng)則要求各個(gè)任務(wù)不僅要保證執(zhí)行過程和結(jié)果的正確性,同時(shí)還要保證在限定的時(shí)間內(nèi)完成任務(wù),響應(yīng)時(shí)間通常要求在毫秒甚至微秒的數(shù)量級(jí)上,這對(duì)涉及到醫(yī)療、安全、軍事的軟硬件系統(tǒng)來說是至關(guān)重要的。
時(shí)限(deadline)是實(shí)時(shí)系統(tǒng)中的一個(gè)重要概念,指的是對(duì)任務(wù)截止時(shí)間的要求,根據(jù)時(shí)限對(duì)系統(tǒng)性能的影響程度,實(shí)時(shí)系統(tǒng)又可以分為軟實(shí)時(shí)系統(tǒng)(soft real-time-system)和硬實(shí)時(shí)系統(tǒng)(hard real-time-system)。軟實(shí)時(shí)指的是雖然對(duì)系統(tǒng)響應(yīng)時(shí)間有所限定,但如果系統(tǒng)響應(yīng)時(shí)間不能滿足要求,并不會(huì)導(dǎo)致系統(tǒng)產(chǎn)生致命的錯(cuò)誤或者崩潰;硬實(shí)時(shí)則指的是對(duì)系統(tǒng)響應(yīng)時(shí)間有嚴(yán)格的限定,如果系統(tǒng)響應(yīng)時(shí)間不能滿足要求,就會(huì)引起系統(tǒng)產(chǎn)生致命的錯(cuò)誤或者崩潰。如果一個(gè)任務(wù)在時(shí)限到達(dá)之時(shí)尚未完成,對(duì)軟實(shí)時(shí)系統(tǒng)來說還是可以容忍的,最多只會(huì)降低系統(tǒng)性能,但對(duì)硬實(shí)時(shí)系統(tǒng)來說則是無法接受的,因?yàn)檫@樣帶來的后果根本無法預(yù)測(cè),甚至可能是災(zāi)難性的。在目前實(shí)際運(yùn)用的實(shí)時(shí)系統(tǒng)中,通常允許軟硬兩種實(shí)時(shí)性同時(shí)存在,其中一些事件沒有時(shí)限要求,另外一些事件的時(shí)限要求是軟實(shí)時(shí)的,而對(duì)系統(tǒng)產(chǎn)生關(guān)鍵影響的那些事件的時(shí)限要求則是硬實(shí)時(shí)的。
-
嵌入式應(yīng)用軟件
嵌入式應(yīng)用軟件是針對(duì)特定應(yīng)用領(lǐng)域,基于某一固定的硬件平臺(tái),用來達(dá)到用戶預(yù)期目標(biāo)的計(jì)算機(jī)軟件,由于用戶任務(wù)可能有時(shí)間和精度上的要求,因此有些嵌入式應(yīng)用軟件需要特定嵌入式操作系統(tǒng)的支持。嵌入式應(yīng)用軟件和普通應(yīng)用軟件有一定的區(qū)別,它不僅要求其準(zhǔn)確性、安全性和穩(wěn)定性等方面能夠滿足實(shí)際應(yīng)用的需要,而且還要盡可能地進(jìn)行優(yōu)化,以減少對(duì)系統(tǒng)資源的消耗,降低硬件成本。
1.3 關(guān)鍵問題
嵌入式系統(tǒng)是將先進(jìn)的計(jì)算機(jī)技術(shù)、半導(dǎo)體技術(shù)以及電子技術(shù)與特定行業(yè)的具體應(yīng)用相結(jié)合的產(chǎn)物,因此必然是一個(gè)技術(shù)密集、資金密集、高度分散、不斷創(chuàng)新的知識(shí)集成系統(tǒng),嵌入式系統(tǒng)的開發(fā)充滿了競(jìng)爭、機(jī)遇與創(chuàng)新,需要解決好如下一些關(guān)鍵問題:
-
內(nèi)核精巧 嵌入式系統(tǒng)的應(yīng)用領(lǐng)域一般都是小型電子裝置,系統(tǒng)資源相對(duì)有限,因此對(duì)內(nèi)核的要求相當(dāng)高,較之傳統(tǒng)的操作系統(tǒng)來講要小得多,例如ENEA公司推出的OSE分布式嵌入式系統(tǒng),整個(gè)內(nèi)核只有5KB。
-
面向應(yīng)用 嵌入式系統(tǒng)通常是面向用戶、面向產(chǎn)品、面向特定應(yīng)用的。嵌入式系統(tǒng)中的CPU大多工作在為特定用戶群定制的環(huán)境中,具有低耗、體積小、集成度高等特點(diǎn),在進(jìn)行軟硬件設(shè)計(jì)時(shí)必須突出效率、去除冗余,針對(duì)用戶的具體需求對(duì)系統(tǒng)進(jìn)行合理的配置,方能達(dá)到理想的性能。
-
系統(tǒng)精簡 嵌入式系統(tǒng)中的系統(tǒng)軟件和應(yīng)用軟件通常沒有明顯的區(qū)別,不要求其功能及實(shí)現(xiàn)上過于復(fù)雜,這樣一方面有利于控制系統(tǒng)成本,另一方面也有利于保證系統(tǒng)安全。
-
性能優(yōu)化 嵌入式系統(tǒng)通常都要求有一定的實(shí)時(shí)性保障,為了提高執(zhí)行速度和系統(tǒng)性能,嵌入式系統(tǒng)中的軟件一般都固化在存儲(chǔ)芯片或者處理器的內(nèi)部存儲(chǔ)器件當(dāng)中,而不是存貯在磁盤等外部載體中。由于嵌入式系統(tǒng)的運(yùn)算速度和存儲(chǔ)容量存在一定程度上的限制,而且大部分系統(tǒng)都必須有較高的實(shí)時(shí)性保證,因此對(duì)軟件質(zhì)量(特別是可靠性方面)有著較高的要求。
-
專業(yè)開發(fā) 嵌入式系統(tǒng)本身并不具備自主開發(fā)能力,用戶不能直接在其上進(jìn)行二次開發(fā)。當(dāng)系統(tǒng)完成之后,用戶如果需要修改其中某個(gè)程序的功能,必須借助一套完整的開發(fā)工具和環(huán)境。嵌入式系統(tǒng)中專用的開發(fā)工具和環(huán)境通常是基于通用計(jì)算機(jī)上的軟硬件設(shè)備,以及各種邏輯分析儀、混合信號(hào)示波器等。
二、嵌入式Linux
Linux從1991年問世到現(xiàn)在,短短的十幾年時(shí)間已經(jīng)發(fā)展成為功能強(qiáng)大、設(shè)計(jì)完善的操作系統(tǒng)之一,不僅可以與各種傳統(tǒng)的商業(yè)操作系統(tǒng)分庭抗?fàn)帲谛屡d的嵌入式操作系統(tǒng)領(lǐng)域內(nèi)也獲得了飛速發(fā)展。嵌入式Linux(Embedded Linux)是指對(duì)標(biāo)準(zhǔn)Linux經(jīng)過小型化裁剪處理之后,能夠固化在容量只有幾K或者幾M字節(jié)的存儲(chǔ)器芯片或者單片機(jī)中,適合于特定嵌入式應(yīng)用場(chǎng)合的專用Linux操作系統(tǒng)。
2.1 優(yōu)勢(shì)
嵌入式Linux的開發(fā)和研究是操作系統(tǒng)領(lǐng)域中的一個(gè)熱點(diǎn),目前已經(jīng)開發(fā)成功的嵌入式系統(tǒng)中,大約有一半使用的是Linux。Linux之所以能在嵌入式系統(tǒng)市場(chǎng)上取得如此輝煌的成果,與其自身的優(yōu)良特性是分不開的。
-
廣泛的硬件支持
Linux能夠支持x86、ARM、MIPS、ALPHA、PowerPC等多種體系結(jié)構(gòu),目前已經(jīng)成功移植到數(shù)十種硬件平臺(tái),幾乎能夠運(yùn)行在所有流行的CPU上。Linux有著異常豐富的驅(qū)動(dòng)程序資源,支持各種主流硬件設(shè)備和最新硬件技術(shù),甚至可以在沒有存儲(chǔ)管理單元(MMU)的處理器上運(yùn)行,這些都進(jìn)一步促進(jìn)了Linux在嵌入式系統(tǒng)中的應(yīng)用。
-
內(nèi)核高效穩(wěn)定
Linux內(nèi)核的高效和穩(wěn)定已經(jīng)在各個(gè)領(lǐng)域內(nèi)得到了大量事實(shí)的驗(yàn)證,Linux的內(nèi)核設(shè)計(jì)非常精巧,分成進(jìn)程調(diào)度、內(nèi)存管理、進(jìn)程間通信、虛擬文件系統(tǒng)和網(wǎng)絡(luò)接口五大部分,其獨(dú)特的模塊機(jī)制可以根據(jù)用戶的需要,實(shí)時(shí)地將某些模塊插入到內(nèi)核或從內(nèi)核中移走。這些特性使得Linux系統(tǒng)內(nèi)核可以裁剪得非常小巧,很適合于嵌入式系統(tǒng)的需要。
-
開放源碼,軟件豐富
Linux是開放源代碼的自由操作系統(tǒng),它為用戶提供了最大限度的自由度,由于嵌入式系統(tǒng)千差萬別,往往需要針對(duì)具體的應(yīng)用進(jìn)行修改和優(yōu)化,因而獲得源代碼就變得至關(guān)重要了。Linux的軟件資源十分豐富,每一種通用程序在Linux上幾乎都可以找到,并且數(shù)量還在不斷增加。在Linux上開發(fā)嵌入式應(yīng)用軟件一般不用從頭做起,而是可以選擇一個(gè)類似的自由軟件做為原型,在其上進(jìn)行二次開發(fā)。
-
優(yōu)秀的開發(fā)工具
開發(fā)嵌入式系統(tǒng)的關(guān)鍵是需要有一套完善的開發(fā)和調(diào)試工具。傳統(tǒng)的嵌入式開發(fā)調(diào)試工具是在線仿真器(In-Circuit Emulator,ICE),它通過取代目標(biāo)板的微處理器,給目標(biāo)程序提供一個(gè)完整的仿真環(huán)境,從而使開發(fā)者能夠非常清楚地了解到程序在目標(biāo)板上的工作狀態(tài),便于監(jiān)視和調(diào)試程序。在線仿真器的價(jià)格非常昂貴,而且只適合做非常底層的調(diào)試,如果使用的是嵌入式Linux,一旦軟硬件能夠支持正常的串口功能時(shí),即使不用在線仿真器也可以很好地進(jìn)行開發(fā)和調(diào)試工作,從而節(jié)省了一筆不小的開發(fā)費(fèi)用。嵌入式Linux為開發(fā)者提供了一套完整的工具鏈(Tool Chain),它利用GNU的gcc做編譯器,用gdb、kgdb、xgdb做調(diào)試工具,能夠很方便地實(shí)現(xiàn)從操作系統(tǒng)到應(yīng)用軟件各個(gè)級(jí)別的調(diào)試。
-
完善的網(wǎng)絡(luò)通信和文件管理機(jī)制
Linux至誕生之日起就與Internet密不可分,支持所有標(biāo)準(zhǔn)的Internet網(wǎng)絡(luò)協(xié)議,并且很容易移植到嵌入式系統(tǒng)當(dāng)中。此外,Linux還支持ext2、fat16、fat32、romfs等文件系統(tǒng),這些都為開發(fā)嵌入式系統(tǒng)應(yīng)用打下了很好的基礎(chǔ)。
2.2 挑戰(zhàn)
目前,嵌入式Linux系統(tǒng)的研發(fā)熱潮正在蓬勃興起,并且占據(jù)了很大的市場(chǎng)份額,除了一些傳統(tǒng)的Linux公司(如RedHat、MontaVista等)正在從事嵌入式Linux的開發(fā)和應(yīng)用之外,IBM、Intel、Motorola等著名企業(yè)也開始進(jìn)行嵌入式Linux的研究。雖然前景一片燦爛,但就目前而言,嵌入式Linux的研究成果與市場(chǎng)的真正要求仍有一段差距,要開發(fā)出真正成熟的嵌入式Linux系統(tǒng),還需要從以下幾個(gè)方面做出努力。
-
提高系統(tǒng)實(shí)時(shí)性
Linux雖然已經(jīng)被成功地應(yīng)用到了PDA、移動(dòng)電話、車載電視、機(jī)頂盒、網(wǎng)絡(luò)微波爐等各種嵌入式設(shè)備上,但在醫(yī)療、航空、交通、工業(yè)控制等對(duì)實(shí)時(shí)性要求非常嚴(yán)格的場(chǎng)合中還無法直接應(yīng)用,原因在于現(xiàn)有的Linux是一個(gè)通用的操作系統(tǒng),雖然它也采用了許多技術(shù)來加快系統(tǒng)的運(yùn)行和響應(yīng)速度,并且符合POSIX 1003.1b標(biāo)準(zhǔn),但從本質(zhì)上來說并不是一個(gè)嵌入式實(shí)時(shí)操作系統(tǒng)。Linux的內(nèi)核調(diào)度策略基本上是沿用UNIX系統(tǒng)的,將它直接應(yīng)用于嵌入式實(shí)時(shí)環(huán)境會(huì)有許多缺陷,如在運(yùn)行內(nèi)核線程時(shí)中斷被關(guān)閉,分時(shí)調(diào)度策略存在時(shí)間上的不確定性,以及缺乏高精度的計(jì)時(shí)器等等。正因如此,利用Linux作為底層操作系統(tǒng),在其上進(jìn)行實(shí)時(shí)化改造,從而構(gòu)建出一個(gè)具有實(shí)時(shí)處理能力的嵌入式系統(tǒng),是現(xiàn)在日益流行的解決方案。
-
改善內(nèi)核結(jié)構(gòu)
Linux內(nèi)核采用的是整體式結(jié)構(gòu)(Monolithic),整個(gè)內(nèi)核是一個(gè)單獨(dú)的、非常大的程序,這樣雖然能夠使系統(tǒng)的各個(gè)部分直接溝通,有效地縮短任務(wù)之間的切換時(shí)間,提高系統(tǒng)響應(yīng)速度,但與嵌入式系統(tǒng)存儲(chǔ)容量小、資源有限的特點(diǎn)不相符合。嵌入式系統(tǒng)經(jīng)常采用的是另一種稱為微內(nèi)核(Microkernel)的體系結(jié)構(gòu),即內(nèi)核本身只提供一些最基本的操作系統(tǒng)功能,如任務(wù)調(diào)度、內(nèi)存管理、中斷處理等,而類似于文件系統(tǒng)和網(wǎng)絡(luò)協(xié)議等附加功能則運(yùn)行在用戶空間中,并且可以根據(jù)實(shí)際需要進(jìn)行取舍。Microkernel的執(zhí)行效率雖然比不上Monolithic,但卻大大減小了內(nèi)核的體積,便于維護(hù)和移植,更能滿足嵌入式系統(tǒng)的要求。可以考慮將Linux內(nèi)核部分改造成Microkernel,使Linux在具有很高性能的同時(shí),又能滿足嵌入式系統(tǒng)體積小的要求。
-
完善集成開發(fā)平臺(tái)
引入嵌入式Linux系統(tǒng)集成開發(fā)平臺(tái),是嵌入式Linux進(jìn)一步發(fā)展和應(yīng)用的內(nèi)在要求。傳統(tǒng)上的嵌入式系統(tǒng)都是面向具體應(yīng)用場(chǎng)合的,軟件和硬件之間必須緊密配合,但隨著嵌入式系統(tǒng)規(guī)模的不斷擴(kuò)大和應(yīng)用領(lǐng)域的不斷擴(kuò)展,嵌入式操作系統(tǒng)的出現(xiàn)就成了一種必然,因?yàn)橹挥羞@樣才能促成嵌入式系統(tǒng)朝層次化和模塊化的方向發(fā)展。很顯然,嵌入式集成開發(fā)平臺(tái)也是符合上述發(fā)展趨勢(shì)的,一個(gè)優(yōu)秀的嵌入式集成開發(fā)環(huán)境能夠提供比較完備的仿真功能,可以實(shí)現(xiàn)嵌入式應(yīng)用軟件和嵌入式硬件的同步開發(fā),從而擺脫了"嵌入式應(yīng)用軟件的開發(fā)依賴于嵌入式硬件的開發(fā),并且以嵌入式硬件的開發(fā)為前提"的不利局面。一個(gè)完整的嵌入式集成開發(fā)平臺(tái)通常包括編譯器、連接器、調(diào)試器、跟蹤器、優(yōu)化器和集成用戶界面,目前Linux在基于圖形界面的特定系統(tǒng)定制平臺(tái)的研究上,與Windows CE等商業(yè)嵌入式操作系統(tǒng)相比還有很大差距,整體集成開發(fā)環(huán)境有待提高和完善。
三、關(guān)鍵技術(shù)
嵌入式系統(tǒng)是一種根據(jù)特定用途所專門開發(fā)的系統(tǒng),它只完成預(yù)期要完成的功能,因此其開發(fā)過程和開發(fā)環(huán)境同傳統(tǒng)的軟件開發(fā)相比有著顯著的不同。
3.1 開發(fā)流程
在嵌入式系統(tǒng)的應(yīng)用開發(fā)中,整個(gè)系統(tǒng)的開發(fā)過程如圖2所示:
圖2 嵌入式系統(tǒng)的開發(fā)流程
嵌入式系統(tǒng)發(fā)展到今天,對(duì)應(yīng)于各種微處理器的硬件平臺(tái)一般都是通用的、固定的、成熟的,這就大大減少了由硬件系統(tǒng)引入錯(cuò)誤的機(jī)會(huì)。此外,由于嵌入式操作系統(tǒng)屏蔽了底層硬件的復(fù)雜性,使得開發(fā)者通過操作系統(tǒng)提供的API函數(shù)就可以完成大部分工作,因此大大簡化了開發(fā)過程,提高了系統(tǒng)的穩(wěn)定性。嵌入式系統(tǒng)的開發(fā)者現(xiàn)在已經(jīng)從反復(fù)進(jìn)行硬件平臺(tái)設(shè)計(jì)的過程中解脫出來,從而可以將主要精力放在滿足特定的需求上。
嵌入式系統(tǒng)通常是一個(gè)資源受限的系統(tǒng),因此直接在嵌入式系統(tǒng)的硬件平臺(tái)上編寫軟件比較困難,有時(shí)候甚至是不可能的。目前一般采用的解決辦法是首先在通用計(jì)算機(jī)上編寫程序,然后通過交叉編譯生成目標(biāo)平臺(tái)上可以運(yùn)行的二進(jìn)制代碼格式,最后再下載到目標(biāo)平臺(tái)上的特定位置上運(yùn)行。
需要交叉開發(fā)環(huán)境(Cross Development Environment)的支持是嵌入式應(yīng)用軟件開發(fā)時(shí)的一個(gè)顯著特點(diǎn),交叉開發(fā)環(huán)境是指編譯、鏈接和調(diào)試嵌入式應(yīng)用軟件的環(huán)境,它與運(yùn)行嵌入式應(yīng)用軟件的環(huán)境有所不同,通常采用宿主機(jī)/目標(biāo)機(jī)模式,如圖3所示。
圖3 交叉開發(fā)環(huán)境
宿主機(jī)(Host)是一臺(tái)通用計(jì)算機(jī)(如PC機(jī)或者工作站),它通過串口或者以太網(wǎng)接口與目標(biāo)機(jī)通信。宿主機(jī)的軟硬件資源比較豐富,不但包括功能強(qiáng)大的操作系統(tǒng)(如Windows和Linux),而且還有各種各樣優(yōu)秀的開發(fā)工具(如WindRiver的Tornado、Microsoft的Embedded Visual C++等),能夠大大提高嵌入式應(yīng)用軟件的開發(fā)速度和效率。
目標(biāo)機(jī)(Target)一般在嵌入式應(yīng)用軟件開發(fā)期間使用,用來區(qū)別與嵌入式系統(tǒng)通信的宿主機(jī),它可以是嵌入式應(yīng)用軟件的實(shí)際運(yùn)行環(huán)境,也可以是能夠替代實(shí)際運(yùn)行環(huán)境的仿真系統(tǒng),但軟硬件資源通常都比較有限。嵌入式系統(tǒng)的交叉開發(fā)環(huán)境一般包括交叉編譯器、交叉調(diào)試器和系統(tǒng)仿真器,其中交叉編譯器用于在宿主機(jī)上生成能在目標(biāo)機(jī)上運(yùn)行的代碼,而交叉調(diào)試器和系統(tǒng)仿真器則用于在宿主機(jī)與目標(biāo)機(jī)間完成嵌入式軟件的調(diào)試。在采用宿主機(jī)/目標(biāo)機(jī)模式開發(fā)嵌入式應(yīng)用軟件時(shí),首先利用宿主機(jī)上豐富的資源和良好的開發(fā)環(huán)境開發(fā)和仿真調(diào)試目標(biāo)機(jī)上的軟件,然后通過串口或者以網(wǎng)絡(luò)將交叉編譯生成的目標(biāo)代碼傳輸并裝載到目標(biāo)機(jī)上,并在監(jiān)控程序或者操作系統(tǒng)的支持下利用交叉調(diào)試器進(jìn)行分析和調(diào)試,最后目標(biāo)機(jī)在特定環(huán)境下脫離宿主機(jī)單獨(dú)運(yùn)行。
建立交叉開發(fā)環(huán)境是進(jìn)行嵌入式軟件開發(fā)的第一步,目前常用的交叉開發(fā)環(huán)境主要有開放和商業(yè)兩種類型。開放的交叉開發(fā)環(huán)境的典型代表是GNU工具鏈、目前已經(jīng)能夠支持x86、ARM、MIPS、PowerPC等多種處理器。商業(yè)的交叉開發(fā)環(huán)境則主要有Metrowerks CodeWarrior、ARM Software Development Toolkit、SDS Cross compiler、WindRiver Tornado、Microsoft Embedded Visual C++等。
3.2 交叉編譯和鏈接
在完成嵌入式軟件的編碼之后,需要進(jìn)行編譯和鏈接以生成可執(zhí)行代碼,由于開發(fā)過程大多是在使用Intel公司x86系列CPU的通用計(jì)算機(jī)上進(jìn)行的,而目標(biāo)環(huán)境的處理器芯片卻大多為ARM、MIPS、PowerPC、DragonBall等系列的微處理器,這就要求在建立好的交叉開發(fā)環(huán)境中進(jìn)行交叉編譯和鏈接。
交叉編譯器和交叉鏈接器是能夠在宿主機(jī)上運(yùn)行,并且能夠生成在目標(biāo)機(jī)上直接運(yùn)行的二進(jìn)制代碼的編譯器和鏈接器。例如在基于ARM體系結(jié)構(gòu)的gcc交叉開發(fā)環(huán)境中,arm-linux-gcc是交叉編譯器,arm-linux-ld是交叉鏈接器。通常情況下,并不是每一種體系結(jié)構(gòu)的嵌入式微處理器都只對(duì)應(yīng)于一種交叉編譯器和交叉鏈接器,比如對(duì)于M68K體系結(jié)構(gòu)的gcc交叉開發(fā)環(huán)境而言,就對(duì)應(yīng)于多種不同的編譯器和鏈接器。如果使用的是COFF格式的可執(zhí)行文件,那么在編譯Linux內(nèi)核時(shí)需要使用m68k-coff-gcc和m68k-coff-ld,而在編譯應(yīng)用程序時(shí)則需要使用m68k-coff-pic-gcc和m68k-coff-pic-ld。
嵌入式系統(tǒng)在鏈接過程中通常都要求使用較小的函數(shù)庫,以便最后產(chǎn)生的可執(zhí)行代碼能夠盡可能地小,因此實(shí)際運(yùn)用時(shí)一般使用經(jīng)過特殊處理的函數(shù)庫。對(duì)于嵌入式Linux系統(tǒng)來講,功能越來越強(qiáng)、體積越來越大的C語言函數(shù)庫glibc和數(shù)學(xué)函數(shù)庫libm已經(jīng)很難滿足實(shí)際的需要,因此需要采用它們的精化版本uClibc、uClibm和newlib等。
目前嵌入式的集成開發(fā)環(huán)境都支持交叉編譯和交叉鏈接,如WindRiver Tornado和GNU工具鏈等,編寫好的嵌入式軟件經(jīng)過交叉編譯和交叉鏈接后通常會(huì)生成兩種類型的可執(zhí)行文件:用于調(diào)試的可執(zhí)行文件和用于固化的可執(zhí)行文件。
3.3 交叉調(diào)試
嵌入式軟件經(jīng)過編譯和鏈接后即進(jìn)入調(diào)試階段,調(diào)試是軟件開發(fā)過程中必不可少的一個(gè)環(huán)節(jié),嵌入式軟件開發(fā)過程中的交叉調(diào)試與通用軟件開發(fā)過程中的調(diào)試方式有所差別。在通用軟件開發(fā)中,調(diào)試器與被調(diào)試的程序往往運(yùn)行在同一臺(tái)計(jì)算機(jī)上,調(diào)試器是一個(gè)單獨(dú)運(yùn)行著的進(jìn)程,它通過操作系統(tǒng)提供的調(diào)試接口來控制被調(diào)試的進(jìn)程。而在嵌入式軟件開發(fā)中,調(diào)試時(shí)采用的是在宿主機(jī)和目標(biāo)機(jī)之間進(jìn)行的交叉調(diào)試,調(diào)試器仍然運(yùn)行在宿主機(jī)的通用操作系統(tǒng)之上,但被調(diào)試的進(jìn)程卻是運(yùn)行在基于特定硬件平臺(tái)的嵌入式操作系統(tǒng)中,調(diào)試器和被調(diào)試進(jìn)程通過串口或者網(wǎng)絡(luò)進(jìn)行通信,調(diào)試器可以控制、訪問被調(diào)試進(jìn)程,讀取被調(diào)試進(jìn)程的當(dāng)前狀態(tài),并能夠改變被調(diào)試進(jìn)程的運(yùn)行狀態(tài)。
交叉調(diào)試(Cross Debug)又常常被稱為遠(yuǎn)程調(diào)試(Remote Debug),是一種允許調(diào)試器以某種方式控制目標(biāo)機(jī)上被調(diào)試進(jìn)程的運(yùn)行方式,并具有查看和修改目標(biāo)機(jī)上內(nèi)存單元、寄存器以及被調(diào)試進(jìn)程中變量值等各種調(diào)試功能的調(diào)試方式。一般而言,遠(yuǎn)程調(diào)試過程的結(jié)構(gòu)如圖4所示。
圖4遠(yuǎn)程調(diào)試結(jié)構(gòu)
嵌入式系統(tǒng)的交叉調(diào)試有多種方法,可以被細(xì)分成不同的層次,但一般都具有如下一些典型特點(diǎn):
- 調(diào)試器和被調(diào)試進(jìn)程運(yùn)行在不同的機(jī)器上,調(diào)試器運(yùn)行在PC或者工作站上(宿主機(jī)),而被調(diào)試的進(jìn)程則運(yùn)行在各種專業(yè)調(diào)試板上(目標(biāo)機(jī))。
- 調(diào)試器通過某種通信方式與被調(diào)試進(jìn)程建立聯(lián)系,如串口、并口、網(wǎng)絡(luò)、DBM、JTAG或者專用的通信方式。
- 在目標(biāo)機(jī)上一般會(huì)具備某種形式的調(diào)試代理,它負(fù)責(zé)與調(diào)試器共同配合完成對(duì)目標(biāo)機(jī)上運(yùn)行著的進(jìn)程的調(diào)試。這種調(diào)試代理可能是某些支持調(diào)試功能的硬件設(shè)備(如DBI 2000),也可能是某些專門的調(diào)試軟件(如gdbserver)。
- 目標(biāo)機(jī)可能是某種形式的系統(tǒng)仿真器,通過在宿主機(jī)上運(yùn)行目標(biāo)機(jī)的仿真軟件,整個(gè)調(diào)試過程可以在一臺(tái)計(jì)算機(jī)上運(yùn)行。此時(shí)物理上雖然只有一臺(tái)計(jì)算機(jī),但邏輯上仍然存在著宿主機(jī)和目標(biāo)機(jī)的區(qū)別。
在嵌入式軟件開發(fā)過程中的調(diào)試方式有很多種,應(yīng)根據(jù)實(shí)際的開發(fā)要求和條件進(jìn)行選擇。就調(diào)試方法而言,嵌入式系統(tǒng)的交叉調(diào)試可以分為硬件調(diào)試和軟件調(diào)試兩種,前者使用仿真調(diào)試器協(xié)助調(diào)試過程,而后者則使用軟件調(diào)試器完成調(diào)試過程。
-
硬件調(diào)試
相對(duì)于軟件調(diào)試而言,使用硬件調(diào)試器可以獲得更強(qiáng)大的調(diào)試功能和更優(yōu)秀的調(diào)試性能。硬件調(diào)試器的基本原理是通過仿真硬件的執(zhí)行過程,讓開發(fā)者在調(diào)試時(shí)可以隨時(shí)了解到系統(tǒng)的當(dāng)前執(zhí)行情況。目前嵌入式系統(tǒng)開發(fā)中最常用到的硬件調(diào)試器是ROM Monitor、ROM Emulator、In-Circuit Emulator和In-Circuit Debugger。
采用ROM Monitor方式進(jìn)行交叉調(diào)試需要在宿主機(jī)上運(yùn)行調(diào)試器,在目標(biāo)機(jī)上運(yùn)行ROM監(jiān)視器(ROM Monitor)和被調(diào)試程序,宿主機(jī)通過調(diào)試器與目標(biāo)機(jī)上的ROM監(jiān)視器建立通信連接,它們之間的通信遵循遠(yuǎn)程調(diào)試協(xié)議。ROM監(jiān)視器可以是一段運(yùn)行在目標(biāo)機(jī)ROM上的可執(zhí)行程序,也可以是一個(gè)專門的硬件調(diào)試設(shè)備,它負(fù)責(zé)監(jiān)控目標(biāo)機(jī)上被調(diào)試程序的運(yùn)行情況,能夠與宿主機(jī)端的調(diào)試器一同完成對(duì)應(yīng)用程序的調(diào)試。在使用這種調(diào)試方式時(shí),被調(diào)試程序首先通過ROM監(jiān)視器下載到目標(biāo)機(jī),然后在ROM監(jiān)視器的監(jiān)控下完成調(diào)試,目前使用的絕大部分ROM監(jiān)視器能夠完成設(shè)置斷點(diǎn)、單步執(zhí)行、查看寄存器、修改內(nèi)存空間等各項(xiàng)調(diào)試功能。
采用ROM Emulator方式進(jìn)行交叉調(diào)試時(shí)需要使用ROM仿真器,它通常被插入到目標(biāo)機(jī)上的ROM插槽中,專門用于仿真目標(biāo)機(jī)上的ROM芯片。在使用這種調(diào)試方式時(shí),被調(diào)試程序首先下載到ROM仿真器中,它等效于下載到目標(biāo)機(jī)的ROM芯片上,然后在ROM仿真器中完成對(duì)目標(biāo)程序的調(diào)試。ROM Emulator調(diào)試方式通過使用一個(gè)ROM仿真器,雖然避免了每次修改程序后都必須重新燒寫到目標(biāo)機(jī)ROM中這一費(fèi)時(shí)費(fèi)力的操作,但由于ROM仿真器本身比較昂貴,功能相對(duì)來講又比較單一,因此只適應(yīng)于某些特定場(chǎng)合。
采用In-Circuit Emulator(ICE)方式進(jìn)行交叉調(diào)試時(shí)需要使用在線仿真器,它是仿照目標(biāo)機(jī)上的CPU而專門設(shè)計(jì)的硬件,可以完全仿真處理器芯片的行為,并且提供了非常豐富的調(diào)試功能。在使用在線仿真器進(jìn)行調(diào)試的過程中,可以按順序單步執(zhí)行,也可以倒退執(zhí)行,還可以實(shí)時(shí)查看所有需要的數(shù)據(jù),從而給調(diào)試過程帶來了很多的便利。嵌入式系統(tǒng)應(yīng)用的一個(gè)顯著特點(diǎn)是與現(xiàn)實(shí)世界中的硬件直接相關(guān),存在各種異變和事先未知的變化,從而給微處理器的指令執(zhí)行帶來各種不確定因素,這種不確定性在目前情況下只有通過在線仿真器才有可能發(fā)現(xiàn),因此盡管在線仿真器的價(jià)格非常昂貴,但仍然得到了非常廣泛的應(yīng)用。
采用In-Circuit Debugger(ICD)方式進(jìn)行交叉調(diào)試時(shí)需要使用在線調(diào)試器。由于ICE的價(jià)格非常昂貴,并且每種CPU都需要一種與之對(duì)應(yīng)的ICE,使得開發(fā)成本非常高,一個(gè)比較好的解決辦法是讓CPU直接在其內(nèi)部實(shí)現(xiàn)調(diào)試功能,并通過在開發(fā)板上引出的調(diào)試端口,發(fā)送調(diào)試命令和接收調(diào)試信息,完成調(diào)試過程。目前Motorola公司提供的開發(fā)板上使用的是DBM調(diào)試端口,而ARM公司提供的開發(fā)板上使用的則是JTAG調(diào)試端口,使用合適的軟件工具與這些調(diào)試端口進(jìn)行連接,可以獲得與ICE類似的調(diào)試效果。
-
軟件調(diào)試
軟件調(diào)試通常要在不同的層次上進(jìn)行,有時(shí)可能需要對(duì)嵌入式操作系統(tǒng)的內(nèi)核進(jìn)行調(diào)試,而有時(shí)可能僅僅只需要調(diào)試嵌入式應(yīng)用程序就可以了。在嵌入式系統(tǒng)的整個(gè)開發(fā)過程中,不同層次上的軟件調(diào)試需要使用不同的調(diào)試方法。
嵌入式操作系統(tǒng)的內(nèi)核調(diào)試相對(duì)來講比較困難,這是因?yàn)樵趦?nèi)核中不便于增加一個(gè)調(diào)試器程序,而只能通過遠(yuǎn)程調(diào)試的方法,通過串口和操作系統(tǒng)內(nèi)置的"調(diào)試樁"(debug stub)進(jìn)行通信,共同完成調(diào)試過程。調(diào)試樁可以看成是一個(gè)調(diào)試服務(wù)器,它通過操作系統(tǒng)獲得一些必要的調(diào)試信息,并且負(fù)責(zé)處理宿主機(jī)發(fā)送來的調(diào)試命令。具體到嵌入式Linux系統(tǒng)內(nèi)核,調(diào)試時(shí)可以先在Linux內(nèi)核中設(shè)置一個(gè)調(diào)試樁,用作調(diào)試過程中和宿主機(jī)之間的通信服務(wù)器,然后就可以在宿主機(jī)中通過調(diào)試器的串口與調(diào)試樁進(jìn)行通信,并通過調(diào)試器控制目標(biāo)機(jī)上Linux內(nèi)核的運(yùn)行。
嵌入式應(yīng)用軟件的調(diào)試可以使用本地調(diào)試和遠(yuǎn)程調(diào)試兩種方法,相對(duì)于操作系統(tǒng)的調(diào)試而言,這兩種方式都比較簡單。如果采用的是本地調(diào)試,首先要將所需的調(diào)試器移植到目標(biāo)系統(tǒng)中,然后就可以直接在目標(biāo)機(jī)上運(yùn)行調(diào)試器來調(diào)試應(yīng)用程序了;如果采用的是遠(yuǎn)程調(diào)試,則需要移植一個(gè)調(diào)試服務(wù)器到目標(biāo)系統(tǒng)中,并通過它與宿主機(jī)上的調(diào)試器共同完成應(yīng)用程序的調(diào)試。在嵌入式Linux系統(tǒng)的開發(fā)中,遠(yuǎn)程調(diào)試時(shí)目標(biāo)機(jī)上使用的調(diào)試服務(wù)器通常是gdbserver,而宿主機(jī)上使用的調(diào)試器則是gdb,兩者相互配合共同完成調(diào)試過程。
3.4 系統(tǒng)測(cè)試
嵌入式系統(tǒng)的硬件一般采用專門的測(cè)試儀器進(jìn)行測(cè)試,而軟件則需要有相關(guān)的測(cè)試技術(shù)和測(cè)試工具的支持,并要采用特定的測(cè)試策略。測(cè)試技術(shù)指的是軟件測(cè)試的專門途徑,以及能夠更加有效地運(yùn)用這些途徑的特定方法。在嵌入式軟件測(cè)試中,常常要在基于目標(biāo)機(jī)的測(cè)試和基于宿主機(jī)的測(cè)試之間做出折衷,基于目標(biāo)機(jī)的測(cè)試需要消耗較多的時(shí)間和經(jīng)費(fèi),而基于宿主機(jī)的測(cè)試雖然代價(jià)較小,但畢竟是在仿真環(huán)境中進(jìn)行的,因此難以完全反映軟件運(yùn)行時(shí)的實(shí)際情況。這兩種環(huán)境下的測(cè)試可以發(fā)現(xiàn)不同的軟件缺陷,關(guān)鍵是要對(duì)目標(biāo)機(jī)環(huán)境和宿主機(jī)環(huán)境下的測(cè)試內(nèi)容進(jìn)行合理取舍。
測(cè)試工具指的是那些能夠用來輔助測(cè)試的工具,測(cè)試工具主要用來支持測(cè)試人員的測(cè)試工作,本身不能直接用來進(jìn)行測(cè)試,測(cè)試工具一般都是通用工具,測(cè)試人員應(yīng)該根據(jù)實(shí)際情況對(duì)它們進(jìn)行適當(dāng)?shù)恼{(diào)整。嵌入式軟件測(cè)試中經(jīng)常用到測(cè)試工具主要有內(nèi)存分析工具、性能分析工具、覆蓋分析工具、缺陷跟蹤工具等。
-
內(nèi)存分析工具
嵌入式系統(tǒng)的內(nèi)存資源通常是受限的,內(nèi)存分析工具可以用來處理在進(jìn)行動(dòng)態(tài)內(nèi)存分配時(shí)產(chǎn)生的缺陷。當(dāng)動(dòng)態(tài)分配的內(nèi)存被錯(cuò)誤地引用時(shí),產(chǎn)生的錯(cuò)誤通常難以再現(xiàn),可出現(xiàn)的失效難以追蹤,使用內(nèi)存分析工具可以很好地檢測(cè)出這類缺陷。目前常用的內(nèi)存分析工具有軟件和硬件兩種,基于軟件的內(nèi)存分析工具可能會(huì)對(duì)代碼的執(zhí)行性能帶來很大影響,從而影響系統(tǒng)的實(shí)時(shí)性;基于硬件的內(nèi)存分析工具價(jià)格昂貴,并且只能在特定的環(huán)境中使用。
-
性能分析工具
嵌入式系統(tǒng)的性能通常是一個(gè)非常關(guān)鍵的因素,開發(fā)人員一般需要對(duì)系統(tǒng)的某些關(guān)鍵代碼進(jìn)行優(yōu)化來改進(jìn)性能,而首先遇到的問題自然就是確定需要對(duì)哪些代碼進(jìn)行優(yōu)化。性能分析工具可以為開發(fā)人員提供有關(guān)的數(shù)據(jù),說明執(zhí)行時(shí)間是如何消耗的,是什么時(shí)候消耗的,以及每個(gè)進(jìn)程所使用的時(shí)間。這些數(shù)據(jù)可以幫助確定哪些進(jìn)程消耗了過多的執(zhí)行時(shí)間,從而可以決定如何優(yōu)化軟件,以獲得更好的時(shí)間性能。此外,性能分析工具還可以引導(dǎo)開發(fā)人員發(fā)現(xiàn)在系統(tǒng)調(diào)用中存在的錯(cuò)誤以及程序結(jié)構(gòu)上的缺陷。
-
覆蓋分析工具
在進(jìn)行白盒測(cè)試時(shí),可以使用代碼覆蓋分析工具追蹤哪些代碼被執(zhí)行過,分析過程一般通過插樁來完成,插樁可以是在測(cè)試環(huán)境中嵌入硬件,也可以是在可執(zhí)行代碼中加入軟件,或者是兩者的結(jié)合。開發(fā)人員通過對(duì)分析結(jié)果進(jìn)行總結(jié),可以確定哪些代碼被執(zhí)行過,哪些代碼被遺漏了。目前常用的覆蓋分析工具一般都會(huì)提供有關(guān)功能覆蓋、分支覆蓋、條件覆蓋等信息。
四、小結(jié)
現(xiàn)今的嵌入式系統(tǒng)在網(wǎng)絡(luò)化潮流的推動(dòng)下,已經(jīng)逐漸擺脫過去那種小巧而簡單的模式,開始進(jìn)入復(fù)雜度高、功能強(qiáng)大的階段,吸引了許多程序設(shè)計(jì)人員和硬件開發(fā)人員的視線。本文討論了嵌入式Linux系統(tǒng)的基本知識(shí)、開發(fā)流程、開發(fā)工具、調(diào)試工具、測(cè)試工具等,并指出了嵌入式系統(tǒng)的開發(fā)與一般通用計(jì)算機(jī)軟件開發(fā)的不同點(diǎn)及應(yīng)該注意的事項(xiàng),這些都是今后在進(jìn)行嵌入式Linux系統(tǒng)開發(fā)時(shí)必須具備的基礎(chǔ)知識(shí)。