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

Linux在嵌入式系統中的應用


日期:2000年5月18日20:36譯者:陳德勇e_mail:[email protected]原作:JoelR.Williams(emlinux的主要設計師,專為網絡和通訊設計嵌入式系統,http://www.emlinux.linux)

摘要:Linux系統不僅能夠運行於PC平台;然而在嵌入式系統中Linux仍然可以大放光芒。本文描述了嵌入式系統的特色,和如何在嵌入式系統中應用Linux。

計算機用於嵌入式控制設備領域的歷史和計算機本身的歷史一樣久遠。最初的用於控制機電式電話交換器的通訊設備中“固態控制程序”就是嵌入式程序。“計算機系統”在當時並不普遍;所以固態程序存放在內存中控制相應的設備。在那種時代,運行控制程序是很先進的思想,而且當時也只能如此而已。

那時的計算機是專為特定的用戶設計,特殊的應用程序指令、I/O設備和主要的計算設備集成在一起。微處理器的產生改變了這種局面,價格低廉、結構小巧的CPU和外設連接在總線上形成了比較大的系統。這種硬件架構很穩定,於是在這個基礎上,這建立起了通用的軟件開發環境和編程模式,且簡化了編程,。

軟件也在隨著硬件的發展而發展;開始只有簡單的工具用於編程和調試,而且每一個軟件都必須從頭編寫。程序大都采用宏匯編語言,匯編程序還不很完善,調試是一件很麻煩的事。因此一直到70年代的中期,模塊化編寫程序和標准化的運行庫才逐漸流行起來。在70年代的後期,出現了嵌入式系統的操作系統。它們采用匯編語言編寫,而且只能運行在相應的特殊處理器上;處理器過時,則這個操作系統就沒有用處了,對新的處理器必須重新編寫操作系統的所有代碼。C語言出現以來,采用C語言操作系統更有效率了,操作系統的編寫有了很大的改觀。C語言有很好的穩定性和可移植性,所以今天的許多操作系統都使用C來編寫。於是在80年代末,出現了好幾個商業的嵌入式操作系統。而且它們已經演化成為今天的主流嵌入式操作系統。比如很有名的、使用者眾多的操作系統:Vxwork、pSOS、Neculeus和WindowssCE。

不過很多的嵌入式系統還沒有使用操作系統,它們僅僅包含一些控制流程而已。在嵌入式系統相對簡單的情況下,這些控制流足以應付。但是,當嵌入式系統的功能復雜後,簡單控制邏輯就不夠用了,這時你必須使用操作系統。如果不使用操作系統將會使得控制系統邏輯結構復雜混亂,很容易出錯。再者,有些嵌入式系統需要接入網絡系統,比如賓館的門鎖控制已經需要接入網絡,因此就更需要嵌入式的操作系統來支持應用軟件。

除了商業化的操作系統外,還有其他的有版權要求的非商業化嵌入式操作系統可以使用。然而今天的Linux系統有著嵌入式操作系統需要的很多特色、突出的優勢:適應於多種CPU和多種硬件平台,性能穩定,裁剪性很好,開發和使用都很容易。因此,我們決定在嵌入式系統中使用Linux操作系統。

1.它具有很好的工具,可以跨越ICE等屏障

原來開發嵌入式系統的關鍵是需要一套好用的開發和調試工具;而且在開發所不同階段還需要不同的工具。就比如工匠,只有好的工具才能夠使工作完成得又好又快。

傳統的開發調試工具就是ICE-在線仿真器;它取代目標板的微處理器,給目標程序提供仿真環境,同時可以連接監視器;允許開發者調試和監視程序的運行。盡管這種運行方式會引起一些奇怪的問題,但是它總能夠讓你明了程序在目標板的工作狀態,免除了對底層的軟硬件接口的猜測。但是,這種設備價格非常貴。過去,甚至在整個開發期內,開發嵌入式系統主要依靠這些調試工具。可是,我們發現,一旦軟硬件能夠正常支持串口的運行時,我們可以使用其他的調試辦法。現代的嵌入式系統采用相當成熟的微處理器。因此很容易使得串口工作。串口連接成功,可以進行很多的開發調試。所以我們不用ICE也可以很好地開始開發和調試工作了,同時還降低開發費用。

Linux利用GNU項目的C編譯器來編譯程序,使用gdb源程序級調試器來調試程序。它們提供了合適的手段來使你能夠開發嵌入式的Linux系統。為了開發基於Linux的嵌入式系統,可以按以下方法進行:

向串口輸出提示字符串,例如“helloword”或“Waston,comehereIneedyou!”等,然後通過串口,指揮gdb開始工作。以這種方式和另外一台運行gdb程序的Linux主機系統“交談”,通過串口,你可以很方便地讓gdb調試目標程序。通過串口和gdb通訊,可以進行C源程序級的調試。甚至你還可以以串口把其他的程序下裝到RAM或flash存儲器。通過串口,使用gdb可以使得軟硬件的初始化代碼繼續運行到核心全部啟動。

一旦核心在運行了,你就可以使用其他的更好的調試工具,象Kgdb等,如果連接了網絡,你也可以讓網絡工作起來。同時你就可以用GUI的xgdb來調試應用程序。

2.滿足實時性時要求

細細分析起來,大多數系統並不需要嚴格的實時性。而嵌入式系統也經常被誤解為就是實時性系統。其實,多數嵌入式系統並不需要實時性,而且實時性本身是個相對的概念絕對的實時性是指對需要的服務以限定的方式和在限定時間內提供,比如在微秒級內響應。這種硬實時性功能只是針對特殊的設備而言,例如數字信號處理等。而這些要求使用特殊的硬件如FIFO、DMA和其他特殊設計的硬件也可以滿足。

有些設計者不能夠准確地分析出系統真正實時需求,很多情況下對實時的需求在1-5毫秒內響應就可以;大部分情況下,軟實時響應足以滿足要求:WINDOWSS的98Crashed_Yet在98%的時間內可以在4每秒內響應,如果時間是20秒,則總會響應。那些軟實時性容易滿足。需要考慮的因素包括:上下文轉換時間、中斷延遲、任務的優先級和任務調度方式。上下文轉換時間曾經是實時性分析的重點,但是因為CPU速度大幅度提高,它不再是關鍵問題。

現在,嚴格要求的實時性任務的決定因素是中斷例程本身和內核中的其他驅動程序有關;而響應延遲時間主要受中斷的優先級和其他進程會暫時地關閉中斷響應的影響。因此管理和驅動中斷的機制必須保證實時要求。

對於Intelx86處理器,實時擴充可以在Linux系統中很容易進行,RT-Linux就是很好的例子(見http://www.rtlinux.org/)。它主要是把Linux的任務作為自己的一個任務,因此實時性要求很高的任務不受非實時的Linux的干擾,可以得到滿足。另外還提供了實時任務和Linux的基本核心和其他任務間的接口,這些接口是不需要很強的實時性。這種架構為其他的嵌入式系統提供了一個參考。關鍵因素就是實時性的代碼和非實時代碼分開設計,而且實時應用程序的處理方式和其他程序的處理方式差不多。

3.適合嵌入式系統的Linux有一種觀點認為:

用戶不必直接干預機器的運行,即沒有用戶接口的應用系統是嵌入式系統。其他的比如電梯控制系統應該是嵌入式系統,但是它需要人為控制。連接網絡需要監視和控制網絡系統運行的系統,仍然是嵌入式系統;因此應該根據系統的主要目的和功能來判定是否是嵌入式系統。

最小的嵌入式Linux系統必須包括以下主要的要素:

1) 啟動程序;

2) 融合了內存管理、進程管理和時間分批服務的核心;

