嵌入式Linux開發系列之一: 走進嵌入式Linux的世界

轉載:http://www.ibm.com/developerworks/cn/linux/l-embed/part1/index.htmlhtml

 

隨着信息化技術的發展和數字化產品的普及,以計算機技術、芯片技術和軟件技術爲核心的嵌入式系統再度成爲當前研究和應用的熱點,通訊、計算機、消費電子技術(3C)合一的趨勢正在逐步造成,無所不在的網絡和無所不在的計算(everything connecting, everywhere computing)正在將人類帶入一個嶄新的信息社會。linux

0 評論:git

肖文鵬 (xiaowp@263.net), 碩士研究生, 北京理工大學計算機系程序員

2003 年 9 月 01 日算法

  • +內容

1、嵌入式系統

嵌入式系統是以應用爲中心,以計算機技術爲基礎,而且軟硬件是可裁剪的,適用於對功能、可靠性、成本、體積、功耗等有嚴格要求的專用計算機系統。嵌入式系統最典型的特色是與人們的平常生活緊密相關,任何一個普通人均可能擁有各種形形色色運用了嵌入式技術的電子產品,小到MP三、PDA等微型數字化設備,大到信息家電、智能電器、車載GIS,各類新型嵌入式設備在數量上已經遠遠超過了通用計算機。這也難怪美國著名將來學家尼葛洛龐帝在1999年1月訪華時就預言,4~5年後嵌入式智能工具將成爲繼PC機和Internet以後計算機工業最偉大的發明。數據庫

1.1 歷史與現狀編程

雖然嵌入式系統是近幾年纔開始真正風靡起來的,但事實上嵌入式這個概念卻很早就已經存在了,從上個世紀70年代單片機的出現到今天各類嵌入式微處理器、微控制器的普遍應用,嵌入式系統少說也有了近30年的歷史。縱觀嵌入式系統的發展歷程,大體經歷瞭如下四個階段:安全

  • 無操做系統階段性能優化

    嵌入式系統最初的應用是基於單片機的,大多以可編程控制器的形式出現,具備監測、伺服、設備指示等功能,一般應用於各種工業控制和飛機、導彈等武器裝備中,通常沒有操做系統的支持,只能經過彙編語言對系統進行直接控制,運行結束後再清除內存。這些裝置雖然已經初步具有了嵌入式的應用特色,但僅僅只是使用8位的CPU芯片來執行一些單線程的程序,所以嚴格地說還談不上"系統"的概念。服務器

    這一階段嵌入式系統的主要特色是:系統結構和功能相對單一,處理效率較低,存儲容量較小,幾乎沒有用戶接口。因爲這種嵌入式系統使用簡便、價格低廉,於是曾經在工業控制領域中獲得了很是普遍的應用,但卻沒法知足現今對執行效率、存儲容量都有較高要求的信息家電等場合的須要。

  • 簡單操做系統階段

    20 世紀80年代,隨着微電子工藝水平的提升,IC製造商開始把嵌入式應用中所須要的微處理器、I/O接口、串行接口以及RAM、ROM等部件通通集成到一片 VLSI中,製造出面向I/O設計的微控制器,並一舉成爲嵌入式系統領域中異軍突起的新秀。與此同時,嵌入式系統的程序員也開始基於一些簡單的"操做系統"開發嵌入式應用軟件,大大縮短了開發週期、提升了開發效率。

    這一階段嵌入式系統的主要特色是:出現了大量高可靠、低功耗的嵌入式 CPU(如Power PC等),各類簡單的嵌入式操做系統開始出現並獲得迅速發展。此時的嵌入式操做系統雖然還比較簡單,但已經初步具備了必定的兼容性和擴展性,內核精巧且效率高,主要用來控制系統負載以及監控應用程序的運行。

  • 實時操做系統階段

    20 世紀90年代,在分佈控制、柔性製造、數字化通訊和信息家電等巨大需求的牽引下,嵌入式系統進一步飛速發展,而面向實時信號處理算法的DSP產品則向着高速度、高精度、低功耗的方向發展。隨着硬件實時性要求的提升,嵌入式系統的軟件規模也不斷擴大,逐漸造成了實時多任務操做系統(RTOS),並開始成爲嵌入式系統的主流。

    這一階段嵌入式系統的主要特色是:操做系統的實時性獲得了很大改善,已經可以運行在各類不一樣類型的微處理器上,具備高度的模塊化和擴展性。此時的嵌入式操做系統已經具有了文件和目錄管理、設備管理、多任務、網絡、圖形用戶界面(GUI)等功能,並提供了大量的應用程序接口(API),從而使得應用軟件的開發變得更加簡單。

  • 面向Internet階段

    21 世紀無疑將是一個網絡的時代,將嵌入式系統應用到各類網絡環境中去的呼聲天然也愈來愈高。目前大多數嵌入式系統還孤立於Internet以外,隨着 Internet的進一步發展,以及Internet技術與信息家電、工業控制技術等的結合日益緊密,嵌入式設備與Internet的結合纔是嵌入式技術的真正將來。

    信息時代和數字時代的到來,爲嵌入式系統的發展帶來了巨大的機遇,同時也對嵌入式系統廠商提出了新的挑戰。目前,嵌入式技術與Internet技術的結合正在推進着嵌入式技術的飛速發展,嵌入式系統的研究和應用產生了以下新的顯著變化:

    1. 新的微處理器層出不窮,嵌入式操做系統自身結構的設計更加便於移植,可以在短期內支持更多的微處理器。
    2. 嵌入式系統的開發成了一項系統工程,開發廠商不只要提供嵌入式軟硬件系統自己,同時還要提供強大的硬件開發工具和軟件支持包。
    3. 通用計算機上使用的新技術、新觀念開始逐步移植到嵌入式系統中,如嵌入式數據庫、移動代理、實時CORBA等,嵌入式軟件平臺獲得進一步完善。
    4. 各種嵌入式Linux操做系統迅速發展,因爲具備源代碼開放、系統內核小、執行效率高、網絡結構完整等特色,很適合信息家電等嵌入式系統的須要,目前已經造成了能與Windows CE、Palm OS等嵌入式操做系統進行有力競爭的局面。
    5. 網絡化、信息化的要求隨着Internet技術的成熟和帶寬的提升而日益突出,以往功能單一的設備如電話、手機、冰箱、微波爐等功能再也不單一,結構變得更加複雜,網絡互聯成爲必然趨勢。
    6. 精簡系統內核,優化關鍵算法,下降功耗和軟硬件成本。
    7. 提供更加友好的多媒體人機交互界面。

