歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> Linux文化

嵌入式系統以及如何構造一個嵌入式系統概覽


大多數的Linux系統運行於PC平台,但是,Linux也可在嵌入式系統中可靠的工作。此篇論文講述了嵌入式系統的概況,以及論證了有關Linux應用於商業嵌入式系統的問題。

嵌入式系統 ---- 比摩西還老
那些用以控制設備的計算機,或叫嵌入式系統,差不多同計算機本身一樣早地出現在我們的周圍。

在通信領域中,這些嵌入式系統早在20世紀60年代後期就被用來控制電話的電子式機械交換並被稱為“存儲程控控制“系統“計算機”一詞在那時尚不常見;所謂的存儲程序是指那些放有程序和路由信息的內存。存儲這些控制邏輯而不是用硬件來實現是在觀念上的一種真正突破,現今,我們早認為這種工作機理是理所當然的了。

為適應每一個應用,這些計算機是被定做出來的(簡言之,這些計算機是面向應用的).按今天的標准來看,他們有著奇怪的專用指令以及與主要計算引擎集成在一起的I/O設備,就像一批突變異種者.

微處理器通過提供一個小巧低價的並可以在大系統中像搭積木那樣使用的CPU引擎改變了這一情況;它利用一基於被一條總線掛接在一起的不同外設所構建的嚴格的硬件體系結構並提供一個可以簡化編程的通用目的編程模型.

同硬件一起,軟件也得到了發展.最初,只有一些簡單的開發工具可供用以創建和調試軟件.各工程項目的運行軟件通常以信手塗鴉的方式編出來.由於編譯器經常有很多錯誤而且也缺乏象樣的調試器,這些軟件差不多總是用匯編語言或宏語言來寫.采用軟件構建塊和標准庫的編程思想直到20世紀70年代中期才流行起來.

用於嵌入式系統的與"擱架"無關的操作系統(OS)在20世紀70年代後期開始出現.它們中的許多是用匯編語言寫就的並且僅能用於為其編寫的微處理器上.當這些微處理器變得過時的時候,它們使用的OS也厄運同臨.只能在新的處理器上從新寫一遍才能運行.今天,許多這種早期的系統只不過成了人們模糊的記憶,還有人能記起MTOS嗎?當C語言出現後,OS可以用一種高效的,穩定的和可移植的方式來編寫.這種方式對使用和經營有直接的吸引力,因為它承載著人們當微處理器廢棄不用時能保護他們的軟件投資的希望.聽起來,有點兒像商業市場營銷中的一段傳奇故事.用C來編寫OS已經成了一種標准直至今天.總之,軟件的可復用性已經為人接受而且正在很好地發揮作用.

在20世紀80年代早期,我特別喜愛的OS是Wendon操作系統;大概只要150美金,就可以獲得它的C源代碼庫.它是一個開發套件,人們可以通過選擇一些組件來構建自己的OS---整個過程就像是從中餐菜單裡訂餐一樣.比如,可以從庫中的多個可行選項列表中精選出一種任務調度算法和內存管理方案.

許多用於嵌入式系統的的商業操作系統在20世紀80年代獲得了蓬勃發展.(Wendon)這一原始的炖菜已經發展成為了商業操作系統這一現代炖肉.今天已經有幾打的商業性操作系統可供選擇.出現了許多互相競爭的產品,如VxWorks,pSOS,Neculeus和WindowsCE.

許多嵌入式系統根本就沒有操作系統,只不過有一個控制環而已.對很簡單的嵌入式系統來說,這可能已經足夠.不過,隨著嵌入式系統在復雜性上的增長,一個操作系統顯得重要起來,因為否則的話,將使(控制)軟件復雜度變得極不合理.可悲的是,現實中確實有一些復雜得另人生畏的嵌入式系統,而且它們之所以變得復雜就因為它們的設計者堅持認為它們的系統不需要操作系統.

漸漸地,更多的嵌入式系統需要被連接到某些網絡上,因而,需要在嵌入式系統中有網絡協議棧(支持);甚至很多賓館中的門把手都有一個連接到網絡的微處理器.