3) 初始化程序。為了達到要求,而且為了保持最小系統,需要添加以下要素:
a. 硬件的驅動程序;
b. 必須的應用程序。根據其他需要,你可能增加以下功能:
a) 文件管理系統(在ROM或RAM中);
b) TCP/IP通訊協議;
c) 磁盤。

4.選擇合適的硬件平台選擇硬件平台是一件很麻煩的事,受很多因素影響,比如公司的指導原則、個人偏見、過去產品的影響和消息不靈通等。費用是考慮的主要因素。提醒你考慮價格時不要只注意CPU的價錢,要對整個系統進行考慮。但是如果你是系統設計師,你必須把軟件的實時性和硬件結合起來考慮。首先考慮需要多快的CPU,然後把選擇三倍化的結果;因為在實際中應用程序會使用一些cache(緩沖),所以理論上速度很快的CPU的實際速度會降低。其次考慮選擇多快的BUS(總線);如果可以包括其他的總線,比如PCI,就加上它。因為有時即使使用DMA方式傳輸,也會使快速CPU變得象蝸牛一般。選用集成外設的CPU比較好,而且還可選用現成的外設驅動程序,大大減少調試工作,實際上有些芯片集成的功能並不是我們所需要的,所以也不要認為凡是集成的都是好東西。