1.2 體系結構

根據國際電氣和電子工程師協會(IEEE)的定義,嵌入式系統是"控制、監視或者輔助設備、機器和車間運行的裝置"(devices used to control, monitor, or assist the operation of equipment, machinery or plants)。通常而言,整個嵌入式系統的體系結構能夠分紅四個部分:嵌入式處理器、嵌入式外圍設備、嵌入式操做系統和嵌入式應用軟件,如圖1所示。

圖1 嵌入式系統的組成
圖1 嵌入式系統的組成
  • 嵌入式處理器

    嵌入式系統的核心是各類類型的嵌入式處理器,嵌入式處理器與通用處理器最大的不一樣點在於,嵌入式CPU大多工做在爲特定用戶羣所專門設計的系統中,它將通用 CPU中許多由板卡完成的任務集成到芯片內部,從而有利於嵌入式系統在設計時趨於小型化,同時還具備很高的效率和可靠性。

    嵌入式處理器的體系結構經歷了從CISC(複雜指令集)至RISC(精簡指令集)和Compact RISC的轉變,位數則由4位、8位、16位、32位逐步發展到64位。目前經常使用的嵌入式處理器可分爲低端的嵌入式微控制器(Micro Controller Unit,MCU)、中高端的嵌入式微處理器(Embedded Micro Processor Unit,EMPU)、用於計算機通訊領域的嵌入式DSP處理器(Embedded Digital Signal Processor,EDSP)和高度集成的嵌入式片上系統(System On Chip,SOC)。

    目前幾乎每一個半導體制造商都生產嵌入式處理器,而且愈來愈多的公司開始擁有自主的處理器設計部門,據不徹底統計,全世界嵌入式處理器已經超過1000多種,流行的體系結構有30多個系列,其中以ARM、PowerPC、MC 68000、MIPS等使用得最爲普遍。

  • 嵌入式外圍設備

    在嵌入系統硬件系統中,除了中心控制部件(MCU、DSP、EMPU、SOC)之外,用於完成存儲、通訊、調試、顯示等輔助功能的其餘部件,事實上均可以算做嵌入式外圍設備。目前經常使用的嵌入式外圍設備按功能能夠分爲存儲設備、通訊設備和顯示設備三類。

    存儲設備主要用於各種數據的存儲,經常使用的有靜態易失型存儲器(RAM、SRAM)、動態存儲器(DRAM)和非易失型存儲器(ROM、EPROM、 EEPROM、FLASH)三種,其中FLASH憑藉其可擦寫次數多、存儲速度快、存儲容量大、價格便宜等優勢,在嵌入式領域內獲得了普遍應用。

    目前存在的絕大多數通訊設備均可以直接在嵌入式系統中應用,包括RS-232接口(串行通訊接口)、SPI(串行外圍設備接口)、IrDA(紅外線接口)、I2C(現場總線)、USB(通用串行總線接口)、Ethernet(以太網接口)等。

    因爲嵌入式應用場合的特殊性,一般使用的是陰極射線管(CRT)、液晶顯示器(LCD)和觸摸板(Touch Panel)等外圍顯示設備。

  • 嵌入式操做系統

    爲了使嵌入式系統的開發更加方便和快捷,須要有專門負責管理存儲器分配、中斷處理、任務調度等功能的軟件模塊,這就是嵌入式操做系統。嵌入式操做系統是用來支持嵌入式應用的系統軟件,是嵌入式系統極爲重要的組成部分,一般包括與硬件相關的底層驅動程序、系統內核、設備驅動接口、通訊協議、圖形用戶界面(GUI)等。嵌入式操做系統具備通用操做系統的基本特色,如可以有效管理複雜的系統資源,可以對硬件進行抽象,可以提供庫函數、驅動程序、開發工具集等。但與通用操做系統相比較,嵌入式操做系統在系統實時性、硬件依賴性、軟件固化性以及應用專用性等方面,具備更加鮮明的特色。

    嵌入式操做系統根據應用場合能夠分爲兩大類:一類是面向消費電子產品的非實時系統,這類設備包括我的數字助理(PDA)、移動電話、機頂盒(STB)等;另外一類則是面向控制、通訊、醫療等領域的實時操做系統,如WindRiver公司的VxWorks、QNX系統軟件公司的QNX等。實時系統(Real Time System)是一種可以在指定或者肯定時間內完成系統功能,而且對外部和內部事件在同步或者異步時間內能作出及時響應的系統。在實時系統中,操做的正確性不只依賴於邏輯設計的正確程度,並且與這些操做進行的時間有關,也就是說,實時系統對邏輯和時序的要求很是嚴格,若是邏輯和時序控制出現誤差將會產生嚴重後果。

    實時系統主要經過三個性能指標來衡量系統的實時性,即響應時間(Response Time)、生存時間(Survival Time)和吞吐量(Throughput):

    • 響應時間 是實時系統從識別出一個外部事件到作出響應的時間;
    • 生存時間 是數據的有效等待時間,數據只有在這段時間內纔是有效的;
    • 吞吐量 是在給定的時間內系統可以處理的事件總數,吞吐量一般比平均響應時間的倒數要小一點。

    實時系統根據響應時間能夠分爲弱實時系統、通常實時系統和強實時系統三種。弱實時系統在設計時的宗旨是使各個任務運行得越快越好,但沒有嚴格限定某一任務必須在多長時間內完成,弱實時系統更多關注的是程序運行結果的正確與否,以及系統安全性能等其餘方面,對任務執行時間的要求相對來說較爲寬鬆,通常響應時間能夠是數十秒或者更長。通常實時系統是弱實時系統和強實時系統的一種折衷,它的響應時間能夠在秒的數量級上,普遍應用於消費電子設備中。強實時系統則要求各個任務不只要保證執行過程和結果的正確性,同時還要保證在限定的時間內完成任務,響應時間一般要求在毫秒甚至微秒的數量級上,這對涉及到醫療、安全、軍事的軟硬件系統來講是相當重要的。

    時限(deadline)是實時系統中的一個重要概念,指的是對任務截止時間的要求,根據時限對系統性能的影響程度,實時系統又能夠分爲軟實時系統(soft real-time-system)和硬實時系統(hard real-time-system)。軟實時指的是雖然對系統響應時間有所限定,但若是系統響應時間不能知足要求,並不會致使系統產生致命的錯誤或者崩潰;硬實時則指的是對系統響應時間有嚴格的限定,若是系統響應時間不能知足要求,就會引發系統產生致命的錯誤或者崩潰。若是一個任務在時限到達之時還沒有完成,對軟實時系統來講仍是能夠容忍的,最多隻會下降系統性能,但對硬實時系統來講則是沒法接受的,由於這樣帶來的後果根本沒法預測,甚至多是災難性的。在目前實際運用的實時系統中,一般容許軟硬兩種實時性同時存在,其中一些事件沒有時限要求,另一些事件的時限要求是軟實時的,而對系統產生關鍵影響的那些事件的時限要求則是硬實時的。

  • 嵌入式應用軟件

    嵌入式應用軟件是針對特定應用領域,基於某一固定的硬件平臺,用來達到用戶預期目標的計算機軟件,因爲用戶任務可能有時間和精度上的要求,所以有些嵌入式應用軟件須要特定嵌入式操做系統的支持。嵌入式應用軟件和普通應用軟件有必定的區別,它不只要求其準確性、安全性和穩定性等方面可以知足實際應用的須要,並且還要儘量地進行優化,以減小對系統資源的消耗,下降硬件成本。

