|
嵌入式系統及如何開(kāi)發(fā)自己的嵌入式系統
嵌入式系統及如何開(kāi)發(fā)自己的嵌入式系統
多數Linux系統是在PC平臺上運行,然而Linux作為嵌入式系統也是非常穩定的。本文描繪了一個(gè)嵌入式系統的概覽,并展示嵌入式系統產(chǎn)品是如何使用Linux的。
嵌入式系統比摩西還老的故事
電腦用于控制設備或嵌入系統的歷史幾乎電腦自身的歷史一樣長(cháng)。在通訊領(lǐng)域,六十年代晚期,電腦被用于電子電話(huà)交換機,稱(chēng)為“存儲程序控制”系統!半娔X”這詞那時(shí)并不普遍,存儲程序指內存裝有程序和例程信息。存儲控制邏輯,而不是將其固化在硬件中,在當時(shí)確實(shí)是突破性的。今天,我們認為它本來(lái)就應如此。
那時(shí)的電腦是為每一個(gè)應用而定制的,按今天的標準,它們是一些不正常的、由奇怪的特殊指令和I/O設備集成在一部電腦中。
微處理器通過(guò)提供構建大系統模塊的小型、低成本、CPU引擎改變了這一切。它提出了外設通過(guò)總線(xiàn)聯(lián)接的固定硬件架構及稱(chēng)為編程的一般編程模型。
軟件也隨著(zhù)硬件提出。最初,編寫(xiě)和測試軟件只有簡(jiǎn)單的編程開(kāi)發(fā)工具。每個(gè)項目實(shí)際運行的軟件通常來(lái)自于草稿的修改。編程常用匯編語(yǔ)言或宏語(yǔ)言,因為編譯器常常有缺陷和缺乏完善的調試工具。軟件構建模塊和標準化庫只是到了七十年代才流行起來(lái)的概念。
嵌入式系統的商品化操作系統在1970年代后期才出現,許多是用匯編語(yǔ)言寫(xiě)成的,并且只能用于特定的微處理器,當微處理器被淘汰時(shí),它的操作系統除非為新處理器重寫(xiě),否則也要被淘汰。今天,許多這類(lèi)早期的系統成了些模糊的記憶;還有誰(shuí)記得MTOS嗎?當C語(yǔ)言出現時(shí),操作系統編寫(xiě)的效率、穩定性、可移植性都提高了很多。這一點(diǎn)在管理上立刻表現出來(lái),它為微處理器被淘汰時(shí)保護軟件投資帶來(lái)了希望。對于市場(chǎng)來(lái)說(shuō)這是一個(gè)好消息。用C語(yǔ)言寫(xiě)成的操作系統今天越來(lái)越普遍。一般來(lái)說(shuō),可重復使用的軟件已經(jīng)占主導并越做越好。
在八十年代早期,我最喜歡的操作系統是Wendon操作系統,大約150美元就可以得到一個(gè)C源碼庫。它是一個(gè)包,你可以通過(guò)選擇部件建立自己的操作系統,類(lèi)似在菜單上點(diǎn)菜。例如,你可以在庫清單上點(diǎn)工作排程安排和內存管理方案。 很多嵌入式系統的商品化操作系統是在八十年代出現的。這一熱潮持續到現在,今天,有很多可行的商品化操作系統可供選擇。一些大佬出現了,如VxWorks, pSOS, Neculeus和Windows CE。
許多嵌入式系統根本沒(méi)有操作系統,只有循環(huán)控制。對于一些簡(jiǎn)單設備這是足夠的,但是隨著(zhù)系統越來(lái)越復雜,操作系統就很必要了或軟件變得不可思議的復雜。不幸的是,有些復雜得可怕的嵌入式系統只因為設計者堅持不要操作系統才那么復雜。
漸漸地,更多嵌入式系統需要與各類(lèi)網(wǎng)絡(luò )聯(lián)接,因此需要網(wǎng)絡(luò )功能。即便是酒店的門(mén)把手也嵌入了微處理器與網(wǎng)絡(luò )相聯(lián)。 對于僅僅是編碼控制循環(huán)的嵌入式系統,增加網(wǎng)絡(luò )功能將導致系統復雜程度提高以致要求操作系統。
除了商品化操作系統,還有大量專(zhuān)用操作系統。其中大部分來(lái)自于草案,如CISCO的IOS;還有是從其他操作系統中派生出來(lái)的。例如,許多操作系統是從同一版本的Berkeley Unix系統派生,因為它有完整的網(wǎng)絡(luò )功能。其他是基于主要操作系統的如KA9Q來(lái)自Phil Karn。
Linux作為嵌入式系統是一個(gè)帶有很多優(yōu)勢的新成員。它對許多CPU和硬件平臺都是可移植的、穩定、功能強大、易于開(kāi)發(fā)。
工具包突破ICE的障礙
開(kāi)發(fā)嵌入式系統的關(guān)鍵的是可用的工具包。像任何工作一樣,好的工具使得工作更快更好。開(kāi)發(fā)的不同階段需要不同的工具。
傳統上,首先用于開(kāi)發(fā)嵌入式系統工具是內部電路仿真器(ICE),它是一個(gè)相對昂貴的部件,用于植入微處理器與總線(xiàn)之間的電路中,允許使用者監視和控制微處理器所有信號的進(jìn)出。這有點(diǎn)難做,因為它是異體,可能會(huì )引起不穩定。但是它提供了總線(xiàn)工作的清晰狀況,免了許多對硬件軟件底層工作狀況的猜測。
過(guò)去,一些工作依賴(lài)ICE為主要調試工具,用于整個(gè)開(kāi)發(fā)過(guò)程。但是,一旦初始化軟件對串口支持良好的話(huà),多數的調試可以不用ICE而用其他方法進(jìn)行。較新的嵌入式系統利用非常清晰的微處理器設計。有時(shí),相應工作初始碼已經(jīng)有了能夠快速獲得串口工作。這意味著(zhù)沒(méi)有ICE人們也能夠方便地工作。省去ICE降低了開(kāi)發(fā)的成本。一旦串口開(kāi)始工作,它可以支持各種專(zhuān)業(yè)開(kāi)發(fā)工具。
Linux是基于GNU的C編譯器,作為GNU工具鏈的一部分,與gdb源調試器一起工作。它提供了開(kāi)發(fā)嵌入式Linux系統的所有軟件工具。這有些典型的、用于在新硬件上開(kāi)發(fā)嵌入式Linux系統的調試工具。
1. 寫(xiě)入或植入引導碼
2. 向串口打印字符串的編碼,如“Hello World”(事實(shí)上我更喜歡“Watson,Come hre I need you”,電話(huà)上常用的第一個(gè)詞。)
3. 將gdb目標碼植入工作串口,這可與另一臺運行g(shù)db程序的Linux主機系統對話(huà)。只要簡(jiǎn)單地告訴gdb通過(guò)串口調試程序。它通過(guò)串口與測試機的gdb目標碼對話(huà),你可以進(jìn)行C源代碼調試,也可以用這個(gè)功能將更多的碼載入RAM或Flash Memory中。
4. 利用gdb讓硬件和軟件初始化碼在Linux內核啟動(dòng)時(shí)工作。
5. 一旦Linux內核啟動(dòng),串口成為L(cháng)inux控制口并可用于后續開(kāi)發(fā)。利用kgdb,內核調試版的gdb,這步常常不作要求,如果你與網(wǎng)絡(luò )聯(lián)接,如10BaseT,下一步你可能要啟動(dòng)它。
6. 如果在你的目標硬件上運行了完整的Linux內核,你可以調試你的應用進(jìn)程。利用其他的gdb或覆蓋gdb的圖形如xgdb。
什么是實(shí)時(shí)系統?
嵌入式系統常常被錯誤地分為實(shí)時(shí)系統, 盡管多數系統一般并不要求實(shí)時(shí)功能。實(shí)時(shí)是一個(gè)相對的詞,純化論者常常嚴格地定義實(shí)時(shí)為對一事件以預定的方式在極短的時(shí)間如微秒作出響應漸漸地,在如此短暫時(shí)間間隔內的嚴格實(shí)時(shí)功能在專(zhuān)用DSP芯片或ASIC上實(shí)現了。只有在設計低層硬件FIFO、分散/聚集DMA引擎和定制硬件時(shí)才會(huì )有這樣的要求。
許多設計人員因為對真實(shí)的要求設有清晰的理解而對實(shí)時(shí)的要求焦慮不安。對于大多數的系統,在一至五微秒的近似實(shí)時(shí)響應已經(jīng)足夠。同樣軟需求也是可以接受的。如 Windows 98 已經(jīng)崩潰的中斷必須在4毫秒內(±98%)內、或20毫秒(±0)內進(jìn)行處理。
這種軟要求是比較容易滿(mǎn)足的,包括環(huán)境轉換時(shí)間、中斷等待時(shí)間、任務(wù)優(yōu)先級和排序。環(huán)境轉換時(shí)間曾是操作系統的一個(gè)熱門(mén)話(huà)題?傊,多數 CPU 這些要求處理得很好,而且CPU的速度現在已經(jīng)快了很多,這個(gè)問(wèn)題也就不重要了。
嚴格的實(shí)時(shí)要求通常由中斷例程或其他內核環(huán)境驅動(dòng)程序功能處理,以確保穩定的表現,等待時(shí)間,一旦請求出現要求服務(wù)的時(shí)間很大程度上取決于中斷的優(yōu)先及其他能暫時(shí)掩蓋中斷的軟件。
中斷必須進(jìn)行處理和管理以確保時(shí)間要求能符合,如同許多其他的操作系統。在IntelX86處理器中,這工作很容易由Linux實(shí)時(shí)擴展處理。這是提供了一個(gè)以后臺任務(wù)方式運行Linux的中斷處理調度。關(guān)鍵的中斷響應不必通知Linux。因此可以得到許多對于關(guān)鍵時(shí)鐘的控制。在實(shí)時(shí)控制級和時(shí)間限制寬松的基本Linux級之間提供接口,這提供了與其他嵌入式操作系統相似的實(shí)時(shí)框架。因此,實(shí)時(shí)關(guān)鍵代碼是隔開(kāi)的、并“設計”成滿(mǎn)足要求的。代碼處理的結果是以更一般的方法也許只在應用任務(wù)級。
嵌入式系統定義
一個(gè)觀(guān)點(diǎn)是如果一個(gè)應用沒(méi)有用戶(hù)界面,它必須是嵌入式的,因為用戶(hù)不能直接與之交互。當然這是簡(jiǎn)單化的。一個(gè)電梯控制的電腦被認為是嵌入式的:按鍵選擇樓層指示燈顯示電梯的停層。對于聯(lián)網(wǎng)的嵌入式系統,如果系統包含監視和控制的網(wǎng)絡(luò )瀏覽器,這種界限就更加模糊了。更好些的定義注重系統的集中的功能和主要的目的。
因為L(cháng)inux提供了完成嵌入功能的基本的內核和你所需要的所有用戶(hù)界面,它是多面的。它能處理嵌入式任務(wù)和用戶(hù)界面。將Linux看作是連續的統一體,從一個(gè)具有內存管理、任務(wù)切換和時(shí)間服務(wù)及其他的分拆的、微內核到完整的服務(wù)器,支持所有的文件系統和網(wǎng)絡(luò )服務(wù)。
一個(gè)小型的嵌入式Linux系統只需要下面三個(gè)基本元素:
引導工具
Linux微內核,由內存管理、進(jìn)程管理和事務(wù)處理構成
初始化進(jìn)程:
如果要讓它能干點(diǎn)什么且繼續保持小型化,還得加上:
硬件驅動(dòng)程序
提供所需功能的一個(gè)或更多應用程序。
再增加功能,或許需要這些
一個(gè)文件系統(也許在ROM或RAM中)
TCP/IP網(wǎng)絡(luò )堆棧
存儲半過(guò)渡數據和交換用的磁盤(pán)。
硬件平臺
選擇最好的硬件是一個(gè)復雜的工作、充滿(mǎn)了公司其他項目的政治、偏見(jiàn)、傳統,缺乏完整或精確的信息。 成本經(jīng)常是關(guān)鍵的議題。當考慮成本時(shí)、確信你在考慮產(chǎn)品的整個(gè)成本、不僅是CPU。有時(shí)快的、便宜的CPU一旦加上總線(xiàn)邏輯和時(shí)延使之與外設一起工作,能變成一個(gè)昂貴的狗的產(chǎn)品。如果你在尋找軟件,首先是硬件已經(jīng)有產(chǎn)品了。如果你是系統設計者,由你決定制定實(shí)時(shí)的預算及硬件的工作是否滿(mǎn)意。
現實(shí)中需要多快的CPU來(lái)完成一項工作,然后放大三倍。奇怪,CPU理論上的速度竟與現實(shí)中一樣,別忘了應用程序將會(huì )充分利用cache。
想象總線(xiàn)的速度需要多快,如果有其他總線(xiàn)如PCI總線(xiàn),包括進(jìn)來(lái)。慢的總線(xiàn)或產(chǎn)生DMA阻塞的總線(xiàn)會(huì )降低CPU的速度造成擁擠。 有集成設備的CPU是好的,因為只須調試很少的設備,并且支持通用CPU的驅動(dòng)程序通常都很容易獲得。在我的項目中,芯片與外設的聯(lián)接經(jīng)常出問(wèn)題或不滿(mǎn)足我們所需的兼容性。因為外設是集成的,不要認為這會(huì )便宜。
將10斤重的Linux塞入只能裝5斤的袋中
對于Linux一個(gè)共同的認識是它用于嵌入式系統簡(jiǎn)直是神奇極了。這可能不大對,典型的PC上的Linux 對PC用戶(hù)來(lái)說(shuō)功能有多。
對初學(xué)者而言,可以將內核與任務(wù)分開(kāi),標準的Linux內核通常駐留在內存中,每一個(gè)應用程序都是從磁盤(pán)運到內存上執行。當程序結束后,它所占用的內存就被釋放,程序就被下載了。
在一個(gè)嵌入式系統里,可能沒(méi)有磁盤(pán)。有兩種途徑可以消除對磁盤(pán)的依賴(lài),這要看系統的復雜性和硬件的設計。
在一個(gè)簡(jiǎn)單的系統里,當系統啟動(dòng)后,內核和所有的應用程序都在內存里。這就是大多數傳統的嵌入式系統工作模式,它同樣可以被Linux支持。
有了Linux,就有了第二種可能性。因為L(cháng)inux已經(jīng)有能力“加載”和“卸載”程序,一個(gè)嵌入式系統就可以利用它來(lái)節省內存。試想一個(gè)典型的包括一個(gè)大概8MB到16MB的Flash Memory和8MB內存的系統。Flash Memory可以作為一個(gè)文件系統。Flash Memory驅動(dòng)程序用來(lái)連接Flash Memory和文件系統。作為替代,可使用Flash Disk。這Flash部件用軟件仿真磁盤(pán)。其中一個(gè)例是M-Systems的DiskOnChip,可以達到160MB。(http://www.m-systems.com)。所有的程序都以文件形式存儲在Flash文件中,需要時(shí)可以裝入內存。這種動(dòng)態(tài)的、“根據需要加載”的能力是支持其它一系列功能的重要特征:
它使初始化代碼在系統引導后被釋放。Linux同樣有很多內核外運行的公用程序。這些通常程序在初始化時(shí)運行一次,以后就不再運行。而且,這些公用程序可以用它們相互共有的方式,一個(gè)接一個(gè)按順序運行。這樣,相同內存空間可以被反復使用以“召入”每一個(gè)程序,就象系統引導一樣。這的確可以節省內存,特別是那些配置一次以后就不再更改的網(wǎng)絡(luò )堆棧 如果Linux可加載模塊的功能包括在內核里,驅動(dòng)程序和應用程序就都可以被加載。它可以檢查硬件環(huán)境并且為硬件裝上相應的軟件。這就消除了用一個(gè)程序占用許多Flash Memory來(lái)處理多種硬件的復雜性。
軟件的升級更模塊化。你可以在系統運行的時(shí)候在Flash上升級應用程序和可加載驅動(dòng)程序。
配置信息和運行時(shí)間參數可以作為數據文件儲存在Flash上。
非虛擬內存
標準 Linux 的另一個(gè)待征是虛擬內存的能力。正是這種神奇的特征使應用程序員可以狂熱的編寫(xiě)代碼而不計后果,不管程序有多大。程序溢出到了磁盤(pán)交換區。在沒(méi)有磁盤(pán)的嵌入式系統里,通常不能這么做。
在嵌入式系統里不需要這種強大的功能。實(shí)際上,你可能不希望它在實(shí)時(shí)的關(guān)鍵系統里,因為它會(huì )帶來(lái)無(wú)法控制的時(shí)間因素。這個(gè)軟件必須設計得更加精悍,以適合市面上物理內存,就象其它嵌入式系統一樣。
注意由于CPU的原因,通常在Linux中保存虛擬內存代碼是明智的,因為將它清除很費事。而且還有另外一個(gè)原因是它支持共享文本,這樣就可以使許多程序共享一個(gè)軟件。沒(méi)有這個(gè),每一個(gè)程序都要有它自己的庫,就象printf一樣。
虛擬內存的調入功能可以被關(guān)掉,只要將交換空間的大小設置為零。然后,如果你寫(xiě)的程序比實(shí)際的內存大,系統就會(huì )當作你的運行用盡了交換空間來(lái)處理;這個(gè)程序將不會(huì )運行,或者malloc將會(huì )失靈。
在許多CPU上,虛擬內存提供的內存管理可以將不同程序分開(kāi),防止它們寫(xiě)到其它地址的空間上。這在嵌入式系統上通常不可能,因為它只支持一個(gè)簡(jiǎn)單、扁平的地址空間。Linux的這種功能有助于其發(fā)展。它減少了胡亂的編寫(xiě)程序造成系統崩潰的可能性。許多嵌入式系統基于效率方面的原因有意識使用程序間可以共享的“全局”數據。這也可以通過(guò)Linux共享內存功能來(lái)支持,共享的只是指定的內存部分。
文件系統
許多嵌入式系統沒(méi)有磁盤(pán)或者文件系統。Linux不需要它們也能運行。如前所述,應用程序任務(wù)可以和內核一起編寫(xiě),并且在引導時(shí)作為一個(gè)影像加載。對于簡(jiǎn)單的系統來(lái)說(shuō),這就夠了。然而,它缺乏前面所說(shuō)的靈活性。
實(shí)際上,許多商業(yè)性嵌入式系統,提供文件系統作為選項。許多或者是專(zhuān)用的文件系統或者是MS-DOS-Compatible文件系統。Linux提供MS-DOS-Compatible文件系統,同時(shí)還有其它多種選擇。之所以提供其它選擇是因為它們更加強大而且具有容錯功能。Linux還具有檢查和維護的功能,商業(yè)性供應商往往不提供這些。這對于Flash系統來(lái)說(shuō)尤其重要,因為它是通過(guò)網(wǎng)絡(luò )更新的。如果系統在升級過(guò)程中失去了能力,那它就沒(méi)有用了。維護的功能通?梢越鉀Q這類(lèi)問(wèn)題。
文件系統可以被放在傳統的磁盤(pán)驅動(dòng)器、Flash Memory或其它這類(lèi)的介質(zhì)上。而且,用于暫時(shí)保存文件,一個(gè)小RAM盤(pán)就足夠了。Flash Memories被分割成塊。這些塊中也許包括一個(gè)含有當CPU啟動(dòng)時(shí)運行的最初的軟件的引導塊。這可能包括Linux 引導代碼。剩余的Flash可以用作文件系統。Linux的內核可以通過(guò)引導代碼從Flash復制到RAM,或者還有一個(gè)選擇,內核可以被存儲在Flash的一個(gè)獨立部分,并且直接從那里執行。
另外對于一些系統來(lái)說(shuō)還有一個(gè)有趣的選擇,那就是將一個(gè)便宜的CD-ROM包含在內。這比Flash Memory 便宜,而且通過(guò)交換CD-ROM支持簡(jiǎn)單的升級。有了這個(gè),Linux 只要從 CD-ROM上引導,并且象從硬盤(pán)上一樣從CD-ROM上獲得所有的程序。
最后,對于聯(lián)網(wǎng)的嵌入式系統來(lái)說(shuō),Linux 支持NFS(Network File System)。這為實(shí)現聯(lián)網(wǎng)系統的許多增值功能打開(kāi)了大門(mén)。第一,它允許通過(guò)網(wǎng)絡(luò )上加載應用程序。這是控制軟件修改的基礎,因為每一個(gè)嵌入式系統的軟件都可以在一個(gè)普通的服務(wù)器上加載。它在運行的時(shí)候也可以用來(lái)輸入或輸出大量的數據、配置和狀態(tài)信息。這對用戶(hù)監督和控制來(lái)說(shuō)是一個(gè)非常強大的功能。舉例來(lái)說(shuō),嵌入式系統可以建立一個(gè)小的RAM磁盤(pán),包含的文件中有與當前狀態(tài)信息同步的內容。其它系統可以簡(jiǎn)單的把這個(gè)RAM磁盤(pán)設置為基于網(wǎng)絡(luò )的遠程磁盤(pán),并且空中存取狀態(tài)文件。這就允許另一個(gè)機器上的Web服務(wù)器通過(guò)簡(jiǎn)單的CGI Script存取狀態(tài)信息。在其它電腦上運行的其它應用程序包可以很容易的存取數據。對更復雜的監控,應用程序包如Matlab(http://www.mathworks.com/products/matlab/),可以用來(lái)在操作員的PC或工作站的提供系統運行的圖形展示。
引導LILO和BIOS在哪里
當一個(gè)微處理器第一次啟動(dòng)的時(shí)候,它開(kāi)始在預先設置的地址上執行指令。通常在那里有一些只讀內存,包括初始化或引導代碼。在PC上,這是BIOS。它執行了一些低水平的CPU初始化和其它硬件的配置。BIOS 繼續辨認哪個(gè)磁盤(pán)里有操作系統,把操作系統復制到RAM并且轉向它。實(shí)際上,這非常復雜,但對我們的目標來(lái)說(shuō)也非常重要。在PC上運行的Linux依靠PC的BIOS來(lái)提供這些配置和OS加載功能。
在一個(gè)嵌入式系統里經(jīng)常沒(méi)有這種BIOS。這樣你就要提供同等的啟動(dòng)代碼。幸運的是,嵌入式系統并不需要PC BIOS 引導程序那樣的靈活性,因為它通常只需要處理一個(gè)硬件的配置。這個(gè)代碼更簡(jiǎn)單也更枯燥。它只是一指令清單,將固定的數字塞到硬件寄存器中去。然而,這是關(guān)鍵的代碼,因為這些數值要與你的硬件相符而且要按照特定的順序進(jìn)行。所以在大多數情況下,一個(gè)最小的通電自檢模塊,可以檢查內存的正常運行、讓LED閃爍,并且驅動(dòng)其它必須的硬件以使主Linux OS啟動(dòng)和運行。這些啟動(dòng)代碼完全根據硬件決定,不可隨意移動(dòng)。
幸運的是,許多系統都有為核心微處理器和內存所定制的菜單式硬件設計。典型的是,芯片制造商有一個(gè)樣本主板,可以用來(lái)作為設計的參考或多或少與新設計相同。通常這些菜單式設計的啟動(dòng)代碼是可以獲得的,它可以根據你的需要輕易的修改。在少數情況下,啟動(dòng)代碼需要重新編寫(xiě)。 為了測試這些代碼,你可以使用一個(gè)包含‘模擬內存’的電路內置模擬器,它可以代替目標內存。你把代碼裝到模擬器上并通過(guò)模擬器調試。如果這樣不行,你可以跳過(guò)這一步,但這樣就要一個(gè)更長(cháng)的調試周期。
這個(gè)代碼最終要在較為穩定的內存上運行,通常是Flash或EPROM芯片。你需要使用一些方法將代碼放在芯片上。怎么做,要根據“目標”硬件和工具來(lái)定。
一種流行的方法是把Flash或EPROM芯片插入EPROM或Flash燒制器。這將把你的程序“燒”(存)入芯片。然后,把芯片插入你的目標板的插座,打開(kāi)電源。這個(gè)方法需要板上配有插座,但有些設備是不能配插座的。 另一個(gè)方法是通過(guò)一個(gè)JTAG界面。一些芯片有JTAG界面可以用來(lái)對芯片進(jìn)行編程。這是最方便的方法。芯片可以永遠被焊在主板上,一個(gè)小電纜從板上的JTAG連接器,通常是一個(gè)PC卡,聯(lián)到JTAG界面。下面是PC運行JTAG界面所需的一些慣用程序。這個(gè)設備還可以用來(lái)小量生產(chǎn)。
健壯性比政治家的承諾更可靠
在PC硬件上運行時(shí),Linux是非?煽亢头定的,特別是和現在流行的一些操作系統相比。嵌入式內核本身有多穩定呢?對大多數微處理器來(lái)說(shuō),Linux非常好。移植到新微處理器家族的Linux內核運行起來(lái)與本微處理器一樣穩定。它經(jīng)常被移植到一個(gè)或多個(gè)特定的主板上。這些板包括特定的外圍設備和CPU。
幸運的是,許多代碼是與處理器的,所以移植集中在差異上。其中大多數是在內存管理和中斷控制領(lǐng)域。一旦成功移植,它們就非常穩定。前面我們討論過(guò),引導策略廣泛依賴(lài)于硬件要求,而且你必須有計劃地做一些定制的工作。
設備驅動(dòng)程序更加混亂:有些穩定有些不穩定。而且選擇很有限;一旦你離開(kāi)了通用的PC平臺,你需要自己編寫(xiě)。幸運的是,周?chē)性S多驅動(dòng)程序,你可能可以找到一個(gè)與你的需求相近的修改一下。這種驅動(dòng)程序界面已定義好。許多類(lèi)的驅動(dòng)程序都非常相近,所以把磁盤(pán)、網(wǎng)絡(luò )或一系列的端口驅動(dòng)程序從一個(gè)設備移植到另一個(gè)設備上通常并不難。我發(fā)現許多驅動(dòng)程序都寫(xiě)得很好,很容易理解,但你還是要準備一本關(guān)于內核結構的書(shū)在手頭。 依我的經(jīng)驗,Linux至少和我用過(guò)的著(zhù)名的商業(yè)性操作系統一樣穩定?傊,這些操作系統和Linux的問(wèn)題在于對工作過(guò)程微秒之處的誤解,而不在于代碼的難度或基本的設計錯誤。任何操作系統都有很多爭論不休的故事,這里不需要重復。Linux的優(yōu)勢在于源代碼是公開(kāi)、注釋清晰和文檔齊全的。這樣,你就可以控制和處理所出現的任何問(wèn)題。
伴隨著(zhù)基本內核和驅動(dòng)程序,還有其它問(wèn)題。如果系統有一個(gè)硬盤(pán), 那么文件系統的可靠性就成問(wèn)題。我們有用磁盤(pán)進(jìn)行Linux系統設計超過(guò)兩年的經(jīng)驗。這些系統幾乎從未正常關(guān)閉過(guò)。電源隨時(shí)都可能被中斷。感覺(jué)非常好,使用的是標準(EXT2)文件系統。標準Linux初始化腳本運行fsck程序,它在檢查和清除不穩定的inodes方面非常有效。將默認的每隔30秒運行更新程序改為每隔5或10秒運行是比較明智的。這樣縮短了數據在進(jìn)入磁盤(pán)之前,待在高速緩沖存儲器內的時(shí)間,降低了丟失數據的可能性。
如何發(fā)展
嵌入式Linux的確有它的缺陷。比如,雖然它并不比某些商業(yè)競爭對手差多少,但它的確是個(gè)貪婪的存儲器。這可以通過(guò)減少一些不必要的功能來(lái)彌補,但這可能會(huì )花很長(cháng)的時(shí)間,而且如果不仔細的話(huà),還可能帶來(lái)很大的困擾。
許多Linux的應用程序都要用到虛擬內存,在許多嵌入式系統中,是沒(méi)有價(jià)值的,所以不要以為一個(gè)沒(méi)有磁盤(pán)的嵌入式系統可以運行任何Linux應用程序。
內核調試工具都不怎么好,特別是在較底層的。kgdb可以使錯誤定位非常容易,你只要重新啟動(dòng)。不幸的是,打印語(yǔ)句更麻煩。
然而,對我來(lái)說(shuō)最糟糕的是心理上的問(wèn)題。Linux非常的靈活。嵌入式系統總的來(lái)說(shuō)卻不靈活;而且它們完全是為最有效實(shí)現預定功能而嚴格設計的,F在的趨勢是保持靈活性、保持總體目標功能、盡量少做修改。這個(gè)目標是崇高的,但是,所付出的代價(jià)將是針對具體的工作做出巨大的調整。保持靈活性將導致額外的工作,帶著(zhù)額外的軟件包,而且有時(shí)還要降低性能。一個(gè)反復出現的例子就是配置?紤]在一個(gè)網(wǎng)絡(luò )界面配置IP地址,這通常是通過(guò)從啟動(dòng) script上運行ifconfig程序來(lái)完成的。這是一個(gè)28K的程序,從配置文件上調用數據,可以用幾行代碼代替,初始化合適的結構。然而,即使這非常合理,但它仍然有害,因為它用一種從未使用過(guò)的方法扭曲了軟件。
Linux在嵌入式系統中的應用是可行的。它有用、可靠。它的發(fā)展成本和替代者一致。
技術(shù)咨詢(xún):鄭州信盈達嵌入式、單片機培訓郭老師15737137972 QQ:1962426343
地址:
鄭州實(shí)訓基地:鄭州金水區文化路85號A時(shí)代廣場(chǎng)1906室
鄭州金水區文化路82號樓數碼銀座B座401室(創(chuàng )新大廈對面)
西鄉實(shí)訓基地:深圳市寶安區寶安大道固戍地鐵站A出口新中泰大廈8E
南山實(shí)訓基地:深圳市南山區南新路與桃園路交匯處蘇豪名廈705室
龍華實(shí)訓基地:深圳市寶安區民治大道東邊商務(wù)大樓1188
龍崗實(shí)訓基地:深圳市龍崗區南聯(lián)路10號佰好大廈406(龍崗線(xiàn)南聯(lián)地鐵站C2出口前行30
米即到)
廣州實(shí)訓基地:廣州白云區黃石街江夏地鐵B出口強盛商務(wù)大廈623
|
|