優勢
第一,Linux是
開放原始碼的,不存在黑箱技術,遍布全球的眾多Linux愛好者都是Linux開發者的強大技術支持者;而Windows CE是非開放性OS,使第三方難以實現產品定製。
第二,Linux的原始碼隨處可得,注釋豐富,文檔齊全,易於解決各種問題。
第三,Linux的
核心小、效率高;而Windows CE在這方面是笨拙的,占用過多的RAM,應用程式龐大。
第四,Linux是免費的OS,在價格上具有競爭力,適合中國國情。Windows CE的著作權費用時廠家不得不考慮的因素。
第五,Linux不僅支持x86晶片,還是一個跨平台的系統。到目前為止,它可以支持20-30種CPU,很多CPU(包括家電業的晶片)廠商都開始做Linux的平台移植工作,而且移植的速度遠遠超過Java的開發環境。
第六,Linux核心的結構在網路方面是非常完整的,它提供了包括十兆位、百兆位及千兆位的乙太網,還有無線網路、Token ring(
令牌環)和光纖甚至衛星的支持。
第七,Linux在
核心結構的設計中考慮適用系統的可裁減性的要求,Windows CE在核心結構設計中並未考慮適應系統的高度可減剪性的要求。
種類
Linux嵌入式套用方面的產品主要有三種:
第一類是專門為Linux的嵌入式套用而做的。產品的研發方向是如何讓Linux更小、更容易嵌入到體積要求和功能、性能要求更高的硬體中去,如MontaVista的MontaVista Linux 等。
第二類是專門為Linux的實時特性設計的產品。將Linux開發成實時系統尤其是硬實時系統,套用於一些關鍵的控制場合。如:Fsmlabs公司開發出來
RT-Linux產品已經用在工業控制的很多方面。
第三類的產品是將實時性和嵌入式方案結合起來的方案。很多公司這么做,並且提供
集成化的開發方案。所以在選擇嵌入式要求和實時性要求時,應該選擇適合自己的嵌入式Linux。
套用
Linux的實時套用許多
嵌入式系統要求能預測、可限定回響時間地回響外界事件,此類實時系統包括工廠自動控制、
數據採集、
控制系統、音頻及視頻套用、多數電腦化產品及設備。儘管Linux不是一個真正的
實時作業系統(Linux核心不提供對事件優先權及搶占特性的支持),但它已經有幾個增加的選擇可以給基於Linux的系統提供實時特性。其中,最常用的辦法就是雙核結合,把一個
通用作業系統作為一個任務運行在一個實時
核心上。
通用作業系統提供磁碟讀寫、網路及通訊、
串並口讀寫、
系統初始化、
記憶體管理等功能,而實時
核心則處理實施事件的回響。雙
核心策略充分兼容標準的Linux,而又不採用一種不干擾原Linux的方式來增加了實時功能。嵌入式Linux系統的執行流:加電,啟動FLASH MEMORY 中的boot → 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就是很好的例子。它主要是把Linux的任務作為自己的一個任務,因此實時性要求很高的任務不受非實時的Linux的干擾,可以得到滿足。另外還提供了實時任務和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用於開發
嵌入式系統的套用軟體是可能的和可行的。
環境搭建
(1)安裝Linux
首先應該安裝RedHat 6.2版本的Linux,因為uClinux的原作者使用的是RedHat6.2平台。為了避免可能出現的不必要的麻煩,建議使用RedHat6.2平台。
(2)GNUgcc交 叉編譯器的建立
我們使用的是m68k-elf-tools-20010716.tar.gz,安裝命令是:
tar xzf m68k-elf-tools-20010716.tar.gz
執行後會把ColdFire的交 叉編譯器安裝到/usr/local/目錄下面。其中/usr/local/bin目錄下是
執行檔。
(3)安裝調試工具
BDM的驅動(BDM Driver)
下載gdb-bdm-20010901.tar.gz 用下述命令解壓:
tar xzf gdb-bdm-20010901.tar.gz
執行後會新建gdb-bdm-20010901目錄,在該目錄下面運行:
./local_script/build_it
然後到/gdb-bdm-20010901/driver/linux目錄下面運行:
make install
然後運行:
mknod /dev/bdmcf0 c 34 4 添加ColdFire系列CPU的
BDM驅動。
在檔案/etc/conf.modules添加:
alias char-major-34 bdm
在檔案/etc/rc.d/rc.local添加:
/sbin/insmod bdm
再到/gdb-bdm-20010901/lib下面:
make install
到/gdb-bdm-20010901/test目錄下面:
./chk /dev/bdmcf0,可以測試
BDM驅動是否工作正常。
(5)編譯GDB
下載gdb檔案gdb-5.0.tar.gz,用下述命令解壓:
tar xzf gdb-5.0.tar.gz
到生成的目錄gdb-5.0下面運行:
patch -p1 </where/gdb-bdm-20010901/gdbPatches/gdb-5.0-patch
where就是/gdb-bdm-20010901的目錄。
然後運行
./configure --target=m68k-bdm-elf--prefix=/usr/local/
再運行
make
然後是
make install
這樣,整個交 叉編譯平台和Debug平台就建立完成了。接下來就可以編譯運行在CPU上的彙編C程式了。
發展前景
以信息家電為代表的網際網路時代
嵌入式產品,不僅為嵌入式市場展現了美好前景,注入了新的生命,同時也對
嵌入式作業系統技術提出新的挑戰。
(1)嵌入式
套用軟體的開發需要更加強大的開發工具和作業系統的支持。隨著Internet技術的成熟、頻寬的提高,Internet提供的信息內容日趨豐富,套用項目多種多樣,像電話手機、微波爐等嵌入式電子設備的功能不再單一,電氣結構也更為複雜。為了滿足套用需求,設計師們一方面採用更強大的
嵌入式處理器(如32位、64位RISC晶片或信號處理器DSP)增強處理能力,同時還採用實時多任務
編程技術和交叉開發技術來控制功能複雜性,簡化應用程式設計,保障
軟體質量和縮短開發周期。另外,
嵌入式系統還應需要一套高度簡練、質量可靠、套用廣泛、易開發、多任務並且價格低廉的作業系統。所以Linux作為一個完全免費和開放的OS,在今後必然是開發
嵌入式系統首選的作業系統。
(2)網路成為必然趨勢。為適應嵌入式分布處理結構和套用上網的需求,
嵌入式系統要求配備一種或多種標準的
網路通信接口(IEEE1394、USB、CAN、Blue tooth等)和相應的網路協定簇(TCP/IP、SNMP等)支持。而Linux與生俱來的優秀網路血統,更為上網套用的發展鋪平了一條寬廣平坦的道路。
(3)實現小尺寸、微功耗和低成本。在一定程度上講,
嵌入式產品的微型化、低功耗和低成本與高的處理器的性能是一對不可調和的矛盾。所以要達到微型化,就要求相應地降低處理器的性能;同時也就相應地提高了對嵌入式軟體設計技術要求。對於系統的小型化,Linux可以說在眾多的
嵌入式作業系統中是最優秀的。Linux由於原始碼是公開免費的,所以可以根據需要進行裁減、修改等,從而實現系統軟體微型化。
(4)提供精巧的多媒體人機界面(HMI)。
嵌入式設備之所以為億萬用戶樂於接受,重要因素之一是它們與使用者之間的親和力和自然的
人機互動界面。人們與信息終端的互動要求以GUI螢幕為中心的多媒體界面。目前嵌入式Linux的GUI系統有Micro Windows、OpenGUI、Qt/Embedded、Mini GUI等。總之,能有一個讓客戶非常滿意的人機界面,也是今後
嵌入式系統的發展方向。
(5)
嵌入式作業系統走向融合。現在面對如此多的
嵌入式作業系統,開發者有時感覺到很不方便。這是因為,如果在基於OS1的作業系統上開發的應用程式,現在想在OS2上用,則必須進行移植才可使用。隨著
嵌入式設備的不斷發展,將來必將會出現一個能支撐幾乎所有應用程式的作業系統。或者說將來的
嵌入式作業系統必將走向融合。而惟一能擔當此任的無疑是Linux。因為它提供了一個讓任何人都能自發地為其發展找尋出路的遊戲規則。