1.3 關鍵問題

嵌入式系統是將先進的計算機技術、半導體技術以及電子技術與特定行業的具體應用相結合的產物,所以必然是一個技術密集、資金密集、高度分散、不斷創新的知識集成系統,嵌入式系統的開發充滿了競爭、機遇與創新,須要解決好以下一些關鍵問題:

  1. 內核精巧 嵌入式系統的應用領域通常都是小型電子裝置,系統資源相對有限,所以對內核的要求至關高,較之傳統的操做系統來說要小得多,例如ENEA公司推出的OSE分佈式嵌入式系統,整個內核只有5KB。
  2. 面向應用 嵌入式系統一般是面向用戶、面向產品、面向特定應用的。嵌入式系統中的CPU大多工做在爲特定用戶羣定製的環境中,具備低耗、體積小、集成度高等特色,在進行軟硬件設計時必須突出效率、去除冗餘,針對用戶的具體需求對系統進行合理的配置,方能達到理想的性能。
  3. 系統精簡 嵌入式系統中的系統軟件和應用軟件一般沒有明顯的區別,不要求其功能及實現上過於複雜,這樣一方面有利於控制系統成本,另外一方面也有利於保證系統安全。
  4. 性能優化 嵌入式系統一般都要求有必定的實時性保障,爲了提升執行速度和系統性能,嵌入式系統中的軟件通常都固化在存儲芯片或者處理器的內部存儲器件當中,而不是存貯在磁盤等外部載體中。因爲嵌入式系統的運算速度和存儲容量存在必定程度上的限制,並且大部分系統都必須有較高的實時性保證,所以對軟件質量(特別是可靠性方面)有着較高的要求。
  5. 專業開發 嵌入式系統自己並不具有自主開發能力,用戶不能直接在其上進行二次開發。當系統完成以後,用戶若是須要修改其中某個程序的功能,必須藉助一套完整的開發工具和環境。嵌入式系統中專用的開發工具和環境一般是基於通用計算機上的軟硬件設備,以及各類邏輯分析儀、混合信號示波器等。

