嵌入式操作系統中的關鍵技術
——
現在許多嵌入式系統要勝任的工作越來越復雜,需要采用32位的嵌入式處理器,這樣嵌入式操作系統就成為嵌入式系統設計中必不可少的一個環(huán)節(jié)。眾所周知通用操作系統(如Microsoft Windows系列的操作系統)并不適合直接應用在嵌入式操作系統上,為了適應嵌入式系統的需要,必須在整個系統的軟件架構中引入嵌入式操作系統。
在嵌入式系統應用中,早期的16位及16位以下的微處理器計算能力有限,要處理的任務一般比較簡單,因而程序員可以在應用程序中自己管理微處理器的工作流程,很少需要用到嵌入式操作系統。當系統變得較為復雜后,對系統中斷的處理以及多個功能模塊之間的協調需要由程序員自己來控制和解決,這樣做的結果是,隨著程序內部的邏輯關系變得越來越復雜,軟件開發(fā)小組對于駕馭復雜的功能模塊逐漸顯得力不從心,為了保證中斷相關處理的正確性和完整性,為了保證不同模塊之間對硬件資源的共享和互斥,為了保證系統能定期執(zhí)行各種任務,軟件開發(fā)小組不得不編寫和維護一個復雜的專用操作系統和應用程序的結合體,這樣做使得系統的開發(fā)和維護成本加大,也不利于系統的升級。所以在逐漸變得復雜的嵌入式系統中采用成熟的嵌入式操作系統成為更好的解決方案,如嵌入式Linux,VxWorks、pSOS、WinCE、DeltaOS、uCOS、TinyOS等等。
為了實現一個支持各種硬件體系結構、運行穩(wěn)定高效的嵌入式操作系統需要付出很多的心血,嵌入式操作系統本身包含大量的代碼,而且這些代碼非常精巧、相應的數據結構非常復雜,即使是讀懂這些代碼也要花費很多時間。比如最簡單的μCOS-II嵌入式操作系統的最小實現也需近千行代碼,而普通的嵌入式Linux內核則有近百萬行代碼。在嵌入式開發(fā)中推薦采用一種通用的嵌入式操作系統,而不是自己從頭編寫一個專用的嵌入式操作系統,因為通甩的嵌入式操作系統經過多年的發(fā)展一般來說穩(wěn)定性,性能、功能等各方面都會比自己重寫一個專用的操作系統要好,而且購買它們的成本也比自己從頭開發(fā)要低得多;另外,通用嵌入式操作系統一般都遵循操作系統接口標準——POSIX,使用這些系統調用接口進行開發(fā)可以大大方便上層應用軟件在不同嵌入式操作系統、不同操作系統版本之間的移植,系統升級換代方便、成本低、速度快。 總結來說采用嵌入式操作系統的原因是:解決多任務所帶來的復雜性;提高應用程序的可移植性;降低系統開發(fā)和維護成本。
嵌入式操作系統中的關鍵技術
在一個完整的嵌入式系統中,嵌入式操作系統介于底層硬件和上層應用程序之間,如圖1所示,它是整個系統中不可缺少的重要組成部分。
嵌入式操作系統與傳統操作系統的基本功能是一致的,即:首先嵌入式操作系統必須能正確、高效地訪問和管理底層的各種硬件資源,很好地處理資源管理中的沖突;其次嵌入式操作系統要能為應用程序提供功能完備、使用方便、與底層硬件細節(jié)無關的系統調用接口。
但嵌入式操作系統也有其獨特的需求和技術特點,主要區(qū)別是:
1)許多嵌入式系統應用有實時性要求,因此多數嵌入式操作系統都具備實時性的技術指標,能保障系統的實時響應速度;
2)為適應嵌入式系統計算資源的限制,嵌入式操作系統核心部分的體積必須盡可能的??;
3)為了適應各種應用需求的變化,嵌入式操作系統還應該具有可裁減性、可伸縮性、易移植性的特點,讓開發(fā)人員可以根據需要對嵌入式操作系統進行剪裁和移植;
4)嵌入式操作系統往往是長期連續(xù)運行的,因此要求要有很高的可靠性,不能“死機”;
5)針對特定的應用需求,嵌入式操作系統往往還要對某些模塊做特別的性能優(yōu)化和功能增強。
實時性
許多應用場合對嵌入式系統有實時性的要求,比如汽車的安全氣囊要求能在一個極短的時間內偵測到汽車碰撞事件的發(fā)生并控制打開安全氣囊。為了實現上述目標,一方面硬件的傳感器和安全氣囊要有足夠快的響應速度,另一方面就是微處理器、嵌入式操作系統和相應的事件響應程序要能處理得足夠快。
普通操作系統為了實現在多進程并發(fā)執(zhí)行時進行正確的資源管理,往往會對某段代碼通過關中斷的方式進行保護,而且由于多個進程并發(fā)執(zhí)行后情況變得異常復雜,關中斷的時間可能被拖得很長且不確定,中斷的關閉就會使得實時請求不能通過中斷信號迅速告知CPU,因此系統可能出現的最長關中斷時間決定著操作系統的實時性的指標。嵌入式操作系統為了提高實時性能,就必須盡量縮短操作系統代碼中的關閉中斷過程,并通過精心的設計確定關中斷的時間長短。這些設計包括:
1)操作系統中的進程必須是具有嚴格優(yōu)先級差異的,而且應該是搶占式的操作系統內核,即最高優(yōu)先級的進程即使是最后出現,也應該最先獲得運行,而且是無條件立即停止當前進程的運行來切換到具有最高優(yōu)先級的進程。如圖2所示。
2)與實時處理相關的函數應盡量都是可重入的,即函數中均使用局部變量。如果使用全局變量,為保證程序的正確性必須對全局變量的訪問加鎖,而這樣的保護措施有可能導致進程堵塞,從而影響操作系統的實時性。
3)高效的克服優(yōu)先級反轉問題,防止高優(yōu)先級的進程由于等待某些被低優(yōu)先級進程已占用的資源,從而被其他低優(yōu)先級的進程搶先運行,影響系統的實時性能。
4)其他實時操作系統內核的設計,如解決周期性任務的調度和時間抖動問題等。
在實時性方面,VxWorks、uC/OS-II,QNX,國內的DeltaOS等操作系統都具有較好的實時性能,其中VxWorks是性能穩(wěn)定的商用實時操作系統,有較長的使用歷史和廣泛的用戶群;uC/OS-II操作系統是開放源碼的小型實驗性操作系統,實時性很強,而且代碼簡單,便于分析、學習與改造,應用范圍也很廣;DeltaOS是國內自主研發(fā)的實時操作系統,廣泛地應用于工業(yè)、軍事等領域;普通的Linux操作系統在經過實時性改造后也可以具有較強的實時性而成為實時操作系統,如RTAI-Linux等。
當然,需要說明的是并不是所有的嵌入式系統都有實時性的要求,因此也并不是所有的嵌入式操作系統都必需是實時操作系統,在智能手機、PDA等嵌入式應用中就廣泛地采用了嵌入式Linux, WinCE等非實時的操作系統。
小內核、可配置與易移植
嵌入式系統往往只具備較小的存儲資源,而且存儲器的大小往往與嵌入式系統的制造成本緊密相關,因此必須采用盡量小的操作系統基本內核,同時讓其他各種非必須的部分通過開發(fā)人員需要進行配置并加入到操作系統的基本內核中,這樣可以使得嵌入式操作系統內核的尺寸保持得較小。嵌入式操作系統的尺寸包括靜態(tài)的尺寸(內核二進制文件占用非易失存儲器的大小)和動態(tài)的尺寸(系統運行起來后占用內存的大?。?。這兩者都很重要,靜態(tài)尺寸反映了對Fla-sh等非易失存儲器的占用情況,動態(tài)尺寸反映了對SDRAM等系統內存的消耗情況。
可配置性是嵌入式操作系統的又一個重要特征,也是區(qū)別于通用操作系統的一個重要特點。在嵌入式領域,底層硬件和應用需求往往變化多端,有的系統需要存儲管理單元來在虛擬地址空間上運行程序;有的嵌入式系統希望具有優(yōu)先級搶先調度機制;有的嵌入式系統希望實時時鐘的周期為20ms,有的希望是1ms;有的嵌入式系統的底層硬件有多級中斷,有的只有一級中斷等等。所有這些變化使一個嵌入式操作系統要想占據更大的市場份額,就必須自身具備可配置性,并且配置功能方便易用,使得同一個嵌入式操作系統的代碼在經過較為方便的配置后,可以在特定的石更件平臺和應用需求下獲得最佳的性能。eCos嵌入式操作系統是可配置性的典型代表,它在操作系統內部設計了大量可以調節(jié)操作系統特性和性能的參數,并為配置這些參數設計了專門的配置工具,該工具具有Windows和Linux等多種版本,可以在開發(fā)主機(Host機)上方便地進行配置,如圖3所示。除eCos操作系統外,其他嵌入式操作系統如OSKit、Lin-ux, VxWorks、WinCE等操作系統也具備不同程度的可配置性。
可移植性是指同一個嵌入式操作系統在進行適當修改后可以在不同的硬件平臺上成功運行。由于移植的目的是希望在不同的底層硬件平臺(或者說是不同的嵌入式處理器)上運行,因此嵌入式操作系統為了獲得良好的可移植性,一般都將移植時一需要修改的代碼集中在少數幾個與硬件操作相關的C程序或匯編程序中,或者將相關代碼獨立成外設驅動程序,以方便系統開發(fā)人員的移植工作,比如嵌入式操作系統中提到的硬-件抽象層(HAL、板級支持包(BSP)等概念都是為加快移植工作效率而提出的;同時為方便移植,嵌入式操作系統的開發(fā)和維護團隊還應該提供完整的文檔來詳細說明移植的過程和步驟,幫助系統設計人員完成移植工作;此外雖然嵌入式處理器多種多樣,但同一系列的處理器還是非常相近的,通過提供盡可能多的已有硬件平臺上的移植結果,或者由系統開發(fā)人員在Internet上搜索盡可能多的已有工作成果,也是加快移植速度、提高嵌入式操作系統可移植性的有效途徑。
可靠性
任何軟件都有可能存在錯誤,嵌入式操作系統也不例外。運行在桌面上的操作系統有時會“死機”,使用者還可以通過手工重啟計算機來予以容忍,但是嵌入式系統往往要長期在無人值守的環(huán)境下運行,甚至是常年運行,因此對可靠性的要求就成為嵌入式操作系統的一個重要特點?,F在已有的一些嵌入式操作系統,如嵌入式Linux, VxWorks、uC/OS等等都已經經過了多年應用的考驗,也有無數的工程師對它們的代碼進行了檢查,一般來說這些操作系統都是較為穩(wěn)定和安全的,以Linux內核為例,有研究估計570萬行的Linux內核源碼中約包含不到1000個程序設計錯誤,錯誤率為不到萬分之二。但是沒有任何方法可以證明它們是絕對安全可靠的,也許在普通應用(如手機等消費類電子產品)中這些系統還可以接受,但是在一些特殊應用場合下,如軍用、醫(yī)用、核電站、航空航天、工業(yè)控制、汽車制動等,系統的一個錯誤就可能造成很大的損失,因此針對這些領域的需求,在嵌入式系統的設計中還應該對操作系統內核的代碼進行詳細的檢查,并進行大量的測試,保證嵌入式操作系統的可靠性。為實現這一目標,迄今為止還沒有行之有效的方法,而主要依靠設計人員的豐富經驗、認真仔細的作風、大量時間和人力成本的投入、廣泛實際應用的檢驗來實現。
結語
本文探討了嵌入式操作系統與通用的臺式計算機操作系統的異同,介紹了嵌入式操作系統所具備的特點。未來隨著嵌入式系統的應用需求越來越多樣化、越來越復雜,嵌入式操作系統必將在上述這些特點上(如實時性、可配置性、可移植性等)越來越具有特色,分別適用于不同的嵌入式應用需求,不斷加快嵌入式系統的開發(fā)周期,同時又能降低嵌入式系統的研發(fā)和生產成本。
評論