5.壓縮制作Linux系統對Linux的通常感覺是大,似乎不適合於嵌入式系統。事實並非如此。因為典型的發行Linux集成了很多桌面PC機需要而嵌入式系統並不需要的功能。首先,我們可以把核心(kernel)從其他任務中分離出來。標准的Linux核心總是貯留在內存中;當需要應用程序時,它把需要的程序從磁盤調入內存運行。程序運行完畢,內存清空,卸載程序。在嵌入式系統中,經常沒有磁盤。目前有兩種辦法來處理沒有磁盤的情況。對於比較簡單的系統,核心(kernel)和應用程序同時貯留在內存,當系統啟動時,就啟動應用程序。這種方式和以前的嵌入式系統一樣工作。Linux系統也支持這種方式。第二種方式是,考慮到Linux有load(裝載)和unload(卸載)程序的能力,嵌入式系統也可以使用這一特點,來節約內存。假如有一個典型的嵌入式系統:包括8到16M的FlashMemory和8到16M的RAM;可以在FlashMemory上建立文件系統,使用Flash的驅動程序來驅動FlashMemory上文件系統工作。另外,也可以使用FlashDidsk,其中有一個例子是M-system的DiskOnChip,它可以支持達160M的FlashDisk。把使用的應用程序文件存放在Flash文件系統上,根據需要調入程序。這種動態裝入方法有很多優點:(1)因為在Linux中有一些應用程序只是在初始化時使用一次,然後就沒有用處了,另外它們運行方式是一個接一個,順序進行的。可以允許初始化程序的代碼在使用完畢後被廢棄,不必永遠存放在內存。因此相同內存可以運行不同的程序。這樣很節省內存的。(2)軟件更新比較容易;可以在系統運行的情況下更新應用程序和驅動程序。

6.如何處理虛擬內存標准的Linux還有一個特點是使用虛擬內存,程序過大,可以交換到虛擬存儲器上。這是一個神奇的功能,它使得程序有很大的運行空間。然而,在嵌入式系統中,這個功能似乎沒有用武之地,因為沒有磁盤。這個功能對於嵌入式系統,特別要求實時性很強的系統來說的確不那麼重要,因為這個機制會浪花費時間,所以,嵌入式系統的應用程序還是在固定的地方運行比較好。不過提醒你重注意,考慮到一些CPU有這方面的特點,建議保留虛擬存儲器的代碼。不僅因為剔除這部分代碼很費事,如果剔除相關代碼,還容易造成其他問題。更主要的是這保留了這部分功能,能夠使得不同進程使用相同代碼。如果沒有了這個功能,每個程序都需要自己的運行庫,在內存中就會有庫的很多拷貝。其實只需把交換空間的長度設置為零,就可以關閉虛擬內存的頁面換入和換出功能。對一些CPU,虛擬存儲器的功能提供內存管理,防止不同程序占用相同的地址空間。而在嵌入式系統中,使用簡單、絕對的地址空間,因此這種功能也不會起作用。不過這到提供了防止誤寫以至於使系統崩潰的功能。很多嵌入式系統習慣使用“全局變量”,讓進程共享數據。在Linux系統中提供共享內存方法讓進程共享數據信息。在RT-Linux中使用FIFO進行信息交換。