回頁首

2、嵌入式Linux

Linux 從1991年問世到如今,短短的十幾年時間已經發展成爲功能強大、設計完善的操做系統之一,不只能夠與各類傳統的商業操做系統分庭抗爭,在新興的嵌入式操做系統領域內也得到了飛速發展。嵌入式Linux(Embedded Linux)是指對標準Linux通過小型化裁剪處理以後,可以固化在容量只有幾K或者幾M字節的存儲器芯片或者單片機中,適合於特定嵌入式應用場合的專用Linux操做系統。

2.1 優點

嵌入式Linux的開發和研究是操做系統領域中的一個熱點,目前已經開發成功的嵌入式系統中,大約有一半使用的是Linux。Linux之因此能在嵌入式系統市場上取得如此輝煌的成果,與其自身的優良特性是分不開的。

  • 普遍的硬件支持

    Linux 可以支持x8六、ARM、MIPS、ALPHA、PowerPC等多種體系結構,目前已經成功移植到數十種硬件平臺,幾乎可以運行在全部流行的CPU上。 Linux有着異常豐富的驅動程序資源,支持各類主流硬件設備和最新硬件技術,甚至能夠在沒有存儲管理單元(MMU)的處理器上運行,這些都進一步促進了 Linux在嵌入式系統中的應用。

  • 內核高效穩定

    Linux內核的高效和穩定已經在各個領域內獲得了大量事實的驗證,Linux的內核設計很是精巧,分紅進程調度、內存管理、進程間通訊、虛擬文件系統和網絡接口五大部分,其獨特的模塊機制能夠根據用戶的須要,實時地將某些模塊插入到內核或從內核中移走。這些特性使得Linux系統內核能夠裁剪得很是小巧,很適合於嵌入式系統的須要。

  • 開放源碼,軟件豐富

    Linux是開放源代碼的自由操做系統,它爲用戶提供了最大限度的自由度,因爲嵌入式系統千差萬別,每每須要針對具體的應用進行修改和優化,於是得到源代碼就變得相當重要了。Linux的軟件資源十分豐富,每一種通用程序在Linux上幾乎均可以找到,而且數量還在不斷增長。在Linux上開發嵌入式應用軟件通常不用從頭作起,而是能夠選擇一個相似的自由軟件作爲原型,在其上進行二次開發。

  • 優秀的開發工具

    開發嵌入式系統的關鍵是須要有一套完善的開發和調試工具。傳統的嵌入式開發調試工具是在線仿真器(In-Circuit Emulator,ICE),它經過取代目標板的微處理器,給目標程序提供一個完整的仿真環境,從而使開發者可以很是清楚地瞭解到程序在目標板上的工做狀態,便於監視和調試程序。在線仿真器的價格很是昂貴,並且只適合作很是底層的調試,若是使用的是嵌入式Linux,一旦軟硬件可以支持正常的串口功能時,即便不用在線仿真器也能夠很好地進行開發和調試工做,從而節省了一筆不小的開發費用。嵌入式Linux爲開發者提供了一套完整的工具鏈(Tool Chain),它利用GNU的gcc作編譯器,用gdb、kgdb、xgdb作調試工具,可以很方便地實現從操做系統到應用軟件各個級別的調試。

  • 完善的網絡通訊和文件管理機制

    Linux至誕生之日起就與Internet密不可分,支持全部標準的Internet網絡協議,而且很容易移植到嵌入式系統當中。此外,Linux還支持ext二、fat1六、fat3二、romfs等文件系統,這些都爲開發嵌入式系統應用打下了很好的基礎。

2.2 挑戰