把網絡棧添加到一個僅用控制環來實現的簡單嵌入式系統所帶來的復雜程度可能足以喚起人們對一個操作系統的渴望.

除了各種商業性操作系統以外,還有多種私擁操作系統.其中,有很多是塗鴉式寫就的,像Cisco公司的IOS等.有些則源於對別的操作系統的改寫,像很多網絡產品都衍生於同一版本的伯克利UNIX操作系統,因為後者有完整的網絡支持能力;而還有一些則基於公共域OS,比如KA9Q就來源於PhilKarn.

作為侯選的嵌入式操作系統,LINUX有一些引人的優勢:它可以移植到多個有不同結構的CPU和硬件平台上,很好的穩定性,各種性能的升級能力,而且開發更容易.。

開發工具--打破了傳統仿真器的阻礙
在開發嵌入式系統中極為關鍵的一項是有各種可用的工具.就像任何一個行當一樣,好的工具有助於快捷而圓滿地完成任務;在嵌入式系統開發的不同階段,可能要用到不同的工具.

傳統上,開發嵌入式系統的首選工具是仿真器。這是一塊比較昂貴的設備,一般插於微處理器和它的總線之間的電路中,從而讓開發者監視和控制所有輸入和輸出 微處理器的各種活動和行為.在裝配起來,可能有一些困難,並且由於它們的侵入性,裝上後可能造成不穩定 的性能;盡管這樣,它們卻能在總線級上給出一個系統正在發生什麼的清晰的描繪並排除了很多在硬件和軟件 接口最底層上的猜測工作.

在以往,一些工程項目依賴它--經常在開發周期中的各個階段--作為主要的調試工具.不過,一旦當編制的軟件 有能力支持一個串型口的時候,大量的調試可以不用ICE而使用別的方法來完成.同樣,大部分新一代的嵌入式系統 采用蠻像食譜式的微處理器設計;通信工作的啟動代碼常常是具備的以使串型口盡快地工作,這意味著開發者能 在沒有ICE的情況下也能很好地進展;去掉了ICE,從而降低了開發成本.一旦串型口可以工作起來,便能用於支持那 些日漸復雜的開發工具的相關(軟件)層

LINUX基於GNU C 編譯器;後者作為GNU工具集的一組成部分,和源碼級調試器gdb一起工作,提供了在開發一個嵌入式 LINUX系統中要用到的所有軟件工具.下面是在為一個新的硬件開發一個新的嵌入式LINUX系統時要用到的典型調試 工具的序列和步驟:

1:寫出或移植一段啟動代碼(後面再詳細討論);

2:寫一段代碼在串型口上輸出一字符串,像"Hello,World!"(其實,我更喜歡人類發明電話後,通過電話說的第一句話"Watson, come here I need you");

3:移植gdb目標碼使之能在串型口上工作.這將允許向另一台正運行著gdb程序的LINUX主機會話;你只不過要告訴 gdb是通過串型口調試該目標程序;gdb通過串型口與你的測試計算機上的gdb目標碼會話並給出全部C源碼級的 調試信息.你也可以利用這一(通信)能力把附加的代碼下載到RAM或閃存中.

4:借助gdb,執行余下的直到LINUX內核開始接管之前的所有硬件和軟件的初始化代碼.

5: 一旦LINUX內核啟動後,上述的串型口就成為LINUX的控制台端口並可以利用它的便利來進行後繼開發過程.再使用gdb的內核調試版本kgdb.這一步常常不是必需的.如果你有一個網絡連接,比如,10BaseT,你或許會想讓它緊接著工作起來.

6: 如果你的目標平台運行的Linux kernel是全功能的(即:未經刪減過功能),你可以利用gdb或其圖形化替代品如xgdb去調試你的應用進程.

實時--真是這樣嗎?
輕率,大部分的系統並不是如此。嵌入式系統經常被錯誤地說做實時系統,但是它們中的大多數並不具備實時特性。實時性僅僅是相對的。實時嚴謹地定義應為硬實時:能在極短的時間(毫秒級)內響應,並以某種確定的方式處理事件。現在,許多硬實時功能正逐漸集中在DSP或ASIC的設計中,通過一些適當的硬件,如FIFO,DMA或其它專用硬件來實現。

