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