目前,嵌入式Linux系統的研發熱潮正在蓬勃興起,而且佔據了很大的市場份額,除了一些傳統的Linux公司(如RedHat、MontaVista等)正在從事嵌入式Linux的開發和應用以外,IBM、Intel、Motorola等著名企業也開始進行嵌入式Linux的研究。雖然前景一片燦爛,但就目前而言,嵌入式Linux的研究成果與市場的真正要求仍有一段差距,要開發出真正成熟的嵌入式Linux系統,還須要從如下幾個方面作出努力。

  • 提升系統實時性

    Linux 雖然已經被成功地應用到了PDA、移動電話、車載電視、機頂盒、網絡微波爐等各類嵌入式設備上,但在醫療、航空、交通、工業控制等對實時性要求很是嚴格的場合中還沒法直接應用,緣由在於現有的Linux是一個通用的操做系統,雖然它也採用了許多技術來加快系統的運行和響應速度,而且符合POSIX 1003.1b標準,但從本質上來講並非一個嵌入式實時操做系統。Linux的內核調度策略基本上是沿用UNIX系統的,將它直接應用於嵌入式實時環境會有許多缺陷,如在運行內核線程時中斷被關閉,分時調度策略存在時間上的不肯定性,以及缺少高精度的計時器等等。正因如此,利用Linux做爲底層操做系統,在其上進行實時化改造,從而構建出一個具備實時處理能力的嵌入式系統,是如今日益流行的解決方案。

  • 改善內核結構

    Linux 內核採用的是總體式結構(Monolithic),整個內核是一個單獨的、很是大的程序,這樣雖然可以使系統的各個部分直接溝通,有效地縮短任務之間的切換時間,提升系統響應速度,但與嵌入式系統存儲容量小、資源有限的特色不相符合。嵌入式系統常常採用的是另外一種稱爲微內核(Microkernel)的體系結構,即內核自己只提供一些最基本的操做系統功能,如任務調度、內存管理、中斷處理等,而相似於文件系統和網絡協議等附加功能則運行在用戶空間中,而且能夠根據實際須要進行取捨。Microkernel的執行效率雖然比不上Monolithic,但卻大大減少了內核的體積,便於維護和移植,更能知足嵌入式系統的要求。能夠考慮將Linux內核部分改形成Microkernel,使Linux在具備很高性能的同時,又能知足嵌入式系統體積小的要求。

  • 完善集成開發平臺

    引入嵌入式Linux系統集成開發平臺,是嵌入式Linux進一步發展和應用的內在要求。傳統上的嵌入式系統都是面向具體應用場合的,軟件和硬件之間必須緊密配合,但隨着嵌入式系統規模的不斷擴大和應用領域的不斷擴展,嵌入式操做系統的出現就成了一種必然,由於只有這樣才能促成嵌入式系統朝層次化和模塊化的方向發展。很顯然,嵌入式集成開發平臺也是符合上述發展趨勢的,一個優秀的嵌入式集成開發環境可以提供比較完備的仿真功能,能夠實現嵌入式應用軟件和嵌入式硬件的同步開發,從而擺脫了"嵌入式應用軟件的開發依賴於嵌入式硬件的開發,而且以嵌入式硬件的開發爲前提"的不利局面。一個完整的嵌入式集成開發平臺一般包括編譯器、鏈接器、調試器、跟蹤器、優化器和集成用戶界面,目前Linux在基於圖形界面的特定系統定製平臺的研究上,與Windows CE等商業嵌入式操做系統相比還有很大差距,總體集成開發環境有待提升和完善。

回頁首

3、關鍵技術

嵌入式系統是一種根據特定用途所專門開發的系統,它只完成預期要完成的功能,所以其開發過程和開發環境同傳統的軟件開發相比有着顯著的不一樣。

3.1 開發流程

在嵌入式系統的應用開發中,整個系統的開發過程如圖2所示:

圖2 嵌入式系統的開發流程
圖2 嵌入式系統的開發流程

嵌入式系統發展到今天,對應於各類微處理器的硬件平臺通常都是通用的、固定的、成熟的,這就大大減小了由硬件系統引入錯誤的機會。此外,因爲嵌入式操做系統屏蔽了底層硬件的複雜性,使得開發者經過操做系統提供的API函數就能夠完成大部分工做,所以大大簡化了開發過程,提升了系統的穩定性。嵌入式系統的開發者如今已經從反覆進行硬件平臺設計的過程當中解脫出來,從而能夠將主要精力放在知足特定的需求上。

嵌入式系統一般是一個資源受限的系統,所以直接在嵌入式系統的硬件平臺上編寫軟件比較困難,有時候甚至是不可能的。目前通常採用的解決辦法是首先在通用計算機上編寫程序,而後經過交叉編譯生成目標平臺上能夠運行的二進制代碼格式,最後再下載到目標平臺上的特定位置上運行。

須要交叉開發環境(Cross Development Environment)的支持是嵌入式應用軟件開發時的一個顯著特色,交叉開發環境是指編譯、連接和調試嵌入式應用軟件的環境,它與運行嵌入式應用軟件的環境有所不一樣,一般採用宿主機/目標機模式,如圖3所示。

圖3 交叉開發環境
圖3 交叉開發環境

宿主機(Host)是一臺通用計算機(如PC機或者工做站),它經過串口或者以太網接口與目標機通訊。宿主機的軟硬件資源比較豐富,不但包括功能強大的操做系統(如Windows和Linux),並且還有各類各樣優秀的開發工具(如WindRiver的Tornado、Microsoft的Embedded Visual C++等),可以大大提升嵌入式應用軟件的開發速度和效率。