7.處理文件系統很多嵌入式系統沒有磁盤和文件系統;Linux也可以在沒有磁盤的系統上運行。正如上面提到的,應用程序可以和核心一起編譯,在啟動時一起裝入運行。這適應於簡單系統,但不具有靈活性。其實,許多商業的嵌入式系統都提供文件系統的選擇。大都是特殊的文件系統或者兼容MS-DOS文件系統。Linux提供包括MS-DOS等許多選擇。其他的文件系統具有更好的性能。Linux還具有許多實時商業操作系統所不具備的檢查和修復文件系統的功能。這種功能對於通過網絡更新的系統尤為重要。Linux的文件系統可以建立在傳統的磁盤上、FlashMemory、或其他載體。甚至可以用RAM磁盤存放臨時文件。有些系統中包含了廉價的CD-ROM,它比FlashMemory更便宜,更新升級更容易。Linux系統可以從CD-ROM中啟動以及運行程序。在網絡化的嵌入式系統,Linux支持NFS(網絡文件系統)。於是,你可以使用很多網絡功能。首先,可以通過網絡來啟動應用程序。因為通過服務器來啟動應用程序,所以是進行軟件更新的最好解決辦法。其次,在運行過程中,可以很方便地導入和導出數據、狀態設置和狀態信息等。這個功能很適合用於遠程監視和控制應用系統。例如,在RAM中建立磁盤,保存各種需要的重要數據,遠程系統登錄到此RAM文件系統,讀取數據,然後在操作者的機器上用圖形界面顯示運行狀態,起到很好的監視效果。
8.設置啟動-LILO和BIOS當微機啟動時,它運行預定地址的代碼,那地址通常是在只讀存儲區,存放有啟動代碼。在PC中,即BIOS,它執行底層的CPU初始化工作和初始化設置其他硬件。BIOS確認哪個硬盤存放操作系統,拷貝操作系統到RAM中,然後運行操作系統。同樣,Linux在PC上運行,依靠PC的BIOS來設置硬件、啟動OS。在嵌入式系統中,通常沒有BIOS,因此,需要提供等價的啟動代碼。嵌入式系統並不需要象PC那樣靈活的BIOS啟動程序,它初始化的硬件比較單一。這段代碼其實很簡單,只是把一些很重要,而且還要特殊的寫入順序要求的數據寫入硬件的寄存器。另外必須具備的功能有內存檢測,點亮LED,檢測其他很重要的硬件。這些代碼的針對性很強,不需要很好的移植性。所以不同的硬件環境需要不同的啟動代碼。為了進行測試,可以使用ICE(在線仿真器)或其他的設備來調試這部分代碼。這部分代碼總是運行在Flash或EPROM等芯片上,所以,需要把它們寫入這些芯片。如何寫,當然因硬件的不同而不同了。一個最為普通的方法是使用EPROM或Flash燒錄器,把程序燒錄在芯片,然後把芯片插入板上。另外的方法是通過JTAG接口進行。

9.嵌入式的Linux同樣健壯可靠和其他的運行於PC的系統相比,Linux是最可靠和最穩定的操作系統。而嵌入式的核心也是如此的。Linux的核心移植到新的微處理器上,基本不用什麼修改。因此Linux可以使用許多計算機板。外設的驅動程序也多如牛毛,而且比其他的都穩定好用。但是,如果不是PC平台環境,那麼你必需為特殊硬件編寫驅動程序。對於各種硬件的相似驅動程序市面上隨處可見,所以,你可以DOWN下來修改而成,所以安裝新的或特殊驅動器、網卡、串口、並口就不困難了。不過,我還是建議你在身邊放一本Kernel的書比較好,以備查找。在我的經驗中,我覺得使用Linux的錯誤大都是對系統的了解不准確所至。況且,Linux的源代碼隨處可得、注釋豐富、文檔齊全,你完全可能自己去解決問題。

10.結束語嵌入式的Linux系統也有缺點。和某些商業操作系統一樣,占用較大的內存。當然可以去掉部分無用的功能來減小使用的內存,但是,如果不仔細,將引起新的問題。有些Linux的應用程序需要虛擬內存,而嵌入式系統中並沒有或不需要虛擬內存,所以,並非所有的Linux應用程序可以在嵌入式系統運行。核心的調試工具並非完盡人意,雖然可以使用kgdb,不過我們更多的是使用print語句來幫助調試。在應用於嵌入式系統的主要問題是:Linux本身具有很大的靈活性,而嵌入式系統不具有靈活性,它們主要針對特殊的問題。這是問題的關鍵。總之,Linux用於開發嵌入式系統的應用軟件是可能的和可行的。


摘自:http://www.pocketix.com


Copyright © Linux教程網 All Rights Reserved