對大多數系統來說,有1到5毫秒的實時響應時間應足夠了。當然,另一種寬松的要求也是可以接受的,例如:

Windows 98的處理監視器崩潰畫面的中斷,要求必須在4微秒之內處理的,占所有情況的98%;而在20微秒之內處理的,占各情況的100%.

這些寬松的實時要求可以很容易達到.實現它們過程中涉及到一些探討,包括現場切換,中斷延遲,任務選優和調度.

現場切換曾一度成為操作系統界的一個熱點話題,不過,由於大多數CPU在這點上處理得比較令人滿意而且CPU速度現在已經變得足夠的快,現場切換現已不再是主要關注點了.

實時的嚴格性要求通常應由一個中斷例程或內核中的現場驅動函數來處理以確保行為的一致性.當中斷發生後,處理該中斷所用的時間,即中斷延遲,在很大程度上,由中斷優先級與其它能臨時屏蔽該中斷的軟件決定.

(實時系統中的)中斷必須應被高效地設計和安排以確保滿足時間上的要求,就像在其它OS中那樣.在Intel X86處理器系列中,這項工作可以能被擴充了實時性的Linux很好地處理.(實時Linux,即:RTLinux,參看http://www.rtlinux.org/).從本質上說,它提供了一個把Linux作為其後台任務而運行的中斷處理調度器.(This essentially provides an interrupt processing scheduler that runs Linux as its background task)一些關鍵(臨界)中斷可以不為Linux其他部分所知地得到服務(處理),因而,你就有了對臨界時間的控制權.這種做法提供了實時級別和時間限制性較為寬松的基本Linux級別之間的界面.並提供了一個與別的嵌入式操作系統類似的實時處理框架.從根本上講,為滿足實時性要求,采用了把實時性的關鍵(臨界)代碼段隔離開來並進行高效的安排,然後對該段代碼的處理結果再以更一般的方式(或許在進程級別上)來做進一步處理.

嵌入式系統--定義
一種觀點認為: 如果某種應用沒有用戶界面,從而,用戶不能直接地和它交互,那麼它就是嵌入式系統.這當然太過簡單化了.電梯控制系統是嵌入式系統,但卻有一個用戶界面: 選擇樓層的按鈕和顯示電梯正到達幾層的指示器. 對於那些連入網絡的嵌入式系統,如果該系統包含一個用於監視和控制的web服務器,界面上的區別就更顯模糊了.一個較好的定義應強調在該系統的重要功能或主要用途上.

由於Linux可以提供一個用以執行嵌入功能的基本內核以及各種你想要的用戶界面元素,所以Linux有很強的通用特點.它能處理嵌入性任務和有關用戶界面兩方面的作業.可以把Linux看作如下的一個連續體:

從一個只有內存管理,任務調度,定時器服務的縮簡的微內核到一個支持各種文件系統和多種網絡服務的完整服務器.

一個最小的嵌入式系統僅需如下基本組成部分:

1 : 一個用作引導的可用設施(工具);

2 : 一個具備內存管理,進程管理,和定時器服務的Linux微內核;

3 : 一個初始進程;

為讓上面的最小嵌入式系統變得有一定實用性,尚需加上一些東西:

1 : 硬件的驅動程序;

2 : 一個或幾個應用進程以提供必要的應用功效.

隨著對系統要求的增加,也許還要用到下面這些組件:

1 : 一個文件系統(或許放在ROM或RAM中);

2 : TCP/IP 網絡協議棧;

3 : 一個磁盤用來存放半易失性數據和提供交換能力.

硬件平台
挑選最好的硬件是一項很復雜的工作,充滿著各種顧忌和干擾:公司的政策,各種成(偏)見,其它工程的影響以及缺乏完整或准確的信息.

成本經常是一個關鍵性因素.當你著眼成本時,一定要考慮產品的整體成本,而不要只看到CPU;有時一個快速而廉價的CPU可能成了這個產品的耗價的問題根源,一旦當你加上總線和延遲邏輯以便同你的各種外設協同工作的時候.如果你是一個僅管聽命的軟件員,那麼你就只能對早已作好的決定撞運氣了,如果你是系統的設計者,就需要盡力制訂一個合理的預算並且所選用的硬件要能令你滿意地處理實時任務.

從實際中觀察CPU到底需要多快方能把工作做好,然後把這個速度乘3(才是系統將所要的CPU速度);因為CPU在理論上所能達到的能力到了現實中總是難以置信地大打折扣!不要忘記緩存對你的系統的影響.

也要計算出總線需要運行多快,如果有二級總線(像一條PCI總線那樣),也要把它們包含進來;一條慢的或過多參與DMA傳輸的總線能夠讓一個快速的CPU變成在爬行.

有集成外設的CPU很不錯,因為很少有硬件需要調試.而且,為支持主流CPU,它們的驅動程序經常是可用的.不過在我以往的工程中,這些芯片對外設的組合好象總是不合理或者缺少我們期望的性能(功能);同樣,正因為這些外設被集成在一起,所以不要設想這會是一個最低價的(硬件平台)方案.

把10磅的Linux塞進5磅的口袋
對Linux的一個通常觀點是,它由於太大而不宜用作嵌入式系統.這種觀點不一定是真實的.面向PC機的Linux典型發布版有很多你根本用不上的功能特征甚至也超過了一個真正PC用戶的需求.

首先,我們要把內核和各種任務分開來.標准的Linux內核總是長駐內存的.每一個要運行的應用程序需要從磁盤中裝載到內存中,並在那裡被執行.當該程序運行結束,它占用的內存被釋放掉,也就是說,該程序被卸載掉.在一個嵌入式系統中,可能不存在一個磁盤.因系統的復雜程度和硬件的不同設計,有兩種方法可用以擺脫對一個磁盤的依賴性.在一個簡單的系統中,當系統啟動後,內核和各種應用進程均駐留在內存中--這是大多數傳統嵌入式系統的工作方式.Linux也支持這種方式.

使用Linux, 出現了另外一種方式.既然Linux有裝載和卸載程序的能力,一個嵌入式系統可以利用這一點以節省RAM.考慮一個比較典型的系統:有大約8兆到16兆的閃存和8兆RAM;那麼閃存可以被用作文件系統.用閃存驅動程序作為從閃存到文件系統的界面.作為一種選擇,也可以用一個閃存磁盤.這是用閃存來擺脫系統對一個磁盤的需求(依賴).使用這種方式的一個例子是M-System(http://www.m-systems.com/)中的DiskOnChip技術,它可以支持160MB.所有應用程序以文件的形式被存放在閃存文件系統中並在必要的時候被裝載到內存中;這種"用到時才裝載"的能力是一個很強大的特征,從而可以很容易地具有(支持)以下各種能力:

1: 允許系統啟動後拋棄(釋放)那些初始化代碼(空間).典型地,Linux用到很多運行在內核外部的工具性程序(utilities).它們通常僅在系統初始化期間運行一次,以後將再也用不到.而且,它們以互斥的方式,一個接一個地依序運行.這樣,隨著系統的啟動,一段內存可以被反復地使用:"以頁調入"的方式運載每一個程序.這可以很好地節省內存,特別是處理像網絡棧那樣的對象時,因為這些對象一經配置便永不更變.

2: 如果Linux之支持可動態裝卸模塊的特征被包含在內核之中,不僅各種應用程序,驅動程序也可被動態裝卸.這樣,系統能夠檢查硬件環境並有選擇性地僅僅裝載那些適應當前硬件環境的軟件.這可以取消(降低)讓一個程序以占用更多閃存的代價處理眾多硬件變數的復雜性.

3: 系統的升級更加標准化(模塊化),你可以常常在系統運行過程中升級一些應用和驅動程序.

4: 配置信息和運行時間參數可作為數據文件存放在閃存中.

無虛擬內存交換
另外一個Linux的特性就是虛擬內存交換。這一特性將應用程序的編寫引入歧途,應用程序的內存需求量可以無限制地上升,因為操作系統在磁盤中提供了交換空間。而在一個無盤的嵌入式系統中,這種特性就用不上了。

如此強大的功能,在嵌入式系統中竟無用武之地。事實上,在一個嚴格的實時系統中你可能並不需要這種特性,因為它會導致定時功能的失控。如同其它的嵌入式系統一樣,軟件的設計必須很緊湊,以適應較小的物理內存。

注意,這取決於你的CPU體系,比較明智的做法是保留Linux的這段代碼,畢竟,砍掉這些代碼,還是要付出一些工作量的。但是,這些代碼依然有保留的理由。因為它們能夠支持代碼共享,多個進程可以共享某一軟件的同一拷貝。如果無此功能,那麼,每一個程序都必須擁有庫程序的獨立拷貝,例如:printf 。

將交換空間大小簡單地置為零,就可以關掉系統虛擬內存的分頁交換機制了。當你的程序要求內存大於實際的內存時,系統的表現就如同交換空間溢出時一樣:你的程序不會被加載,或者,當要求過多內存時,malloc 調用失敗。

在許多的CPU體系中,虛存機制提供的內存管理可使進程的地址空間相互隔離。一般在嵌入式系統中不是這樣,地址空間是簡單的,平坦的情況。Linux的虛存機制使出錯的進程不致影響整個系統。在許多嵌入式系統中,因為效率原因而設置的全局數據,同時被幾個進程所共享,這在Linux中也存在,那就是內存共享,它可以經過設置,使某一段內存成為共享內存。

文件系統
許多嵌入式系統不存在一個磁盤或者一個文件系統。沒有它們中的任何一個,Linux也可以運行。正如前面提到的那樣,應用任務可以隨同內核一起被編譯並在啟動時作為一個映像被加載.對簡單系統來說,這已經勝任.不過,它卻缺少前面描述到的各種靈活性.

事實上,如果你觀察過許多商業性嵌入式系統,你會發現他們把文件系統作為可選項來提供.大部分要麼是一個私人擁有的(專門)文件系統,要麼是一個與MS-DOS兼容的文件系統.Linux不但支持許多其它文件系統也支持MS-DOS兼容的文件系統,通常推薦使用除MS-DOS兼容文件系統以外的其它文件系統,因為它們有較優的健壯性和容錯性.Linux也有檢查和修復工具(不過商業賣主一般不提供),這對從網絡上進行更新的閃存系統尤為重要.如果系統在升級中斷電,可能導致系統無法再用.一個修復工具通常可以排解此類問題.

文件系統可以放在一個傳統磁盤驅動中,或閃存中,或任何可用的其它介質中.同樣,一個小的RAM disk常常可以很好地存放暫時性文件(易失性文件).閃存被分隔成很多小塊(並被組織起來).它們中可能有一個引導塊,它存放了CPU上電後運行的第一個軟件.可能存放的就是Linux的引導程序.余下的閃存塊可以被用作文件系統.Linux的內核可以被引導程序從閃存中拷貝到RAM中;或者,作為另一種選擇,可以把內核放在閃存的一個獨立區中並從那裡直接運行.

對一些系統來說,另一可行的選擇是包含一個廉價的CD-ROM驅動.它可能比閃存還要便宜.並且借助更換CD-ROM盤片就可很容易地得到升級.通過這種方法,Linux只需從CD-ROM啟動並可以像對一個硬盤那樣從該CD-ROM中獲得所有用到的程序.

最後,對於網絡上的嵌入式系統(有網絡支持的嵌入式系統),Linux支持NFS(Network File System).這一著打開了在一個網絡支持系統中實現各種增值特征的通道.首先它允許通過網絡加載各種應用程序.由於用在每一個嵌入式系統上的軟件可以從一個公用的服務器上加載,這在控制軟件的修訂或升級中是很重要的.在系統運行的過程中,導入和導出數據,配置,狀態信息的一個備份也很有用.對用戶監控而言,這是一個非常強大的特征;舉例來說,一個嵌入式系統可能裝配了一個RAM disk,它包含著與系統當前狀態的更新維持一致的(狀態)文件.那麼別的嵌入式系統僅需通過網絡把這個RAM disk作為遠程磁盤mount過來便可以訪問那些位於遠端RAM disk中的狀態文件.這也允許在另一台機器上的WEB服務器借助簡單的CGI腳本來訪問那些狀態信息.運行在其他機器上的應用程序包能夠很容易地訪問這些數據.對更復雜的監控,像MatLab(http://www.mathworks.com/products/matlab/)這樣的一個應用程序包能很容易地用圖形化來顯示在一個系統操作者的PC或工作站上的系統操作.

引導內核--當沒有LILO或BIOS時
當一個微處理器最初啟動時,它首先執行在一個預定地址處的指令.通常這個位置是只讀內存,其中存放著系統初始化或引導程序.在PC中,它就是BIOS.這些程序要執行低級的CPU初始化並配置其他硬件.BIOS接著判斷出哪一個磁盤包含有操作系統,再把OS拷貝到RAM中,並把控制權交給OS.實際上,整個過程遠非這麼簡單,不過對我們的理解已經足夠.運行在PC上的Linux系統依賴於該PC的BIOS來提供這些配置和OS加載功能.

在一個嵌入式系統裡,常常沒有上述的BIOS;這樣,你就需要去提供等價的啟動代碼.還好,一個嵌入式系統的BIOS並不需要像PC BIOS引導程序那樣有那麼多的靈活性,因為它通常僅需處理一種硬件配置方案.這些代碼比較簡單但也另人厭煩.它是一些把特定的數寫入指定硬件寄存器的指令序列.不過這是很關鍵的代碼,因為這些數值必須要符合你的硬件並且要按特定順序來完成.在大多數情況下,(這些代碼中)有一個最小化的加電自檢模塊用以檢查內存,讓一些LED閃現一下,也可能探測一些其它讓Linux OS啟動和運行的必要硬件.這些啟動代碼是高度硬件專用性的,因而,不具移植性.

有幸的是,大多數系統為核心微處理器和內存使用了食譜式的硬件設計.典型地,芯片制造商有一個可供設計參考的演示板--新設計多少可以從中直接拷貝一些.對這些食譜式的設計,經常有現成的啟動代碼可用,而且可以很容易地被修改以適應你的需要.很少(會遇到)有需要從頭開始編寫的啟動代碼.

為了測試你的(啟動)代碼,你可以使用一個包含它自己的仿真內存的電子仿真器(in-circuit emulator),這裡的仿真內存用以替換目標內存.你把待測代碼加載到仿真器中並通過仿真器調試它.如果沒有可用的仿真器,也可以跳過這一步,不過需要一個較長的調試周期.

這些代碼最終要從非易失性存儲器中運行,通常是用閃存或EPROM芯片,你要想辦法把這些代碼放進前述芯片中,放入的具體方法依賴於"目標"硬件和工具.一個常見的方法是把閃存或EPROM芯片插入到一個EPROM或閃存"燒爐"中.這種方法將把你的程序"燒入"(存入)芯片中.然後,把芯片插入到你目標板上的一個插槽中,打開電源.這種方法要求在板子上具有插槽化(socketed)部分;然而,有些設備包格式(結構)不允許被插槽化(socketed).

另一種辦法是通過一個JTAG接口.一些芯片包含一個JTAG接口,從而可以對芯片編程.這是一種最簡便的辦法.芯片可以被永久地焊接到板子上.一段電纜從板子上的JTAG連接器(通常是一個PC卡)連接著一個JTAG接口.接下來要求在操縱JTAG接口的PC上做一些用戶定制性編程.在僅需較少運行量的產品中,也可以使用這種方法.

健壯性---比政客的承諾還可靠
這是顯而易見的,作為一種選擇,Linux已被普遍地認為能夠在PC平台上可靠地,穩定地運行。嵌入式內核自身有多穩定?對於大多數微處理器來說,Linux是很好用的。將Linux移植到新的微處理器體系也是非常迅捷的。一般是將其移植到一種新型的目標板,這種新型的目標板包含有獨特的外設,當然還有CPU.

幸運的是,大部分的內核代碼都是相同的,因為它們與微處理器無關,所以,移植的工作都集中在那些不同的部分,通常是一些存儲器管理及中斷處理程序。一旦完成,它們往往是非常穩定。如同前面談到的,引導的過程非常依賴於硬件的變化而變化,所以,一定要周密地計劃一番。

設備驅動程序雖然變化多端,但其中一些已相當穩定。同時,你的選擇也不算太多,一旦離開PC平台,那就只有自己去寫了。所幸的是,在我們周圍已有許多既有的設備驅動程序,你總能找到一個近似的,而去修改它。驅動程序的接口是明確定義的。大多數驅動程序之間都是相似的,所以,移植一個磁盤,網絡,串行口驅動程序,從一個設備到另一種,經常不是太難。我發現大多數的驅動程序都寫的很好,並很好理解,而難題反而是在我手上的那本講解內核結構的書。

就我個人的經驗而言,Linux與我曾經使用過的那些頂頂大名的商業操作系統一樣穩定。總的來說,關於這些操作系統(包括Linux)的問題都源於對系統工作策略的誤解,而不是純代碼bug或基本設計錯誤。大量的操作系統的bug故事,在這裡沒有必要再重提。而Linux的優點,就在於其源碼是公開的,並有很好的注釋和完整的文檔說明,從而,你也就擁有了控制與解決一切問題的能力基礎。

即內核與驅動程序之後,還有一點:如果一個系統中有一只硬盤,那麼,系統的可靠性可能會成為問題。我們擁有兩年的經驗和時間,都沉浸在有盤嵌入式系統中。這些系統從不關機,電源有幾次被意外地斷掉,可是,EXT2文件系統表現得很好。標准的Linux初始化腳本運行了fsck程序。這個程序做了一個漂亮的檢查與清理不正常節點的工作。還有一處英明之舉,也是一處較大的變動,我們將update程序由30秒執行一次,調整為5或10秒執行一次。這使得磁盤高速緩存中的數據能較頻繁地寫回到磁盤裡,從而,降低了丟失數據的可能性。

沒有萬能鑰匙
嵌入式Linux當然有它的不足。比如,它很占內存,盡管不比一些商業競爭者的情況更壞。但可以通過消減一些不必要的功能來改善,也有可能得不償失,因為很可能會產生比較嚴重的bug。

大多數Linux應用程序都會使用虛擬內存交換,這在很多嵌入式系統中是一種非確定因素,所以,不要假定任何一個無盤嵌入式系統能夠運行什麼Linux應用程序。

低等級的,內核級的調試工具仍然不是很好使。kgdb會使人感到很不適應,你常要reboot。很不幸,調試仍然是以打印語句為主。

對於我來說最嚴重的問題是心理作用。Linux是一種極具適用性的操作系統。可是,嵌入式系統在通常情況下是不具備這種性質的;它們是對於特定的用途,進行過仔細優化了。但Linux的這種適用性傾向,保持了系統的通用性和多變性,同時也是一個奢侈的目標,付出的代價很高,需要增添許多額外的工作,會有許多附加的程序產生,從而增加了軟件包的體積,有時還會以降低性能為代價。舉一個常提到的例子--配置程序:在一個網絡接口上配置IP地址,一般是由啟動腳本中的ifconfig完成的。這是一個大小約28K左右程序,其實只用幾行代碼就可以完成它的工作:它負責根據配置文件中的內容初始化一些相應的數據結構。事情就是這樣:當一切成為一件合理的事情去做時,你不這樣做,又能怎樣呢?不然"軟件"意義又何在呢。

結束語
在嵌入式系統中使用Linux是可能的,並且已經成功了。它可以可靠地工作。從此,我們就在開發的成本上有了第二種選擇。

日期:2000-10-13


摘自:嵌入式Linux


Copyright © Linux教程網 All Rights Reserved