目標機(Target)通常在嵌入式應用軟件開發期間使用,用來區別與嵌入式系統通訊的宿主機,它能夠是嵌入式應用軟件的實際運行環境,也能夠是可以替代實際運行環境的仿真系統,但軟硬件資源一般都比較有限。嵌入式系統的交叉開發環境通常包括交叉編譯器、交叉調試器和系統仿真器,其中交叉編譯器用於在宿主機上生成能在目標機上運行的代碼,而交叉調試器和系統仿真器則用於在宿主機與目標機間完成嵌入式軟件的調試。在採用宿主機/目標機模式開發嵌入式應用軟件時,首先利用宿主機上豐富的資源和良好的開發環境開發和仿真調試目標機上的軟件,而後經過串口或者以網絡將交叉編譯生成的目標代碼傳輸並裝載到目標機上,並在監控程序或者操做系統的支持下利用交叉調試器進行分析和調試,最後目標機在特定環境下脫離宿主機單獨運行。

創建交叉開發環境是進行嵌入式軟件開發的第一步,目前經常使用的交叉開發環境主要有開放和商業兩種類型。開放的交叉開發環境的典型表明是GNU工具鏈、目前已經可以支持x8六、ARM、MIPS、PowerPC等多種處理器。商業的交叉開發環境則主要有Metrowerks CodeWarrior、ARM Software Development Toolkit、SDS Cross compiler、WindRiver Tornado、Microsoft Embedded Visual C++等。

3.2 交叉編譯和連接

在完成嵌入式軟件的編碼以後,須要進行編譯和連接以生成可執行代碼,因爲開發過程大可能是在使用Intel公司x86系列CPU的通用計算機上進行的,而目標環境的處理器芯片卻大多爲ARM、MIPS、PowerPC、DragonBall等系列的微處理器,這就要求在創建好的交叉開發環境中進行交叉編譯和連接。

交叉編譯器和交叉連接器是可以在宿主機上運行,而且可以生成在目標機上直接運行的二進制代碼的編譯器和連接器。例如在基於ARM體系結構的gcc交叉開發環境中,arm-linux-gcc是交叉編譯器,arm-linux-ld是交叉連接器。一般狀況下,並非每一種體系結構的嵌入式微處理器都只對應於一種交叉編譯器和交叉連接器,好比對於M68K體系結構的gcc交叉開發環境而言,就對應於多種不一樣的編譯器和連接器。若是使用的是 COFF格式的可執行文件,那麼在編譯Linux內核時須要使用m68k-coff-gcc和m68k-coff-ld,而在編譯應用程序時則須要使用 m68k-coff-pic-gcc和m68k-coff-pic-ld。

嵌入式系統在連接過程當中一般都要求使用較小的函數庫,以便最後產生的可執行代碼可以儘量地小,所以實際運用時通常使用通過特殊處理的函數庫。對於嵌入式Linux系統來說,功能愈來愈強、體積愈來愈大的C語言函數庫 glibc和數學函數庫libm已經很難知足實際的須要,所以須要採用它們的精化版本uClibc、uClibm和newlib等。

目前嵌入式的集成開發環境都支持交叉編譯和交叉連接,如WindRiver Tornado和GNU工具鏈等,編寫好的嵌入式軟件通過交叉編譯和交叉連接後一般會生成兩種類型的可執行文件:用於調試的可執行文件和用於固化的可執行文件。

3.3 交叉調試

嵌入式軟件通過編譯和連接後即進入調試階段,調試是軟件開發過程當中必不可少的一個環節,嵌入式軟件開發過程當中的交叉調試與通用軟件開發過程當中的調試方式有所差異。在通用軟件開發中,調試器與被調試的程序每每運行在同一臺計算機上,調試器是一個單獨運行着的進程,它經過操做系統提供的調試接口來控制被調試的進程。而在嵌入式軟件開發中,調試時採用的是在宿主機和目標機之間進行的交叉調試,調試器仍然運行在宿主機的通用操做系統之上,但被調試的進程倒是運行在基於特定硬件平臺的嵌入式操做系統中,調試器和被調試進程經過串口或者網絡進行通訊,調試器能夠控制、訪問被調試進程,讀取被調試進程的當前狀態,並可以改變被調試進程的運行狀態。

交叉調試(Cross Debug)又經常被稱爲遠程調試(Remote Debug),是一種容許調試器以某種方式控制目標機上被調試進程的運行方式,並具備查看和修改目標機上內存單元、寄存器以及被調試進程中變量值等各類調試功能的調試方式。通常而言,遠程調試過程的結構如圖4所示。

圖4遠程調試結構
圖4遠程調試結構

