早期的嵌入式系統(tǒng)很多都不用操作系統(tǒng),它們都是為了實(shí)現(xiàn)某些特定功能,使用一個(gè)簡單的循環(huán)控制對(duì)外界的控制請(qǐng)求進(jìn)行處理,不具備現(xiàn)代操作系統(tǒng)的基本特征(如進(jìn)程管理、存儲(chǔ)管理、設(shè)備管理、網(wǎng)絡(luò)通訊等)。但隨著控制系統(tǒng)越來越復(fù)雜,應(yīng)用范圍越來越廣泛的時(shí)候,缺少操作系統(tǒng)就造成了很大的限制。C語言的出現(xiàn)促進(jìn)了操作系統(tǒng)的發(fā)展。20世紀(jì)80年代以來,出現(xiàn)了各種各樣的商業(yè)用嵌入式操作系統(tǒng)。如QNX,VxWorks,RT-Linux以及Windows CE等。使得在嵌入式系統(tǒng)設(shè)計(jì)時(shí)有了很大的選擇余地,但選擇的操作系統(tǒng)是否恰當(dāng)對(duì)整個(gè)系統(tǒng)的開發(fā)有著摯為關(guān)鍵的影響??偟膩碚f,嵌入式操作系統(tǒng)的選擇可以遵從一下幾條主要原則:
l 實(shí)時(shí)性。嵌入式操作系統(tǒng)的實(shí)時(shí)性主要與系統(tǒng)的結(jié)構(gòu)、任務(wù)調(diào)度策略、中斷處理手段以及內(nèi)存管理方法有關(guān)。
l 系統(tǒng)定制能力。工業(yè)控制產(chǎn)品不同于民用PC的WinTel(微軟Windows+I(xiàn)ntel處理器)結(jié)構(gòu),后者比較簡單,前者需求則是千差萬別的,因此硬件系統(tǒng)也都不一樣,所以對(duì)系統(tǒng)的定制能力有較高的要求。
l 可移植性。當(dāng)進(jìn)行嵌入式軟件開發(fā)時(shí),可移植性是要重點(diǎn)考慮的問題。良好的軟件移植性應(yīng)該比較好,可以在不同平臺(tái)、不同系統(tǒng)上運(yùn)行,跟操作系統(tǒng)無關(guān)。
l 可利用資源。產(chǎn)品開發(fā)不同于學(xué)術(shù)課題研究,它以快速、低成本、高質(zhì)量的推出適合用戶需求的產(chǎn)品為目的。集中精力研發(fā)出產(chǎn)品的特色,其他功能盡量由操作系統(tǒng)附加或采用第三方產(chǎn)品,因此操作系統(tǒng)的可利用資源對(duì)于選型是一個(gè)重要參考條件。如果有大量的資源可以利用,無疑會(huì)極大的縮短開發(fā)周期降低成本。
l 網(wǎng)絡(luò)能力?,F(xiàn)在的工業(yè)控制系統(tǒng)對(duì)聯(lián)網(wǎng)的要求越來越多,即使目前的產(chǎn)品不需要具有聯(lián)網(wǎng)的能力,也應(yīng)該為以后的升級(jí)留下余地。
l 圖形界面開發(fā)能力。友好的圖形界面對(duì)多數(shù)控制系統(tǒng)來說都是必不可少的,相應(yīng)的開發(fā)工具是否功能強(qiáng)、使用簡單對(duì)開發(fā)的影響很大。
l 中文內(nèi)核支持。畢竟,作為國內(nèi)的工業(yè)控制系統(tǒng),如果不支持中文,怎么能不說是一個(gè)缺憾?
l 已有的條件。在滿足可靠應(yīng)用的條件下,降低開發(fā)成本是每個(gè)控制系統(tǒng)開發(fā)考慮最多的因素之一。能根據(jù)自己的實(shí)際情況,合理的利用已有的條件,將會(huì)對(duì)降低成本有很大的作用,也會(huì)縮小產(chǎn)品的上市時(shí)間。
下面就四種常見的嵌入式操作系統(tǒng)對(duì)實(shí)時(shí)性、網(wǎng)絡(luò)能力、圖形界面開發(fā)以及開放性等方面進(jìn)行分析比較,并結(jié)合課題的實(shí)際情況,闡述了選擇QNX作為本課題的嵌入式系統(tǒng)設(shè)計(jì)平臺(tái)的理由。
Windows CE可分為四個(gè)主要模塊[10,11,12,24],如圖2.1所示,它們分別是內(nèi)核模塊、對(duì)象存儲(chǔ)/文件系統(tǒng)模塊、網(wǎng)絡(luò)與通訊模塊、GWES模塊(圖形、窗口、事件子系統(tǒng))。此外還有三個(gè)重要的組成部分:驅(qū)動(dòng)程序、設(shè)備管理器、OAL(OEM適配層,OEM Adaptation Layer)。
圖2.1 Windows CE體系結(jié)構(gòu)圖
Windows CE內(nèi)核模塊是coredll.dll表示,最小為200KB。它是Windows CE操作系統(tǒng)的核心,并為應(yīng)用程序提供基本服務(wù):進(jìn)程管理、多任務(wù)多線程管理、內(nèi)存和資源管理、中斷處理、異常處理等。Windows CE的RAM存儲(chǔ)內(nèi)存空間又被稱為“對(duì)象存儲(chǔ)(Object Store)”。一般包括三種類型的數(shù)據(jù):Windows CE文件系統(tǒng)(包括數(shù)據(jù)文件和程序)、系統(tǒng)注冊(cè)表和Windows CE數(shù)據(jù)庫(一種結(jié)構(gòu)化存儲(chǔ)方法,Pocket PC內(nèi)置程序多使用它)。Windows CE提供了比桌面系統(tǒng)更豐富的通訊支持。GWES模塊即圖形、窗口、事件子系統(tǒng),是用戶、應(yīng)用程序、操作系統(tǒng)之間的圖形用戶界面。而且Windows CE支持在沒有圖形界面的設(shè)備上使用諸如窗口、消息機(jī)制和電源管理的特性。
Windows CE內(nèi)核支持按優(yōu)先級(jí)搶占的方式調(diào)度多任務(wù)。Windows CE最多支持32個(gè)進(jìn)程,系統(tǒng)啟動(dòng)時(shí)至少創(chuàng)建4個(gè)進(jìn)程:nk.exe(內(nèi)核)、filesys.exe(文件系統(tǒng))、gwes.exe(GUI支持)、device.exe(加載維護(hù)系統(tǒng)設(shè)備驅(qū)動(dòng)程序)。大多數(shù)平臺(tái)還有exeplorer.exe(外殼)等服務(wù)進(jìn)程,用戶實(shí)際可以使用的進(jìn)程也只有20多個(gè)。進(jìn)程有自己受保護(hù)的32MB虛擬地址空間,但沒有優(yōu)先級(jí)。Windows CE支持的優(yōu)先級(jí)是線程的優(yōu)先級(jí)。線程是操作系統(tǒng)調(diào)度和運(yùn)行的基本單位。線程由進(jìn)程創(chuàng)建,是進(jìn)程的一個(gè)實(shí)體,總是隸屬于進(jìn)程,并共享進(jìn)程的地址空間。線程總數(shù)只受物理內(nèi)存的限制。Windows CE實(shí)現(xiàn)搶占式、基于優(yōu)先級(jí)的線程調(diào)度,線程之間由8個(gè)優(yōu)先級(jí)來競爭CPU時(shí)間片。線程間的“同步”由“等待函數(shù)”和“等待對(duì)象”實(shí)現(xiàn):將等待對(duì)象作為參數(shù)傳遞給等待函數(shù),等待函數(shù)直到滿足條件才返回;如果不滿足條件,那么調(diào)用線程一直處于等待狀態(tài)。Windows CE支持的“等待對(duì)象”包括:臨界區(qū)域?qū)ο?、事件?duì)象和互斥體對(duì)象。
四種操作系統(tǒng)都采用同樣的傳統(tǒng)中斷模式。用戶往某一中斷源掛接特定中斷后,實(shí)時(shí)操作系統(tǒng)創(chuàng)建一條ISR(中斷服務(wù)例程)。所有的ISR地址保存在中斷向量表中,并被硬件直接調(diào)用。ISR先執(zhí)行一些保護(hù)現(xiàn)場的操作,然后調(diào)用用戶定義的中斷響應(yīng)函數(shù)。
Windows CE采用的是基于優(yōu)先級(jí)的可嵌套中斷機(jī)制。Windows CE的中斷處理分為兩部分:ISR和IST(中斷服務(wù)線程)。ISR是核心代碼部分,IST是用戶代碼部分。Windows CE可以將中斷請(qǐng)求(ISR)映射為硬件中斷,并且實(shí)現(xiàn)相應(yīng)的ISR和IST。Windows CE的中斷機(jī)制是:當(dāng)ISR被觸發(fā)時(shí),ISR只負(fù)責(zé)啟動(dòng)IST,一旦IST啟動(dòng)后,ISR立即就返回,以便響應(yīng)新的中斷。IST負(fù)責(zé)處理實(shí)際的中斷處理。ISR運(yùn)行在特殊的上下文中。IST是一個(gè)普通的應(yīng)用程序線程,具有它自己的上下文和堆棧。
Windows CE實(shí)現(xiàn)了“分頁虛擬內(nèi)存管理系統(tǒng)”。實(shí)現(xiàn)虛擬內(nèi)存機(jī)制需要設(shè)備中的CPU具有MMU(Memory Manager Unit)。Windows CE使用CPU的MMU來實(shí)時(shí)地將虛擬地址轉(zhuǎn)換為物理地址。Windows CE為全部應(yīng)用程序?qū)崿F(xiàn)的虛擬地址空間為2GB,為每個(gè)應(yīng)用程序?qū)崿F(xiàn)的虛擬地址空間為32MB。虛擬頁面可以處于三種狀態(tài):空閑、保留、提交(占用)??臻e頁(free)是可以被保留或提交的可用頁。保留頁(reserved)是邏輯頁已分配但沒有分配物理存儲(chǔ)的頁。提交/占用頁(committed)是物理存儲(chǔ)已分配的頁。
Windows CE提供了豐富的通訊支持,主要有:串行通訊(支持PPP/SLIP協(xié)議實(shí)現(xiàn)的串行直接連接和撥號(hào)連接),TCP/IP、FTP、HTTP協(xié)議和Winsock1.1的一個(gè)子集合,紅外通訊協(xié)議IrDA、IrSock和IrComm,通過網(wǎng)絡(luò)驅(qū)動(dòng)程序接口規(guī)范(NDIS)支持局域網(wǎng),支持遠(yuǎn)程訪問RAS、USB連接、藍(lán)牙連接和無線局域網(wǎng)連接等,支持SSPI(“安全支持提供者接口”)、CAPI(密碼API)、TAPI(電話API)等。
Windows CE程序開發(fā)語言主要是eVB和eVC。程序開發(fā)工具重要由微軟提供,主要產(chǎn)品有eMbedded Visual Tools和Windows CE Platform Builder。此外,也可使用Java語言開發(fā)Windows CE程序,相關(guān)工具由SUN公司提供,包括PC端的Java運(yùn)行環(huán)境J2SDK for windows和Personal Java的仿真器PJEE(Personal Java Emulation Environment)。
這里所謂的開放性主要指的是與POSIX標(biāo)準(zhǔn)的符合程度。POSIX表示可移植操作系統(tǒng)接口(Portable Operating System Interface)。IEEE最初開發(fā)POSIX標(biāo)準(zhǔn),是為了提高UNIX環(huán)境下應(yīng)用程序的可移植性。然而,POSIX并不局限于UNIX。許多其它的操作系統(tǒng),例如Microsoft Windows NT,都支持POSIX標(biāo)準(zhǔn),尤其是 IEEE Std. 1003.1-1990(1995 年修訂)或 POSIX.1,POSIX.1 提供了源代碼級(jí)別的C語言應(yīng)用編程接口(API)給操作系統(tǒng)的服務(wù)程序,例如讀寫文件。POSIX.1已經(jīng)被國際標(biāo)準(zhǔn)化組織(International Standards Organization,ISO)所接受,被命名為ISO/IEC 9945-1:1990 標(biāo)準(zhǔn)。
Windows CE是直接從NT發(fā)展過來的,繼承了1000多個(gè)Win32 API 函數(shù)。Win32是Widows NT和Windows 95的編程接口。Win32對(duì)于Windows就像POSIX對(duì)于Unix一樣。
RT-Linux從本質(zhì)上講是對(duì)通用操作系統(tǒng)的Linux的實(shí)時(shí)改造的變種[1,6,13,14,28,57]。
Linux作為一種通用操作系統(tǒng),雖然由于其開放性近來在嵌入式設(shè)計(jì)中有了較廣的應(yīng)用,但由于其注重的是系統(tǒng)的平均性能,在很多方面使得Linux不適合實(shí)時(shí)應(yīng)用。主要的幾點(diǎn)包括:分時(shí)調(diào)度策略,較低的時(shí)鐘分辨率,內(nèi)核的非搶占式機(jī)制,過多的禁止中斷操作,以及虛擬內(nèi)存機(jī)制。這些對(duì)于通用操作系統(tǒng)來說非常出色的設(shè)計(jì)在實(shí)時(shí)系統(tǒng)中都變得不合時(shí)宜。
然而,RT-Linux把Linux作為新的實(shí)時(shí)內(nèi)核調(diào)度下的最低優(yōu)先級(jí)任務(wù)執(zhí)行。其本身的實(shí)現(xiàn)只需要一個(gè)實(shí)時(shí)內(nèi)核。設(shè)計(jì)中的巧妙之處是通過截獲底層中斷改造了Linux,取得CPU控制權(quán)執(zhí)行實(shí)時(shí)任務(wù)。這樣,只需對(duì)Linux進(jìn)行較小的改動(dòng)就可以實(shí)現(xiàn)實(shí)時(shí)功能,且能夠使用Linux下提供的豐富開發(fā)工具和己有功能,如網(wǎng)絡(luò)功能,圖形接口等。更重要的是,RT-Linux還繼承了Linux具備的開放性、標(biāo)準(zhǔn)化、技術(shù)支持豐富、便宜等特性。并且,Linux內(nèi)核升級(jí)與RT-Linux升級(jí)保持了彼此獨(dú)立,使得整個(gè)系統(tǒng)更容易維護(hù)。
RT-Linux實(shí)現(xiàn)了一個(gè)小的實(shí)時(shí)核心,僅支持底層任務(wù)創(chuàng)建、中斷服務(wù)例程的裝入、底層任務(wù)通信隊(duì)列、中斷服務(wù)例程(ISR)和Linux進(jìn)程。原來的非實(shí)時(shí)Linux內(nèi)核作為一個(gè)可搶占的任務(wù)運(yùn)行于這個(gè)小內(nèi)核之上,所有的任務(wù)都在內(nèi)核地址空間運(yùn)行。它不同于微內(nèi)核和大型內(nèi)核,是雙內(nèi)核體系結(jié)構(gòu)。
與其他RTOS相比,RT-Linux進(jìn)程間通信不夠靈活。其實(shí)時(shí)任務(wù)之間,及實(shí)時(shí)任務(wù)與其他Linux任務(wù)之間的通信方式只有一種:RT-FIFO。RT-FIFO緩沖區(qū)分配在內(nèi)核地址空間。對(duì)RT-FIFO的讀寫操作均為原子操作,不能夠阻塞。
圖2.2和圖2.3分別示出了純Linux體系結(jié)構(gòu)和RT-Linux體系結(jié)構(gòu)。
圖2.2 純Linux體系結(jié)構(gòu)圖
圖2.3 RT-Linux體系結(jié)構(gòu)圖
RT-Linux在操作系統(tǒng)之下實(shí)現(xiàn)了一個(gè)簡單的實(shí)時(shí)內(nèi)核,Linux本身作為一個(gè)可搶占的任務(wù)在核內(nèi)運(yùn)行,其優(yōu)先級(jí)最低,隨時(shí)會(huì)被高優(yōu)先級(jí)的實(shí)時(shí)任務(wù)搶占。
RT-Linux是開放源碼的操作系統(tǒng)。其開放性給用戶帶來了很大便利。在任務(wù)調(diào)度方面,用戶可以自行編寫調(diào)度程序,可實(shí)現(xiàn)為可加載的核心模塊。目前在實(shí)時(shí)Linux上實(shí)現(xiàn)的調(diào)度算法有:搶占式優(yōu)先級(jí)調(diào)度,最早期限優(yōu)先調(diào)度(EDF)。RT-Linux允許的實(shí)時(shí)任務(wù)優(yōu)先級(jí)范圍從1(最高)到RT_LOWEST_PRIORITY。同樣由于源碼開放性,優(yōu)先級(jí)數(shù)目也可以由用戶在編譯核心時(shí),指定相應(yīng)的RT_LOWEST_PRIORITY值確定,這有給了用戶很多自由。
對(duì)于RT-Linux,中斷處理方式有著更重要的意義。那就是同時(shí)要保證作為實(shí)時(shí)系統(tǒng)一個(gè)任務(wù)的原有Linux內(nèi)核仍正常運(yùn)行。為此,RT-Linux在Linux內(nèi)核與中斷控制器硬件之間,加入了一層仿真軟件。所有的硬件中斷都被送往這層仿真軟件先做處理。在Linux源碼中,所有出現(xiàn)的cli,sti,iret指令,都被相應(yīng)的仿真宏定義取代,這些宏是S_CLI,S_STI,S_IRET。
當(dāng)Linux執(zhí)行禁止中斷指令時(shí),仿真軟件中的一個(gè)變量被重置。無論何時(shí),當(dāng)中斷發(fā)生時(shí),仿真軟件都會(huì)檢查此變量。如果變量被置位(Linux允許中斷),則Linux中斷處理函數(shù)被立即調(diào)用。如果變量沒有被置位(Linux禁止中斷),則中斷處理函數(shù)不被調(diào)用。但是,此變量中相應(yīng)的某個(gè)比特會(huì)被置位,以記錄下有中斷等待處理。當(dāng)Linux重新使能中斷后,所有等待處理中斷的處理函數(shù)會(huì)依次執(zhí)行。這種仿真中斷的技術(shù)稱為軟中斷。這樣的結(jié)構(gòu)下,Linux失去了對(duì)中斷的直接控制,因此它不會(huì)影響那些不通過仿真軟件的實(shí)時(shí)中斷,保證了RT-Linux的實(shí)時(shí)性。
Linux使用由Intel 80x86系列處理器提供的頁面機(jī)制,為每一任務(wù)提供互相獨(dú)立的內(nèi)存空間,并有內(nèi)存保護(hù)。在實(shí)時(shí)系統(tǒng)中,這樣做帶來的直接問題是任務(wù)切換時(shí)間過長。因此,后來的RT-Linux設(shè)計(jì)采用的方法是在同一個(gè)地址空間運(yùn)行所有的實(shí)時(shí)任務(wù)。并且,使用的是內(nèi)核地址空間。之所以使用內(nèi)核地址空間,是為了把由內(nèi)存保護(hù)級(jí)別變化所引起的額外開銷消除。并且,Linux提供動(dòng)態(tài)裝載內(nèi)核模塊(ladable kernel modules)功能也可以用在實(shí)時(shí)系統(tǒng)中。方法是把實(shí)時(shí)任務(wù)作為可裝載內(nèi)核模塊創(chuàng)建,運(yùn)行,及刪除。
RT-Linux使用內(nèi)核地址空間運(yùn)行的方案,與不使用內(nèi)存保護(hù)的VxWorks一樣,同樣存在地址越界引起的危險(xiǎn)。任何錯(cuò)誤的實(shí)時(shí)任務(wù)都可能破壞整個(gè)系統(tǒng)。
Linux系統(tǒng)的一個(gè)主要特點(diǎn)是他的網(wǎng)絡(luò)功能非常強(qiáng)大。RT-Linux由于具有雙內(nèi)核,可以很好的利用linux的網(wǎng)絡(luò)功能。
嵌入式Linux的圖形用戶界面有很多選擇,比如MicroWidows、緊縮的X Widow、tinyX等,國內(nèi)做的比較出色的是miniGUI。miniGUI最初是為了滿足一個(gè)工業(yè)控制系統(tǒng)(計(jì)算機(jī)數(shù)控系統(tǒng))而設(shè)計(jì)和開發(fā)的,該系統(tǒng)就是采用RT-Linux作為實(shí)時(shí)操作系統(tǒng)。由于可以利用Linux自由開放的豐富資源,相應(yīng)的開發(fā)工具也很豐富。
RTLinux是一個(gè)嚴(yán)格遵守POSIX 1003.13技術(shù)規(guī)范的硬實(shí)時(shí)操作系統(tǒng),運(yùn)行在Linux或者BSD Unix之上。RTLinux堅(jiān)持分離實(shí)時(shí)和非實(shí)時(shí)代碼,操作系統(tǒng)和應(yīng)用軟件中的關(guān)鍵實(shí)時(shí)組件將給予絕對(duì)的優(yōu)先權(quán),以避免非實(shí)時(shí)組件影響實(shí)時(shí)組件的響應(yīng)時(shí)間。實(shí)時(shí)內(nèi)核為需要微秒級(jí)中斷延遲的軟件提供了一個(gè)熟悉的POSIX線程和精確調(diào)度。
VxWorks在體系結(jié)構(gòu)上屬子“客戶機(jī)/服務(wù)器”結(jié)構(gòu)。也有另一種觀點(diǎn)認(rèn)為它是統(tǒng)一模型結(jié)構(gòu)[15,16,17,24,28,57]。與QNX相比,VxWorks的“客戶機(jī)/服務(wù)器”概念要模糊一些。
VxWorks運(yùn)行系統(tǒng)的核心是“wind”微內(nèi)核。wind微內(nèi)核支持全部的實(shí)時(shí)功能,包括多任務(wù),任務(wù)調(diào)度,任務(wù)間同步/通信和內(nèi)存管理四項(xiàng)主要功能。核心以外的其它功能都作為任務(wù)運(yùn)行。比如文件系統(tǒng),調(diào)試任務(wù),TCP/IP協(xié)議模塊等。
VxWorks缺少必要的存儲(chǔ)保護(hù)機(jī)制。最高優(yōu)先級(jí)的任務(wù)和用戶定義的任務(wù)在同一個(gè)地址空間運(yùn)行。這樣做的好處是VxWorks任務(wù)切換時(shí)的時(shí)間非常短。缺點(diǎn)也是明顯的,增加了系統(tǒng)的不穩(wěn)定性。不過,VxWorks也提供了替代方案,另一個(gè)可選模塊(VxVMI)為系統(tǒng)任務(wù)提供了保護(hù)。
VxWorks另一缺點(diǎn)是多CPU協(xié)同工作能力差。不同CPU上運(yùn)行的任務(wù)間通信只能通過消息隊(duì)列(message queue),并且這類消息隊(duì)列必須在CPU之間有共享內(nèi)存時(shí)才可用。支持共享內(nèi)存的模塊(VxMP)還必須另外購買。
當(dāng)然,Socket機(jī)制可用于類似的應(yīng)用中(VxWorks的網(wǎng)絡(luò)功能很強(qiáng))。但是,在可靠的連路上使用TCP/IP協(xié)議給系統(tǒng)增加了許多延時(shí)和額外處理開銷。
圖2.4 VxWorks系統(tǒng)結(jié)構(gòu)圖
VxWorks中,所有的任務(wù)運(yùn)行在同一內(nèi)存空間,彼此間缺少保護(hù)。為用戶提供的優(yōu)先級(jí)數(shù)目256,能夠滿足較為復(fù)雜的實(shí)時(shí)應(yīng)用需求。系統(tǒng)所能夠創(chuàng)建的任務(wù)數(shù)目與VxWorks無關(guān),只受制于內(nèi)存大小。在任務(wù)調(diào)度方面,支持搶占式優(yōu)先級(jí)調(diào)度策略。并且,可以選擇使用Round-Robin調(diào)度。
VxWorks提供了完善的機(jī)制解決搶占式調(diào)度帶來的優(yōu)先級(jí)逆轉(zhuǎn)(Priority Invert)問題。
可嵌套、分優(yōu)先級(jí)的中斷方式。所有中斷響應(yīng)在特殊的中斷上下文中執(zhí)行,與任務(wù)上下文無關(guān)。所有中斷使用同一中斷棧。中斷棧的大小必須考慮到所有的中斷嵌套情況。
中斷與任務(wù)間的通信有多種方式:共享內(nèi)存,環(huán)形緩沖區(qū),信號(hào)量,消息隊(duì)列,管道。
VxWorks缺少內(nèi)存保護(hù)機(jī)制,導(dǎo)致了系統(tǒng)的不穩(wěn)定性。
VxWorks的網(wǎng)絡(luò)系統(tǒng)基本上是移植了BSD4.4 Unix的TCP/IP協(xié)議族,僅在實(shí)時(shí)性上進(jìn)行了較大的修改,如用Semaphores代替原TCP/IP實(shí)現(xiàn)中的Interrupt Lock和修改Socket代碼中無Timeout的部分。這使得網(wǎng)絡(luò)應(yīng)用層的開發(fā)和移植都非常方便。VxWorks支持工業(yè)標(biāo)準(zhǔn)TCP/IP協(xié)議族,具體包括:
l IP、IGMP、CIDR、TCP、UDP、ARP、RARP、RIPV1/V2
l Standard Berkeley Sockets
l Z-bufs、NFS、RPC
l PPP、BOOTP、DNS、DHCP、TFTP、FTP
l RLOGIN、TELNET、RSH
VxWorks還支持可選的Windnet產(chǎn)品,包括SNMP、OSPF、STREAMS等。但是VxWorks的網(wǎng)絡(luò)功能還有一定的缺陷,比如目前版本的PPP協(xié)議還有一定的局限性,最多只能支持16路鏈路。
VxWorks的優(yōu)勢在于多任務(wù)和實(shí)時(shí)性,做圖形界面不是很出色。目前VxWorks上的GUI主要有三種選擇:windML、ZINC和Tilcon。
WindML即Wind Media Library(媒體庫),是Wind River的專業(yè)圖形化環(huán)境,它主要是為了滿足較簡單的單功能設(shè)備的圖像要求用來提供基本的圖形、視頻和聲頻技術(shù)以及提供一個(gè)設(shè)計(jì)標(biāo)準(zhǔn)設(shè)備驅(qū)動(dòng)程序框架。WindML API庫提供了一個(gè)統(tǒng)一的圖形硬件接口以及處理輸入設(shè)備和輸入設(shè)備事件的能力。WindML包括兩個(gè)組件:軟件開發(fā)包(SDK)和驅(qū)動(dòng)程序開發(fā)包(DDK)。SDK組件用來開發(fā)應(yīng)用程序,它提供了一個(gè)全面的API集,包括圖形、輸入處理、多媒體、字體和內(nèi)存管理。DDK組件是用來實(shí)現(xiàn)驅(qū)動(dòng)程序的,它提供了一個(gè)完整的驅(qū)動(dòng)程序參考集,包括硬件配置和API集,以使得開發(fā)者能夠迅速的引導(dǎo)和使用自己的驅(qū)動(dòng)程序。
Zinc是一個(gè)面向?qū)ο蠛推脚_(tái)獨(dú)立的GUI(圖形化用戶界面)設(shè)計(jì)框架。Wind River提供兩個(gè)不同版本的Zinc,分別是運(yùn)行于桌面系統(tǒng)(比如windows和UNIX系統(tǒng))的版本和運(yùn)行于嵌入式系統(tǒng)(比如Vxworks和pSOS)的版本。
Tilcon是一個(gè)實(shí)時(shí)操作系統(tǒng)圖形開發(fā)工具。同步支持最新版本的Tornado/VxWorks以及WindML多媒體庫。適用與VxWorks實(shí)時(shí)環(huán)境下構(gòu)建虛擬儀表,實(shí)時(shí)控制,分布式控制等高級(jí)圖形應(yīng)用。Tilcon本身已經(jīng)集成大量成熟控件,用戶再無需調(diào)用低級(jí)的圖形函數(shù)去畫線填充,可以象Windows下VB可視化編程一樣用拖動(dòng)控件的方式構(gòu)造自己的圖形應(yīng)用。Tilcon開發(fā)的圖形界面同時(shí)支持本地和分布式顯示。圖形界面開發(fā)完成后就可以自動(dòng)的顯示在本地或通過TCP/IP網(wǎng)絡(luò)顯示到其他網(wǎng)絡(luò)平臺(tái)上。支持OPC,XML,SOAP等標(biāo)準(zhǔn)工業(yè)協(xié)議。
VxWorks支持POSIX 1003.1b的規(guī)定和1003.1中有關(guān)基本系統(tǒng)調(diào)用的規(guī)定,其中包括進(jìn)程初始化、文件和目錄、I/O初始化、語言服務(wù)、目錄管理。而且VxWorks還支持POSIX1003.1b的實(shí)時(shí)擴(kuò)展,包括異步I/O、計(jì)數(shù)型信號(hào)量、消息隊(duì)列、信號(hào)、內(nèi)存管理和調(diào)度控制等。
ONX在體系結(jié)構(gòu)上非常先進(jìn)高效,采用的是“客戶機(jī)/服務(wù)器”結(jié)構(gòu),具備微內(nèi)核和許多可選服務(wù)器進(jìn)程。微內(nèi)核只實(shí)現(xiàn)實(shí)時(shí)操作系統(tǒng)應(yīng)該具備的基本功能即:任務(wù)調(diào)度,進(jìn)程間通信,中斷處理,網(wǎng)絡(luò)接口[18,19,20,21,22,24,25,26,27,28]。
其它的功能都以協(xié)作進(jìn)程(Cooperative Processes)的方式實(shí)現(xiàn),這些協(xié)作進(jìn)程就是服務(wù)器進(jìn)程,它們向客戶進(jìn)程(如用戶應(yīng)用進(jìn)程)提供服務(wù)。在QNX中,服務(wù)器進(jìn)程的例子很多,象文件管理器,進(jìn)程管理器,網(wǎng)絡(luò)管理器,圖形界面管理器等等。微內(nèi)核運(yùn)行在優(yōu)先級(jí)0,服務(wù)器進(jìn)程和設(shè)備驅(qū)動(dòng)程序運(yùn)行在優(yōu)先級(jí)1或2。應(yīng)用進(jìn)程運(yùn)行在優(yōu)先級(jí)3。QNX的優(yōu)先級(jí)保護(hù)機(jī)制使得整個(gè)系統(tǒng)的穩(wěn)定性比VxWorks有提高。
QNX是基于消息傳遞(Message Passing)的操作系統(tǒng)。消息傳遞是QNX的基本進(jìn)程間通信機(jī)制(IPC)。其消息傳遞服務(wù)基于客戶機(jī)/服務(wù)器模型:客戶進(jìn)程向服務(wù)進(jìn)程發(fā)送消息,服務(wù)進(jìn)程也用消息響應(yīng)。許多QNX系統(tǒng)調(diào)用都是基于這樣的機(jī)制。比如,如果用戶進(jìn)程想打開某個(gè)文件,這個(gè)系統(tǒng)調(diào)用就被轉(zhuǎn)換為一條消息,發(fā)送給文件管理器。文件管理器收到消息,打開文件后,將文件句柄通過消息返回給調(diào)用者。
由于QNX的微內(nèi)核結(jié)構(gòu)中集成了消息機(jī)制和網(wǎng)絡(luò)功能,因此,QNX的分布計(jì)算能力很強(qiáng),適合于分布式應(yīng)用。QNX的網(wǎng)絡(luò)管理器對(duì)用戶進(jìn)程屏蔽了網(wǎng)絡(luò)的存在,使得不同CPU上的用戶進(jìn)程間通信時(shí)仍能采用消息機(jī)制,消息使用方式與本地用戶進(jìn)程間通信完全一致。
圖2.5 QNX微內(nèi)核結(jié)構(gòu)
圖2.6 QNX系統(tǒng)結(jié)溝
QNX使用進(jìn)程/線程模型。QNX脫胎于UNIX操作系統(tǒng),所以它具備進(jìn)程(Process)的概念。在QNX中,每個(gè)進(jìn)程都享有獨(dú)立的虛擬存儲(chǔ)空間,使系統(tǒng)更加穩(wěn)定。而在VxWorks中,需要另外的模塊才能提供類似的功能。
QNX是多進(jìn)程系統(tǒng)。其進(jìn)程可以創(chuàng)建線程(Thread)。QNX的線程與POSIX定義的線程概念還是有所區(qū)別的。在QNX中,線程與父進(jìn)程享受同樣的數(shù)據(jù)段和代碼段,但是,有些操作系統(tǒng)對(duì)象,如時(shí)鐘,文件句柄等,卻不能共享。并且,在父進(jìn)程被殺死后,派生的線程仍可以繼續(xù)運(yùn)行。
QNX提供的優(yōu)先級(jí)數(shù)目64個(gè),系統(tǒng)能夠創(chuàng)建的進(jìn)程數(shù)為4095個(gè),每個(gè)進(jìn)程能夠創(chuàng)建32767個(gè)線程。任務(wù)調(diào)度方面,提供四種調(diào)度策略:基于優(yōu)先級(jí)的FIFO調(diào)度(SCHED_FIFO),基于優(yōu)先級(jí)的Round-Robin調(diào)度(SCHED_RR),Sporadic調(diào)度(SCHED_SPORADIC)以及其他調(diào)度策略(SCHED_OTHER)。其中SCHED_OTHER的調(diào)度策略和FIFO相同,但將來會(huì)改變,所以不推薦使用。
QNX采用的也是嵌套,分優(yōu)先級(jí)的中斷方式。中斷ISR在掛接它們的進(jìn)程的上下文中執(zhí)行。每個(gè)ISR具有它自己的堆棧。
QNX中斷與進(jìn)程通信的方式有信號(hào)(Signals)和脈沖(Pulses)。
QNX的內(nèi)存保護(hù)機(jī)制相當(dāng)完善。每一個(gè)進(jìn)程都在獨(dú)立的虛擬空間運(yùn)行,具有獨(dú)立的數(shù)據(jù)段和代碼段。虛擬內(nèi)存由Intel處理器的分頁功能提供。為了避兔內(nèi)存碎片問題,QNX使用固定大小內(nèi)存分段。
QNX提供的內(nèi)存保護(hù)提高了系統(tǒng)穩(wěn)定性,對(duì)于系統(tǒng)調(diào)試階段也很有幫助。
QNX有QNX機(jī)器之間專用網(wǎng)絡(luò),QNX機(jī)器自身之間通信使用的協(xié)議,將多臺(tái)QNX物理機(jī)聯(lián)成一體,在各物理機(jī)之間共享各種資源,使各物理機(jī)聯(lián)結(jié)成為一臺(tái)邏輯機(jī)。對(duì)于需要分布式并行計(jì)算的應(yīng)用系統(tǒng)而言,QNX系統(tǒng)的這種特點(diǎn)無疑提供了極大的方便。對(duì)于處理量而分布式系統(tǒng)不能滿足需求的應(yīng)用系統(tǒng)而言,QNX更提供對(duì)稱多處理器的方式的系統(tǒng)供用戶選擇。由于QNX微核及消息傳遞結(jié)構(gòu),通過QNX處理由許多具體計(jì)算機(jī)(節(jié)點(diǎn))組成的網(wǎng)絡(luò)系統(tǒng)就像一臺(tái)單一的計(jì)算機(jī)。節(jié)點(diǎn)之間是平等的,每個(gè)節(jié)點(diǎn)都是網(wǎng)絡(luò)根目錄下的一個(gè)子目錄,每個(gè)節(jié)點(diǎn)都可以把其它節(jié)點(diǎn)當(dāng)作一個(gè)圖表來操作,不需要專門的遠(yuǎn)程操作命令。網(wǎng)絡(luò)允許任何進(jìn)程使用網(wǎng)絡(luò)中任何計(jì)算機(jī)的任何資源。無盤節(jié)點(diǎn)能由網(wǎng)絡(luò)自舉,使用網(wǎng)絡(luò)中處于任何地方的任何資源。對(duì)于一些關(guān)鍵性的應(yīng)用,QNX可以通過利用分布式網(wǎng)絡(luò)信息實(shí)現(xiàn)熱備份。QNX網(wǎng)絡(luò)具有透明的分布處理能力,容錯(cuò)網(wǎng)絡(luò)功能,均衡負(fù)荷功能,可擴(kuò)充的結(jié)構(gòu)。網(wǎng)絡(luò)節(jié)點(diǎn)之間多重冗余連結(jié)保證了某一局部網(wǎng)絡(luò)發(fā)生故障時(shí)系統(tǒng)能正常工作。
QNX節(jié)點(diǎn)也能通過約定的網(wǎng)絡(luò)協(xié)議(TCP/IP,SL/IP,RPC,NFS,F(xiàn)TP,Telnet,DOSLAN協(xié)議等)與非QNX系統(tǒng)通訊。
QNX是少數(shù)支持圖形用戶界面的實(shí)時(shí)操作系統(tǒng)之一。不同于一些實(shí)時(shí)操作系統(tǒng),QNX對(duì)圖形用戶界面的支持不是通過用戶可以使用的C/C++圖形函數(shù)庫的方式提供給用戶自己編寫圖形界面,而是“立即”提供的。圖形用戶界面以一組運(yùn)行模塊的方式,用戶只要運(yùn)行這些模塊,就“立即”獲得了圖形用戶界面,本身不需編寫一條程序。具體優(yōu)勢將會(huì)在下文討論。
QNX的Photon microGUI窗口系統(tǒng),參照在QNX微內(nèi)核體系中為實(shí)現(xiàn)嵌入式系統(tǒng)的POSIX OS環(huán)境所成功采用的方法,遵循類似的原則建立起了具有自己獨(dú)特風(fēng)格的窗口體系,即Photon微內(nèi)核機(jī)制。Photon微內(nèi)核本身是一個(gè)小進(jìn)程(有45KB代碼)。概括說來,Photon為建立GUI提供了一種新方法――使用微內(nèi)核和一組共同操作的進(jìn)程來實(shí)現(xiàn)圖形用戶界面。其特有的能力有:
l 支持低內(nèi)存要求,允許Photon為那些因內(nèi)存容量的限制只能支持一個(gè)圖形庫的環(huán)境提供高級(jí)的窗口功能。
l 提供了非常靈活的、用戶可以擴(kuò)展的體系結(jié)構(gòu),這種體系結(jié)構(gòu)允許開發(fā)者按照自己的需要擴(kuò)充GUI。
l 由于能夠?qū)崿F(xiàn)跨平臺(tái)的靈活連接,事實(shí)上人們可以從任何被連接的桌面環(huán)境中調(diào)用任何平臺(tái)中的Photon窗口應(yīng)用。
PhAB(Photon Application Builder)是QNX下的一個(gè)可視化圖形界面程序開發(fā)工具,包括豐富的易于定制的用戶控件和語言編輯器。利用PhAB開發(fā)應(yīng)用程序的一般過程如圖2.7:
圖2.7 PhAB應(yīng)用程序開發(fā)過程圖
QNX也是一個(gè)遵循POSIX 1003.1標(biāo)準(zhǔn)及POSIX實(shí)時(shí)標(biāo)準(zhǔn)的實(shí)時(shí)操作系統(tǒng)。但在系統(tǒng)實(shí)現(xiàn)上與UNIX不同,因此,QNX雖然在外觀上很像UNIX,但并不屬于類UNIX操作系統(tǒng)。
VxWorks程序可以移植到QNX,為QNX的開發(fā)帶來了很大的方便。
作為對(duì)上面的詳細(xì)分析的一個(gè)總結(jié),做了一個(gè)簡單的比較表格,見表2.1:
表2.1 四種實(shí)時(shí)操作系統(tǒng)比較表
Windows CE
RT-Linux
VxWorks
QNX
體系結(jié)構(gòu)
coredll.dll內(nèi)核
雙內(nèi)核
不嚴(yán)格的客戶機(jī)/服務(wù)器
微內(nèi)核,客戶機(jī)/服務(wù)器
可定制性
有
有
有
強(qiáng)
調(diào)度算法
搶占式、基于優(yōu)先級(jí)的線程調(diào)度
搶占式優(yōu)先級(jí)調(diào)度,最早期限優(yōu)先調(diào)度(EDF)
搶占式優(yōu)先級(jí)調(diào)度,Round-Robin
FIFO,Roud-robin,Adaptive,Sporadic
最大任務(wù)數(shù)
32個(gè)進(jìn)程每個(gè)進(jìn)程的線程數(shù)受內(nèi)存的限制
――
受內(nèi)存大小的限制
4095個(gè)進(jìn)程,每個(gè)進(jìn)程可以有32767個(gè)線程
優(yōu)先級(jí)數(shù)
64
1~RT_LOWEST_PRIORITY,可編程控制
256
64
中斷處理
基于優(yōu)先級(jí)的可嵌套中斷機(jī)制
軟中斷
可嵌套、分優(yōu)先級(jí)的中斷方式
可嵌套、分優(yōu)先級(jí)的中斷方式
內(nèi)存管理
分頁虛擬內(nèi)存管理
在同一個(gè)地址空間運(yùn)行所有的實(shí)時(shí)任務(wù),使用的是內(nèi)核地址空間。存在地址越界危險(xiǎn)。
缺少內(nèi)存保護(hù)機(jī)制
具有獨(dú)立的虛擬空間
網(wǎng)絡(luò)能力
有
有
有
有,且有自己特有的網(wǎng)絡(luò)文件系統(tǒng)
GUI開發(fā)
eVB、eVC和J2SDK、PJEE
有很多選擇,比如國內(nèi)的miniGUI
windML、ZINC和Tilcon
Photon微內(nèi)核機(jī)制,PhAB
開放性
Win32
POSIX
POSIX
POSIX
選擇QNX作為項(xiàng)目的嵌入式開發(fā)平臺(tái)主要基于以下幾條理由:
1)實(shí)時(shí)性。QNX提供用戶可控制的、優(yōu)先級(jí)驅(qū)動(dòng)、搶占式的調(diào)度方式,特殊的內(nèi)核機(jī)制保證了其實(shí)時(shí)性非常強(qiáng)。上下文切換和中斷延時(shí)是操作系統(tǒng)實(shí)時(shí)性的兩個(gè)主要指標(biāo),QNX的時(shí)間指標(biāo)都在微秒一級(jí),如表2-1和表2-2所示[29]:
表2.2 典型中斷延遲時(shí)間
表2.3 典型上下文切換時(shí)間
處 理 器
中斷延時(shí)
處 理 器
上下文切換
166MHz Pentium
3.3 us
7400G4 PowerPC 460MHz
0.6 us
100MHz Pentium
4.4 us
R527X MIPS 166MHz
2.3 us
100MHz 486DX4
5.6 us
SH-4 200MHz
1.9 us
33MHz 386EX
22.5 us
SA-1110 StrongARM 207MHz
1.8 us
2)模塊化。QNX是一個(gè)模塊化、可裁剪的實(shí)時(shí)操作系統(tǒng)。它由微內(nèi)核和一組協(xié)同工作的進(jìn)程構(gòu)成,具有高度的可伸縮性。這個(gè)靈活的結(jié)構(gòu)可以使用戶根據(jù)實(shí)際的需求,將系統(tǒng)配置成微小的(小至32K存儲(chǔ)空間)嵌入式操作系統(tǒng)或是包括幾百個(gè)處理器的超級(jí)(大至4G存儲(chǔ)空間)虛擬機(jī)操作系統(tǒng)。
3)穩(wěn)定性。QNX建立在完全地址空間保護(hù)基礎(chǔ)之上的實(shí)時(shí)操作系統(tǒng),具有很強(qiáng)的穩(wěn)定性。
4)網(wǎng)絡(luò)能力。QNX是一個(gè)分布式操作系統(tǒng)。從用戶角度來看,運(yùn)行QNX的局域網(wǎng)就像一臺(tái)集中式的多用戶計(jì)算機(jī)。除了其自身的網(wǎng)絡(luò)外,還支持與異型機(jī)器之間網(wǎng)絡(luò)通信的協(xié)議,如TCP/IP族的各種協(xié)議。
5)開放性。QNX實(shí)時(shí)操作系統(tǒng)還是一個(gè)開放的系統(tǒng),其應(yīng)用程序接口符合POSIX標(biāo)準(zhǔn)。使Linux/UNIX程序能夠方便地移植到QNX系統(tǒng)上來,極大地?cái)U(kuò)展了QNX系統(tǒng)的可用資源。而且VxWorks上的程序也可以移植到QNX。因此,對(duì)于熟悉UNIX/LINUX或者VxWorks程序設(shè)計(jì)的人,更為方便從事QNX開發(fā)。
6)功能強(qiáng)大的IDE。QNX Memontics新動(dòng)力開發(fā)系統(tǒng)集成環(huán)境提供了各種方便的工具鏈、各種板級(jí)支持包、庫函數(shù)、源代碼開發(fā)工具等。QNX還提供了多種宿主操作系統(tǒng)上Memontics集成開發(fā)環(huán)境,如MS Windows,Linux,Solaris,QNX NEUTRINO等。
7)方便的GUI開發(fā)。QNX提供了非常強(qiáng)大易用的Photon圖形用戶程序開發(fā)工PhAB,采用所見即所得的方式,非常容易就可以開發(fā)出靈活復(fù)雜優(yōu)美的用戶界面程序。對(duì)漢字編碼的支持也很完美。
8)非常廣泛的硬件支持。從PC/104到CompactPCI的最新的PC硬件,實(shí)際上QNX比其它操作系統(tǒng)支持更多的PC硬件,包括多達(dá)數(shù)百種的外圍器件。與美國AMD公司,英特爾和國家半導(dǎo)體公司的同盟關(guān)系確保芯片和參考平臺(tái)兼容性。僅CPU就支持x86、PowerPC、MIPS、ARM等。
9)豐富的網(wǎng)絡(luò)資源。目前基于QNX的開發(fā)應(yīng)用很廣泛,國內(nèi)外形成了很多比較好的技術(shù)交流網(wǎng)站,QNX公司本身的技術(shù)支持網(wǎng)站內(nèi)容也非常豐富。QNX系統(tǒng)的提供的幫助體系也很全面,搜索功能比較強(qiáng)。