陳榮觀
摘要:VxWorks以其良好的可靠性和卓越的實(shí)時(shí)性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中,如衛(wèi)星通訊、軍事演習(xí)、彈道制導(dǎo)、飛機(jī)導(dǎo)航等。Linux完全開(kāi)源,全世界擁有幾十萬(wàn)的開(kāi)源項(xiàng)目,目前主流的Android及嵌入式設(shè)備都采用Linux操作系統(tǒng)。該文著重介紹將基于VxWorks開(kāi)發(fā)的應(yīng)用程序移植到Linux的技術(shù)實(shí)現(xiàn)。
關(guān)鍵詞:Linux;Vxworks;RTOS;程序遷移;嵌入式
中圖分類(lèi)號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)09-0087-03
1概述
VxWorks是美國(guó)Wind River System公司(以下簡(jiǎn)稱(chēng)風(fēng)河公司,即WRS公司)于十九世紀(jì)八十年代設(shè)計(jì)開(kāi)發(fā)的一種嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)。良好的持續(xù)發(fā)展能力、高性能的內(nèi)核以及友好的組件化用戶(hù)開(kāi)發(fā)環(huán)境,在嵌入式實(shí)時(shí)操作系統(tǒng)領(lǐng)域占據(jù)一席之地。它以其良好的可靠性和卓越的實(shí)時(shí)性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中,如衛(wèi)星通訊、軍事演習(xí)、彈道制導(dǎo)、飛機(jī)導(dǎo)航等。在美國(guó)的 F-16、FA-18戰(zhàn)斗機(jī)、B-2 隱形轟炸機(jī)和愛(ài)國(guó)者導(dǎo)彈上,甚至連1997年4月在火星表面登陸的火星探測(cè)器、2008年5月登陸的鳳凰號(hào),和2012年8月登陸的好奇號(hào)也都使用到了VxWorks。
Linux操作系統(tǒng)經(jīng)過(guò)二十幾年的發(fā)展,其擁有幾十萬(wàn)的開(kāi)發(fā)人員,成千上萬(wàn)的開(kāi)源項(xiàng)目,成為了開(kāi)發(fā)人員的首選。在移動(dòng)領(lǐng)域借助Android與IOS平分天下。在嵌入式領(lǐng)域,隨著CPU主頻的發(fā)展,克服了Linux分時(shí)操作系統(tǒng)的實(shí)時(shí)缺陷,其精度已經(jīng)完成可以滿(mǎn)足大部分實(shí)時(shí)領(lǐng)域的要求,特別在民用領(lǐng)域。目前除了在工業(yè)控制,航天,軍用領(lǐng)域保持優(yōu)勢(shì)以外,VxWorks的優(yōu)勢(shì)蕩然無(wú)存。
目前開(kāi)發(fā)人員碰到使用新的硬件方案,廠家基本上不提供VxWorks的Bsp,只支持Linux。這個(gè)給開(kāi)發(fā)人員增加了很大的開(kāi)發(fā)成本,所有的程序跟模塊都要重新設(shè)計(jì),以適應(yīng)新的系統(tǒng),增加了開(kāi)發(fā)周期。本文設(shè)計(jì)一種方案,可以很方便地將VxWorks的應(yīng)用程序搬遷到Linux上,為廠家縮短開(kāi)發(fā)周期,減少程序搬遷風(fēng)險(xiǎn),大大降低了開(kāi)發(fā)成本。本文先介紹VxWorks的技術(shù)原理,然后分析技術(shù)實(shí)現(xiàn)細(xì)節(jié),最后拿一個(gè)應(yīng)用程序作為例子。
2 VxWorks系統(tǒng)原理
VxWorks操作系統(tǒng)以實(shí)時(shí)著稱(chēng),系統(tǒng)代碼組件化比較好,系統(tǒng)精簡(jiǎn),產(chǎn)品的IMAGE可以做的非常小。VxWorks屬于共享內(nèi)存的操作系統(tǒng),沒(méi)有進(jìn)程的概念,按照任務(wù)進(jìn)行調(diào)度,每個(gè)任務(wù)是分配了堆棧,可以訪問(wèn)系統(tǒng)的所有內(nèi)存空間,比較高效,但是也比較危險(xiǎn),很容易就會(huì)發(fā)生系統(tǒng)崩潰的情況。但是也就是因?yàn)檫@個(gè)特性,因此基于VxWorks開(kāi)發(fā)的產(chǎn)品一般是單個(gè)應(yīng)用產(chǎn)品,這個(gè)打包完可以以一個(gè)進(jìn)程體現(xiàn)在Linux里面。
VxWorks系統(tǒng)主要如下幾個(gè)組件,一般的應(yīng)用程序也就用到如下幾個(gè)模塊:任務(wù)調(diào)度負(fù)責(zé)任務(wù)優(yōu)先級(jí),任務(wù)創(chuàng)建,任務(wù)刪除等功能。任務(wù)通訊主要涉及隊(duì)列管理,管道管理等。IO管理就是通用外設(shè)的輸入輸出管理。文件管理包含文件或者鏈接創(chuàng)建,修改,刪除,檢索等等。內(nèi)存管理包含內(nèi)存申請(qǐng)及內(nèi)存釋放。定時(shí)器管理就是定時(shí)器創(chuàng)建,定時(shí)器刪除。網(wǎng)絡(luò)通信包含套接字創(chuàng)建,udp/tcp通信,套接字刪除,及配置管理。同步就是任務(wù)同步?;コ饩褪侨蝿?wù)互斥,保護(hù)關(guān)鍵資源。
在VxWorks操作系統(tǒng)的代碼架構(gòu)里面,一般寫(xiě)一個(gè)應(yīng)用程序只需要涉及上面幾個(gè)系統(tǒng)組件,由于VxWorks操作系統(tǒng)組件化非常好,這幾個(gè)組件的耦合度非常低,每個(gè)組件對(duì)外提供都是單獨(dú)的頭文件,比如任務(wù)調(diào)度,其頭文件為taskLib.h,任務(wù)通訊如果用的隊(duì)列,那其頭文件就是msgQLib.h,如果是定時(shí)器管理,那其頭文件就是timerLib.h,因此也讓程序移植提供了很大的便利性。有很多人認(rèn)為,VxWorks跟Linux操作性的系統(tǒng)頭文件差異化太大,因此移植難度成倍速增加,其實(shí)不然,就是由于VxWorks的高度組件化,讓程序移植提供了很大的便利性。
3 技術(shù)實(shí)現(xiàn)
我們假設(shè)現(xiàn)在要移植一個(gè)簡(jiǎn)單的聊天程序到Linux,那么其應(yīng)該包含網(wǎng)絡(luò)通訊組件(udp通訊),任務(wù)調(diào)度組件(任務(wù)創(chuàng)建),任務(wù)通訊(隊(duì)列報(bào)文排序管理),內(nèi)存管理(內(nèi)存申請(qǐng)),定時(shí)器模塊(報(bào)文超時(shí)重發(fā)),任務(wù)互斥/同步(并發(fā)多人聊天)等基礎(chǔ)組件,雖然功能簡(jiǎn)單,但是基本上也包含了常用的功能,我們就以這個(gè)為例來(lái)談?wù)劶夹g(shù)實(shí)現(xiàn)。正常這個(gè)程序在Linux上是無(wú)法編譯的,因?yàn)槔锩嬉昧舜罅康腣xWorks的頭文件,而這些在Linux上是沒(méi)有的。
正常這個(gè)應(yīng)用程序要包含的系統(tǒng)頭文件如下:
VxWorks.h作為VxWorks的系統(tǒng)頭文件,里面主要定義了一些常量,比如#define OK 0等,因此我們只要將VxWorks.h隨程序發(fā)布到Linux系統(tǒng),做一下稍微修改即可,不用特意修改,甚至可以刪除的只剩下我們程序有用到的常量,如果沒(méi)有用,完全沒(méi)有必要假如,避免編譯出錯(cuò)。
我們著重講解,幾個(gè)重要模塊如何在Linux系統(tǒng)上實(shí)現(xiàn),以保證基于VxWorks系統(tǒng)原型寫(xiě)的程序能夠無(wú)縫的移植到Linux上。其實(shí)我們只要把上述的幾個(gè)頭文件在Linux上實(shí)現(xiàn)一遍即可。
3.1 任務(wù)與進(jìn)程、線程對(duì)比
VxWorks的任務(wù)是VxWorks的最小運(yùn)行單元,每個(gè)任務(wù)之間是共享內(nèi)存,可以互相訪問(wèn),這個(gè)有點(diǎn)類(lèi)似Linux的線程的概念,而幾個(gè)任務(wù)合起來(lái)的嵌入式產(chǎn)品就等同于一個(gè)進(jìn)程。
因此在具體實(shí)現(xiàn)上,我們只要針對(duì)taskLib中的關(guān)鍵函數(shù)進(jìn)行Linux實(shí)現(xiàn)即可實(shí)現(xiàn)正常的任務(wù)調(diào)度。具體的函數(shù)對(duì)應(yīng)關(guān)系如下表格。
3.2 消息隊(duì)列實(shí)現(xiàn)
VxWorks的常用消息隊(duì)列進(jìn)行任務(wù)間通訊,在傳輸較小的數(shù)據(jù)塊時(shí),效率較高,并且允許消息進(jìn)行排隊(duì),Linux沒(méi)有很好的消息隊(duì)列實(shí)現(xiàn)方式,對(duì)于線程間的異步通訊一般都是開(kāi)發(fā)者自己實(shí)現(xiàn)。對(duì)于Linux的線程間通訊,我們采用管道來(lái)實(shí)現(xiàn),管道既可以用用于進(jìn)程間通訊,也可以用于線程間通訊。管道是一種半雙工的通信機(jī)制,也就是說(shuō),它只能一端用來(lái)讀,另外一端用來(lái)寫(xiě)。管道通信遵循先進(jìn)先出的原理,并且數(shù)據(jù)只能被讀取一次,當(dāng)此段數(shù)據(jù)被讀取后,馬上會(huì)從數(shù)據(jù)中消失,這一點(diǎn)很重要。Linux上,創(chuàng)建管道使用pipe函數(shù),當(dāng)它執(zhí)行后,會(huì)產(chǎn)生兩個(gè)文件描述符,分別為讀端和寫(xiě)端,因此可以采用標(biāo)準(zhǔn)的IO進(jìn)行操作。
3.3 定時(shí)器實(shí)現(xiàn)
VxWorks操作系統(tǒng)的優(yōu)勢(shì)就是在定時(shí)器上,VxWorks定時(shí)器具有完美的實(shí)時(shí)特性,定時(shí)器的優(yōu)先級(jí)低于硬件驅(qū)動(dòng),但是高于任何的應(yīng)用優(yōu)先級(jí)。Linux由于是先天的分片操作系統(tǒng),并且內(nèi)核跟應(yīng)用有隔離,應(yīng)用態(tài)的定時(shí)器其實(shí)是不準(zhǔn)的,但是就如開(kāi)題說(shuō)的,目前的CPU由于主頻很高,完全實(shí)時(shí)已經(jīng)沒(méi)有太大必要,基本上目前Linux的分時(shí)特性可以滿(mǎn)足大部分的應(yīng)用領(lǐng)域,為了實(shí)現(xiàn)定時(shí)器的準(zhǔn)度,我們?cè)贚inux系統(tǒng)上采用采用select進(jìn)行時(shí)間定時(shí),如果有時(shí)間產(chǎn)生,則進(jìn)行糾正。詳細(xì)邏輯參加圖4,定時(shí)精度可以通過(guò)參數(shù)傳入。
3.4 任務(wù)間同步,互斥實(shí)現(xiàn)
VxWorks提供的信號(hào)量經(jīng)過(guò)了高度優(yōu)化,在所有任務(wù)間通信機(jī)制中,速度最快。二進(jìn)制信號(hào)量(semLib)可以實(shí)現(xiàn)任務(wù)同步,互斥信號(hào)量(semLib)可以實(shí)現(xiàn)任務(wù)互斥。在Linux底下,能夠?qū)崿F(xiàn)同步跟互斥的方法非常多,我們選擇sem_t來(lái)實(shí)現(xiàn)二進(jìn)制信號(hào)量,選擇pthread_mutex_t來(lái)實(shí)現(xiàn)互斥信號(hào)量。對(duì)應(yīng)關(guān)系如表4。
3.5 其他實(shí)現(xiàn)
VxWorks在socket方面的管理與Linux基本上一模一樣,指示引用的頭文件不一樣,只要協(xié)議sockLib.c引用linux的頭文件即可。在內(nèi)存管理方面完全一樣,不用特殊處理。
4 結(jié)束語(yǔ)
通過(guò)上述的關(guān)鍵模塊替換方式,基本上可以滿(mǎn)足VxWorks的應(yīng)用程序到Linux的搬遷,程序主體不用做任何改動(dòng)。VxWorks操作系統(tǒng)雖然應(yīng)用領(lǐng)域越來(lái)越少,但是其組件化的設(shè)計(jì)理念,使得在其上面設(shè)計(jì)的應(yīng)用程序調(diào)理清晰,結(jié)構(gòu)簡(jiǎn)單。筆者已經(jīng)嘗試了將融合通信領(lǐng)域的嵌入式軟件完成的搬遷到Linux,Window,Android等主流應(yīng)用程序上,所要做的就是針對(duì)不同的應(yīng)用平臺(tái)寫(xiě)幾個(gè)關(guān)鍵模塊的操作系統(tǒng)適配層即可。
參考文獻(xiàn):
[1] Comer D E, Stevens D L. Internetworking with TCP/IP, Vol. III: Client-Server Programming and Applications, Linux/Posix Sockets Version[M]. Pearson, 2000.
[2] 宋敬彬.Linux網(wǎng)絡(luò)編程[M].2版.北京:清華大學(xué)出版社,2014.
[3] 張保山,俞烈彬.VxWorks驅(qū)動(dòng)及分布式編程[M].北京:中國(guó)電力出版社,2007.
[4] 曹桂平.VxWorks設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解[M].北京:電子工業(yè)出版社,2011.