嵌入式系統的交叉調試有多種方法,能夠被細分紅不一樣的層次,但通常都具備以下一些典型特色:

  1. 調試器和被調試進程運行在不一樣的機器上,調試器運行在PC或者工做站上(宿主機),而被調試的進程則運行在各類專業調試板上(目標機)。
  2. 調試器經過某種通訊方式與被調試進程創建聯繫,如串口、並口、網絡、DBM、JTAG或者專用的通訊方式。
  3. 在目標機上通常會具有某種形式的調試代理,它負責與調試器共同配合完成對目標機上運行着的進程的調試。這種調試代理多是某些支持調試功能的硬件設備(如DBI 2000),也多是某些專門的調試軟件(如gdbserver)。
  4. 目標機多是某種形式的系統仿真器,經過在宿主機上運行目標機的仿真軟件,整個調試過程能夠在一臺計算機上運行。此時物理上雖然只有一臺計算機,但邏輯上仍然存在着宿主機和目標機的區別。

在嵌入式軟件開發過程當中的調試方式有不少種,應根據實際的開發要求和條件進行選擇。就調試方法而言,嵌入式系統的交叉調試能夠分爲硬件調試和軟件調試兩種,前者使用仿真調試器協助調試過程,然後者則使用軟件調試器完成調試過程。

  • 硬件調試

    相對於軟件調試而言,使用硬件調試器能夠得到更強大的調試功能和更優秀的調試性能。硬件調試器的基本原理是經過仿真硬件的執行過程,讓開發者在調試時能夠隨時瞭解到系統的當前執行狀況。目前嵌入式系統開發中最經常使用到的硬件調試器是ROM Monitor、ROM Emulator、In-Circuit Emulator和In-Circuit Debugger。

    採用ROM Monitor方式進行交叉調試須要在宿主機上運行調試器,在目標機上運行ROM監視器(ROM Monitor)和被調試程序,宿主機經過調試器與目標機上的ROM監視器創建通訊鏈接,它們之間的通訊遵循遠程調試協議。ROM監視器能夠是一段運行在目標機ROM上的可執行程序,也能夠是一個專門的硬件調試設備,它負責監控目標機上被調試程序的運行狀況,可以與宿主機端的調試器一同完成對應用程序的調試。在使用這種調試方式時,被調試程序首先經過ROM監視器下載到目標機,而後在ROM監視器的監控下完成調試,目前使用的絕大部分ROM監視器可以完成設置斷點、單步執行、查看寄存器、修改內存空間等各項調試功能。

    採用ROM Emulator方式進行交叉調試時須要使用ROM仿真器,它一般被插入到目標機上的ROM插槽中,專門用於仿真目標機上的ROM芯片。在使用這種調試方式時,被調試程序首先下載到ROM仿真器中,它等效於下載到目標機的ROM芯片上,而後在ROM仿真器中完成對目標程序的調試。ROM Emulator調試方式經過使用一個ROM仿真器,雖然避免了每次修改程序後都必須從新燒寫到目標機ROM中這一費時費力的操做,但因爲ROM仿真器自己比較昂貴,功能相對來說又比較單一,所以只適應於某些特定場合。

    採用In-Circuit Emulator(ICE)方式進行交叉調試時須要使用在線仿真器,它是仿照目標機上的CPU而專門設計的硬件,能夠徹底仿真處理器芯片的行爲,而且提供了很是豐富的調試功能。在使用在線仿真器進行調試的過程當中,能夠按順序單步執行,也能夠倒退執行,還能夠實時查看全部須要的數據,從而給調試過程帶來了不少的便利。嵌入式系統應用的一個顯著特色是與現實世界中的硬件直接相關,存在各類異變和事先未知的變化,從而給微處理器的指令執行帶來各類不肯定因素,這種不肯定性在目前狀況下只有經過在線仿真器纔有可能發現,所以儘管在線仿真器的價格很是昂貴,但仍然獲得了很是普遍的應用。

    採用In- Circuit Debugger(ICD)方式進行交叉調試時須要使用在線調試器。因爲ICE的價格很是昂貴,而且每種CPU都須要一種與之對應的ICE,使得開發成本很是高,一個比較好的解決辦法是讓CPU直接在其內部實現調試功能,並經過在開發板上引出的調試端口,發送調試命令和接收調試信息,完成調試過程。目前 Motorola公司提供的開發板上使用的是DBM調試端口,而ARM公司提供的開發板上使用的則是JTAG調試端口,使用合適的軟件工具與這些調試端口進行鏈接,能夠得到與ICE相似的調試效果。

  • 軟件調試

    軟件調試一般要在不一樣的層次上進行,有時可能須要對嵌入式操做系統的內核進行調試,而有時可能僅僅只須要調試嵌入式應用程序就能夠了。在嵌入式系統的整個開發過程當中,不一樣層次上的軟件調試須要使用不一樣的調試方法。

    嵌入式操做系統的內核調試相對來說比較困難,這是由於在內核中不便於增長一個調試器程序,而只能經過遠程調試的方法,經過串口和操做系統內置的"調試樁" (debug stub)進行通訊,共同完成調試過程。調試樁能夠當作是一個調試服務器,它經過操做系統得到一些必要的調試信息,而且負責處理宿主機發送來的調試命令。具體到嵌入式Linux系統內核,調試時能夠先在Linux內核中設置一個調試樁,用做調試過程當中和宿主機之間的通訊服務器,而後就能夠在宿主機中經過調試器的串口與調試樁進行通訊,並經過調試器控制目標機上Linux內核的運行。

    嵌入式應用軟件的調試可使用本地調試和遠程調試兩種方法,相對於操做系統的調試而言,這兩種方式都比較簡單。若是採用的是本地調試,首先要將所需的調試器移植到目標系統中,而後就能夠直接在目標機上運行調試器來調試應用程序了;若是採用的是遠程調試,則須要移植一個調試服務器到目標系統中,並經過它與宿主機上的調試器共同完成應用程序的調試。在嵌入式Linux 系統的開發中,遠程調試時目標機上使用的調試服務器一般是gdbserver,而宿主機上使用的調試器則是gdb,二者相互配合共同完成調試過程。

3.4 系統測試

嵌入式系統的硬件通常採用專門的測試儀器進行測試,而軟件則須要有相關的測試技術和測試工具的支持,並要採用特定的測試策略。測試技術指的是軟件測試的專門途徑,以及可以更加有效地運用這些途徑的特定方法。在嵌入式軟件測試中,經常要在基於目標機的測試和基於宿主機的測試之間作出折衷,基於目標機的測試須要消耗較多的時間和經費,而基於宿主機的測試雖然代價較小,但畢竟是在仿真環境中進行的,所以難以徹底反映軟件運行時的實際狀況。這兩種環境下的測試能夠發現不一樣的軟件缺陷,關鍵是要對目標機環境和宿主機環境下的測試內容進行合理取捨。

測試工具指的是那些可以用來輔助測試的工具,測試工具主要用來支持測試人員的測試工做,自己不能直接用來進行測試,測試工具通常都是通用工具,測試人員應該根據實際狀況對它們進行適當的調整。嵌入式軟件測試中常常用到測試工具主要有內存分析工具、性能分析工具、覆蓋分析工具、缺陷跟蹤工具等。

  • 內存分析工具

    嵌入式系統的內存資源一般是受限的,內存分析工具能夠用來處理在進行動態內存分配時產生的缺陷。當動態分配的內存被錯誤地引用時,產生的錯誤一般難以再現,可出現的失效難以追蹤,使用內存分析工具能夠很好地檢測出這類缺陷。目前經常使用的內存分析工具備軟件和硬件兩種,基於軟件的內存分析工具可能會對代碼的執行性能帶來很大影響,從而影響系統的實時性;基於硬件的內存分析工具價格昂貴,而且只能在特定的環境中使用。

  • 性能分析工具

    嵌入式系統的性能一般是一個很是關鍵的因素,開發人員通常須要對系統的某些關鍵代碼進行優化來改進性能,而首先遇到的問題天然就是肯定須要對哪些代碼進行優化。性能分析工具能夠爲開發人員提供有關的數據,說明執行時間是如何消耗的,是何時消耗的,以及每一個進程所使用的時間。這些數據能夠幫助肯定哪些進程消耗了過多的執行時間,從而能夠決定如何優化軟件,以得到更好的時間性能。此外,性能分析工具還能夠引導開發人員發如今系統調用中存在的錯誤以及程序結構上的缺陷。

  • 覆蓋分析工具

    在進行白盒測試時,可使用代碼覆蓋分析工具追蹤哪些代碼被執行過,分析過程通常經過插樁來完成,插樁能夠是在測試環境中嵌入硬件,也能夠是在可執行代碼中加入軟件,或者是二者的結合。開發人員經過對分析結果進行總結,能夠肯定哪些代碼被執行過,哪些代碼被遺漏了。目前經常使用的覆蓋分析工具通常都會提供有關功能覆蓋、分支覆蓋、條件覆蓋等信息。

回頁首

4、小結

現今的嵌入式系統在網絡化潮流的推進下,已經逐漸擺脫過去那種小巧而簡單的模式,開始進入複雜度高、功能強大的階段,吸引了許多程序設計人員和硬件開發人員的視線。本文討論了嵌入式Linux系統的基本知識、開發流程、開發工具、調試工具、測試工具等,並指出了嵌入式系統的開發與通常通用計算機軟件開發的不一樣點及應該注意的事項,這些都是從此在進行嵌入式Linux系統開發時必須具有的基礎知識。

參考資料

  • http://www.embeddedtechnology.com是嵌入式系統技術的核心網站,包括許多最新的嵌入式領域的技術動態,以及大量的嵌入式產品、開發工具、產品提供商的介紹。
  • http://www.ddjembedded.com是嵌入式系統雜誌《Dr. Dobb's Embedded Systems》的官方網站,包含大量與嵌入式系統相關的文章。
  • Karim Yaghmour,Building Embedded Linux Systems,USA:O'Reilly,2003
  • 魏忠,蔡勇,雷紅衛編著,嵌入式開發詳解,北京:電子工業出版社,2003
  • 李善平,劉文峯,王煥龍等編著,Linux與嵌入式系統,北京:清華大學出版社,2003
  • 探矽工做室著,嵌入式系統開發聖經,北京:中國鐵道出版社,2003
相關文章
相關標籤/搜索