王源源,賀紅衛(wèi),劉 冰,宋光照
(1.中國(guó)航天科工集團(tuán)第二研究院706所,北京100854;2.中國(guó)兵器工業(yè)計(jì)算機(jī)應(yīng)用技術(shù)研究所,北京100089)
大型軟件系統(tǒng)的研發(fā)是一項(xiàng)復(fù)雜的系統(tǒng)工程,現(xiàn)有大量大型系統(tǒng)軟件基于嵌入式實(shí)時(shí)操作系統(tǒng)開(kāi)發(fā),許多工作的開(kāi)展依賴于特定硬件,給開(kāi)發(fā)和調(diào)試帶來(lái)諸多不便。因此在通用平臺(tái)上構(gòu)建嵌入式軟件虛擬運(yùn)行環(huán)境的重要性不言而喻,在通用平臺(tái)上開(kāi)發(fā)調(diào)試嵌入式實(shí)裝軟件能充分地利用通用計(jì)算機(jī)的高配置、優(yōu)秀的人機(jī)界面及開(kāi)發(fā)編程資源,有效的使嵌入式實(shí)裝軟件的開(kāi)發(fā)和調(diào)試過(guò)程脫離特定的硬件。現(xiàn)有的開(kāi)發(fā)工具如VxSim 必須與Tornado環(huán)境配合使用且不開(kāi)源,擴(kuò)展性和安全性無(wú)法保障。該論文設(shè)計(jì)實(shí)現(xiàn)了一種虛擬運(yùn)行環(huán)境,該環(huán)境使嵌入式實(shí)裝軟件能脫離對(duì)特定硬件的依賴運(yùn)行在通用計(jì)算機(jī)上,因此開(kāi)發(fā)人員可在通用計(jì)算機(jī)上開(kāi)發(fā)嵌入式實(shí)裝軟件、搭建各子系統(tǒng)軟件的聯(lián)合調(diào)試環(huán)境,能夠提高開(kāi)發(fā)效率,縮短裝備系統(tǒng)的軟件研發(fā)周期。另外,該虛擬運(yùn)行環(huán)境支持在單臺(tái)計(jì)算機(jī)上配置運(yùn)行多個(gè)實(shí)裝軟件,減少了聯(lián)合調(diào)試需要的計(jì)算機(jī)結(jié)點(diǎn)數(shù)。
Windows是一個(gè)通用的操作系統(tǒng)平臺(tái),它以優(yōu)秀的體系結(jié)構(gòu),廣泛的硬件支持,豐富的應(yīng)用程序接口以及人性化的圖形界面占據(jù)著通用操作系統(tǒng)的大部分市場(chǎng)。但是在需要硬實(shí)時(shí)特性的領(lǐng)域,如醫(yī)療、通信、航空航天等,Windows不能滿足要求。RTX 是美國(guó)的Ardence(已被IntervalZero收購(gòu))公司為了使Windows操作系統(tǒng)能滿足硬實(shí)時(shí)系統(tǒng)嚴(yán)格的響應(yīng)時(shí)間要求而在Windows上做的擴(kuò)展,其原理是在Windows平臺(tái)上提供一個(gè)實(shí)時(shí)子系統(tǒng)[1]。
通過(guò)實(shí)際的測(cè)評(píng),Windows+RTX 能滿足硬實(shí)時(shí)性,其實(shí)時(shí)性接近于VxWorks操作系統(tǒng)。原因如下[2]:
(1)RTX 為Windows添加了一個(gè)實(shí)時(shí)子系統(tǒng)RTSS,如圖1 所示。RTSS 類似于Windows 的其它子系統(tǒng) (如Win32,DOS),RTSS有獨(dú)立的運(yùn)行環(huán)境和API,有自己的線程調(diào)度器,采用搶占式調(diào)度策略。并且,當(dāng)一個(gè)RTSS線程運(yùn)行時(shí),所有Windows管理的中斷會(huì)被屏蔽掉,包括延遲過(guò)程調(diào)用。
(2)RTX 含有一個(gè)定制的實(shí)時(shí)擴(kuò)展硬件抽象層(HAL)。這個(gè)擴(kuò)展通過(guò)控制處理器級(jí)的中斷來(lái)避免Windows屏蔽RTSS管理的中斷。該實(shí)時(shí)擴(kuò)展還支持著RTSS環(huán)境的定時(shí)器以及高精度時(shí)鐘。
圖1 RTX 整體結(jié)構(gòu)
根據(jù)以上分析及大量裝備系統(tǒng)嵌入式實(shí)裝軟件基于VxWorks操作系統(tǒng)研發(fā)這個(gè)事實(shí),本文針對(duì)VxWorks 5.5嵌入式實(shí)時(shí)操作系統(tǒng),在安裝有RTX 擴(kuò)展的Windows XP環(huán)境下構(gòu)建嵌入式實(shí)裝軟件的虛擬運(yùn)行環(huán)境。
VxWorks操作系統(tǒng)功能強(qiáng)大,其軟件平臺(tái)具備組件式結(jié)構(gòu)[3],包括核心內(nèi)核功能和依賴內(nèi)核的外圍功能,這些組件的功能以各種功能庫(kù)的集合提供給應(yīng)用程序,其庫(kù)由400多個(gè)相對(duì)獨(dú)立、短小的目標(biāo)模塊組成[4,5],我們只關(guān)注在實(shí)裝軟件中用到的基本組件,包括內(nèi)核、I/O 系統(tǒng)、文件系統(tǒng)和網(wǎng)絡(luò)通信。內(nèi)核提供的功能按照功能庫(kù)可分為任務(wù)管理模塊、信號(hào)量模塊、消息隊(duì)列模塊、時(shí)鐘管理模塊等。虛擬運(yùn)行環(huán)境的構(gòu)建即實(shí)現(xiàn)上述各功能模塊的庫(kù)函數(shù)接口。虛擬運(yùn)行環(huán)境的結(jié)構(gòu)如圖2所示。
圖2 虛擬運(yùn)行環(huán)境總體框
由前面的分析可知,在RTSS環(huán)境中RTX 提供的函數(shù)為實(shí)時(shí)函數(shù),因此內(nèi)核的虛擬我們只需關(guān)注如何利用RTX提供的實(shí)時(shí)函數(shù)設(shè)計(jì)實(shí)現(xiàn)VxWorks 5.5內(nèi)核提供的庫(kù)函數(shù)接口。下面以圖2中內(nèi)核組件中的任務(wù)管理、信號(hào)量好消息隊(duì)列為例分析內(nèi)核的虛擬實(shí)現(xiàn)。
2.2.1 任務(wù)管理
任務(wù)的定義請(qǐng)參見(jiàn)文獻(xiàn) [6]。VxWorks 5.5 內(nèi)核的任務(wù)管理通過(guò)taskSpawn等函數(shù)提供了任務(wù)創(chuàng)建、刪除和控制任務(wù)等功能。
RTX 提供了大量線程管理的實(shí)時(shí)函數(shù)接口,與Vx-Works 5.5任務(wù)管理函數(shù)的部分接口對(duì)比見(jiàn)表1。
表1 兩平臺(tái)任務(wù)/線程接口函數(shù)對(duì)比
從表1中可以看出,RTX 提供了許多與VxWorks 5.5的任務(wù)管理函數(shù)類似的線程管理函數(shù),但這些函數(shù)間又存在區(qū)別,下面是對(duì)這些區(qū)別及其解決方法的分析。
首先是參數(shù)的區(qū)別,包括參數(shù)的類型、個(gè)數(shù)和返回值。其次是部分RTX 線程函數(shù)接口提供的功能并不完全與Vx-Works 5.5相應(yīng)的函數(shù)相同,如taskspawn函數(shù)的功能包括創(chuàng)建任務(wù)、設(shè)置任務(wù)優(yōu)先級(jí),任務(wù)在創(chuàng)建后立即開(kāi)始執(zhí)行,而RtCreateThread提供的功能是創(chuàng)建線程,沒(méi)有提供設(shè)置任務(wù)優(yōu)先級(jí)的功能。另外,兩者任務(wù)支持的優(yōu)先級(jí)數(shù)存在差異,VxWorks共256 個(gè)優(yōu)先級(jí),編號(hào)從0 到255,數(shù)值越小優(yōu)先級(jí)越高,而RTX 支持的優(yōu)先級(jí)數(shù)值為0 到127,數(shù)值越大優(yōu)先級(jí)越高。前兩個(gè)問(wèn)題可利用RTX 提供的豐富的庫(kù)函數(shù)編碼實(shí)現(xiàn),最后一個(gè)問(wèn)題利用轉(zhuǎn)換算法將Vx-Works的優(yōu)先級(jí)數(shù)轉(zhuǎn)換為RTSS下的優(yōu)先級(jí)數(shù)即可。
2.2.2 信號(hào)量
VxWorks信號(hào)量用于解決任務(wù)間的互斥和同步,是一種快速的任務(wù)間通信機(jī)制。VxWorks主要提供了二進(jìn)制信號(hào)量、互斥信號(hào)量以及計(jì)數(shù)信號(hào)量共3種信號(hào)量。提供的信號(hào)量管理函數(shù)請(qǐng)參考文獻(xiàn) [7,8]。
信號(hào)量的虛擬比較簡(jiǎn)單,使用RTX 下的RtCreateMutex模擬創(chuàng)建互斥信號(hào)量,使用RtCreateSemaphore函數(shù)模擬創(chuàng)建二值信號(hào)量和計(jì)數(shù)信號(hào)量,其中二值信號(hào)量的模擬需限定級(jí)數(shù)量最大值為1。將創(chuàng)建信號(hào)量函數(shù)返回的句柄存入哈希數(shù)組semMap數(shù)組中,semTake和semGive函數(shù)的實(shí)現(xiàn)根據(jù)其傳入?yún)?shù)semID,在semMap中找到相應(yīng)的句柄, 調(diào) 用 RtWaitForSingleObject 和 ReleaseSemaphore函數(shù)。
2.2.3 消息隊(duì)列
Windows系統(tǒng)和RTX 提供文件映射、共享內(nèi)存、管道等進(jìn)程間通信方式,但不提供VxWorks的消息隊(duì)列機(jī)制進(jìn)行進(jìn)程間通信,因此需要建立模型設(shè)計(jì)和實(shí)現(xiàn)消息隊(duì)列功能。VxWorks消息隊(duì)列管理共提供5個(gè)函數(shù)接口:
①msgQCreate:創(chuàng)建一個(gè)消息隊(duì)列
②msgQDelete:刪除消息隊(duì)列
③msgQSend:往消息隊(duì)列中發(fā)送消息
④msgQReceive:從消息隊(duì)列中接收消息
⑤msgQNumMsgs:獲取消息隊(duì)列中的消息數(shù)
(1)消息隊(duì)列的整體結(jié)構(gòu)設(shè)計(jì)
使用帶表頭節(jié)點(diǎn)的雙向循環(huán)鏈表來(lái)實(shí)現(xiàn)消息隊(duì)列,示意圖如圖3所示。
圖3 消息隊(duì)列結(jié)構(gòu)
queue_t結(jié)構(gòu)屬于每個(gè)消息隊(duì)列的公有部分,包括如下數(shù)據(jù):
Qin:寫(xiě)入位置指針,指向隊(duì)尾;Qout:讀取位置指針,指向隊(duì)列頭;length:隊(duì)列中已有的消息數(shù);
maxMsgNum:隊(duì)列允許消息個(gè)數(shù)的最大值;msgLock:互斥鎖;ReceiveSem:接收信號(hào)量;SendSem:發(fā)送信號(hào)量。
鏈表節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)如下:
(2)接口實(shí)現(xiàn)簡(jiǎn)述
msgQCreate函數(shù)創(chuàng)建一個(gè)新的消息隊(duì)列。主要完成3個(gè)任務(wù):為雙向循環(huán)鏈表分配空間;初始化互斥鎖;初始化發(fā)送和接收信號(hào)量。msgQSend函數(shù)發(fā)送消息到消息隊(duì)列,即往鏈表中添加消息,根據(jù)其超時(shí)參數(shù)和優(yōu)先級(jí)參數(shù)來(lái)決定添加時(shí)的超時(shí)時(shí)間和添加的位置。msgQReceive函數(shù)從消息隊(duì)列中接收消息,即從鏈表中刪除相應(yīng)的節(jié)點(diǎn),注意其超時(shí)參數(shù)。msgQDelete函數(shù)刪除鏈表中所有節(jié)點(diǎn),刪除互斥鎖以及各信號(hào)量。
2.3.1 設(shè)計(jì)思想及所用技術(shù)
網(wǎng)絡(luò)通信模塊是虛擬運(yùn)行環(huán)境最重要的組成部分之一。它為在一臺(tái)計(jì)算機(jī)上運(yùn)行多個(gè)實(shí)裝軟件提供核心支持。該模塊實(shí)現(xiàn)了一套通信函數(shù)接口接管實(shí)裝軟件的套接字函數(shù)以控制實(shí)裝軟件的通信。將在本機(jī)運(yùn)行的實(shí)裝軟件的網(wǎng)絡(luò)地址等信息存儲(chǔ)在配置文件中,實(shí)裝軟件通信時(shí)通過(guò)配置文件中的信息來(lái)判斷該數(shù)據(jù)是否需要發(fā)送給其它機(jī)器,如果僅是發(fā)送給本機(jī)器其它實(shí)裝軟件的數(shù)據(jù),則只需簡(jiǎn)單的將數(shù)據(jù)轉(zhuǎn)發(fā)到對(duì)應(yīng)實(shí)裝軟件的接收共享內(nèi)存中,否則才通過(guò)網(wǎng)口往外發(fā)送。
該模塊采用了配置文件驅(qū)動(dòng)技術(shù)。實(shí)裝軟件的名稱、IP地址、子網(wǎng)掩碼、超時(shí)時(shí)間等信息均存儲(chǔ)在配置文件中。根據(jù)該配置文件來(lái)驅(qū)動(dòng)數(shù)據(jù)的流向,將配置文件在中間件初始化時(shí)一次性讀入存入各數(shù)據(jù)結(jié)構(gòu)中,提高了數(shù)據(jù)分發(fā)時(shí)的運(yùn)行效率。
采用了共享內(nèi)存技術(shù),對(duì)配置表中的每個(gè)實(shí)裝軟件生成一個(gè)發(fā)送和接收共享內(nèi)存、并為這兩個(gè)共享內(nèi)存建立守護(hù)線程,借鑒了經(jīng)典內(nèi)存管理算法buddy算法[9,10]高效管理共享內(nèi)存。采用消息隊(duì)列和大結(jié)構(gòu)技術(shù)實(shí)現(xiàn)進(jìn)程間的通信和數(shù)據(jù)共享,緩解通信壓力,提高通信可靠性。
2.3.2 網(wǎng)絡(luò)通信模塊結(jié)構(gòu)
網(wǎng)絡(luò)通信模塊的數(shù)據(jù)流如圖4所示。系統(tǒng)的所有通信數(shù)據(jù)都進(jìn)入網(wǎng)絡(luò)通信模塊。由網(wǎng)絡(luò)通信模塊負(fù)責(zé)分發(fā)或丟棄。
2.3.3 網(wǎng)絡(luò)通信模塊設(shè)計(jì)與實(shí)現(xiàn)
圖5展示了實(shí)裝軟件通信模塊的設(shè)計(jì)圖。實(shí)裝軟件的套接字函數(shù)被網(wǎng)絡(luò)通信模塊實(shí)現(xiàn)的通信函數(shù)接口替代。該設(shè)計(jì)定義了socket結(jié)構(gòu)體及其可以動(dòng)態(tài)增長(zhǎng)的sockArray數(shù)組,socket結(jié)構(gòu)體的成員包括與其綁定的IP 地址、子網(wǎng)、存儲(chǔ)隊(duì)列等。當(dāng)實(shí)裝軟件調(diào)用socket函數(shù)創(chuàng)建套接字時(shí),從sockArray數(shù)組中選擇一個(gè)socket對(duì)象并將其激活,將其地址加入到actQueHeeader鏈表中。
圖4 網(wǎng)絡(luò)通信模塊數(shù)據(jù)流
圖5 實(shí)裝軟件通信模塊設(shè)計(jì)
圖5中粗箭頭線表示的是數(shù)據(jù)流向。實(shí)裝軟件調(diào)用send或sendto函數(shù)將數(shù)據(jù)發(fā)送到共享內(nèi)存,然后由守護(hù)線程發(fā)送到外機(jī)器或者本機(jī)器其它實(shí)裝軟件的接收共享內(nèi)存。調(diào)用recv或者recvfrom 函數(shù)從套接字的subQue中讀取需要的數(shù)據(jù)。下面簡(jiǎn)要分析下該設(shè)計(jì)中最重要的InVokeRecvMsg函數(shù)和SendThread、DisposeThread兩個(gè)守護(hù)線程。
中間件初始化時(shí)已經(jīng)將所有實(shí)裝軟件的重要信息從配置文件中讀入內(nèi)存,InVokeRecvMsg函數(shù)根據(jù)這些信息中的IP 地址和子網(wǎng)掩碼判斷應(yīng)該將數(shù)據(jù)發(fā)送給哪些實(shí)裝軟件。這其中必須考慮數(shù)據(jù)的通信類型是單播、組播還是廣播。單播只需要將數(shù)據(jù)返給對(duì)應(yīng)實(shí)裝軟件即可,若是組播,則需要根據(jù)組播地址將數(shù)據(jù)發(fā)給所有加入該組的實(shí)裝軟件,若是廣播,則根據(jù)子網(wǎng)掩碼將數(shù)據(jù)發(fā)給所有有該網(wǎng)段IP地址的實(shí)裝軟件。該函數(shù)設(shè)置了標(biāo)志以判斷是否需要將數(shù)據(jù)發(fā)給其它機(jī)器。
發(fā)送共享內(nèi)存的守護(hù)線程SendThread在共享內(nèi)存中有消息時(shí)調(diào)用InVokeRecvMsg函數(shù)判斷該消息的具體流向。DisposeThread線程是接收共享內(nèi)存的守護(hù)線程,該線程從共享內(nèi)存中取出數(shù)據(jù)包,解析包頭找出目的地址和端口,遍歷激活的socket鏈表,找到與目的地址符合的socket,然后將該消息拷貝到符合條件的套接字的subQue中。
2.3.4 配置表說(shuō)明
單臺(tái)計(jì)算機(jī)上通信相關(guān)的重要信息都存儲(chǔ)在配置表中,配置表如圖6 所示,該表以XML 形式組織。Mainworker為根節(jié)點(diǎn),timeout屬性為共享內(nèi)存讀取的超時(shí)值,machineFlag為機(jī)器編號(hào),Mainworker節(jié)點(diǎn)包含一個(gè)或多個(gè)Agentworker節(jié)點(diǎn)。一個(gè)實(shí)裝軟件對(duì)應(yīng)一個(gè)AgentWorker節(jié)點(diǎn),其hostname屬性為實(shí)裝軟件的名字,timeout為消息隊(duì)列的存取超時(shí)時(shí)間,它包含一個(gè)或多個(gè)網(wǎng)絡(luò)地址信息。一個(gè)網(wǎng)絡(luò)地址對(duì)應(yīng)一個(gè)HostAddress節(jié)點(diǎn),其屬性address為IP地址,netmark為子網(wǎng)掩碼。
圖6 配置表
該虛擬運(yùn)行環(huán)境已經(jīng)成功地應(yīng)用在系統(tǒng)軟件的開(kāi)發(fā)和調(diào)試中。使用該虛擬運(yùn)行環(huán)境,部門間只協(xié)調(diào)軟件,在計(jì)算機(jī)硬件條件足夠高時(shí)僅使用了少量幾臺(tái)計(jì)算機(jī)便搭建起了聯(lián)合調(diào)試環(huán)境。實(shí)際應(yīng)用結(jié)果表明,實(shí)裝軟件在該虛擬運(yùn)行環(huán)境上運(yùn)行穩(wěn)定,且滿足實(shí)裝軟件要求的硬實(shí)時(shí)性,為該裝備系統(tǒng)軟件的開(kāi)發(fā)節(jié)約了成本,提高了開(kāi)發(fā)效率。
本文提出了一種構(gòu)建嵌入式實(shí)裝軟件虛擬運(yùn)行環(huán)境的方法,以基于VxWorks5.5實(shí)時(shí)操作系統(tǒng)為例,分析了虛擬運(yùn)行環(huán)境的實(shí)現(xiàn)思想和具體實(shí)現(xiàn)。并通過(guò)實(shí)現(xiàn)網(wǎng)絡(luò)通信模塊接管實(shí)裝軟件通信的方式實(shí)現(xiàn)了在單臺(tái)計(jì)算機(jī)上運(yùn)行多個(gè)實(shí)裝軟件。最后以該虛擬運(yùn)行環(huán)境在某大型系統(tǒng)開(kāi)發(fā)過(guò)程中的實(shí)際應(yīng)用表明了該方法的可行性。下一步的研究工作是完善該虛擬運(yùn)行環(huán)境并擴(kuò)展其應(yīng)用范圍。
[1]HUANG Jian,SONG Xiao,XUE Shunhu,et al.Design method of real-time simulation system based on RTX platform[J].Computer Applications and Software,2009,26 (4):167-169 (in Chinese). [黃 鍵,宋 曉,薛 順 虎,等.RTX 平臺(tái)下實(shí)時(shí)仿真系統(tǒng)的設(shè)計(jì)方法 [J].計(jì)算機(jī)應(yīng)用與軟件,2009,26 (4):167-169.]
[2]LIU Xiaochuan,F(xiàn)AN Ziming.Real-time analysis and tests for Windows 2000 (XP)+RTX [J].Ship Electronic Engineering,2007,27 (6):135-138 (in Chinese). [劉曉川,樊子明.Windows 2000 (XP)+RTX 的實(shí)時(shí)性分析與測(cè)試 [J].艦船電子工程,2007,27 (6):135-138.]
[3]WANG Jinhui.Theory and realization of VxWorks OS [J].Radio Engineering of China,2007,37 (1):62-64. (in Chinese).[王金輝.VxWorks嵌入式實(shí)時(shí)操作系統(tǒng)的原理和實(shí)現(xiàn) [J].無(wú)線電工程,2007,37 (1):62-64.]
[4]YU Kang,NING Hong,DENG Shenglan,et al.Module automatically loading mechanism based on VxWorks [J].Computer Engineering,2010,36 (18):264-266 (in Chinese).
[于康,寧洪,鄧勝蘭,等.基于VxWorks的模塊自動(dòng)加載機(jī)制 [J].計(jì)算機(jī)工程,2010,36 (18):264-266.]
[5]ZHOU Junjie,HE Panfeng.Design of VxWorks real-time muti-task software frame [J].Foreign Electronic Measurement Technology,2012,31 (4):80-82 (in Chinese). [周俊杰,何攀峰.基于VxWorks的實(shí)時(shí)多任務(wù)軟件框架設(shè)計(jì) [J].國(guó)外電子測(cè)量技術(shù),2012,31 (4):80-82.]
[6]ZHANG Minyan.Research on platform based on RTOS [D].Nanjing:Nanjing University of Technology,2007 (in Chinese).[張敏燕.基于嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks平臺(tái)的分析與研究 [D].南京:南京理工大學(xué),2007.]
[7]WANG Peng,ZHANG Yougen,LI Yonggang,et al.Research on the improved modules unloading method of VxWorks[J].Journal of the Academy of Equipment Command &Technology,2010,21 (5):83-87 (in Chinese). [王鵬,張友根,李永剛,等.一種改進(jìn)的VxWorks模塊卸載方法研究[J].裝備指揮技術(shù)學(xué)院學(xué)報(bào),2010,21 (5):83-87.]
[8]HAO Xiaohui.Research and development of VxWorks based AT91RM200 [D].Xi'an:Xidian University,2007 (in Chinese).[郝曉輝.基于AT91RM9200的VxWorks實(shí)時(shí)系統(tǒng)的研究和開(kāi)發(fā) [D].西安:西安電子科技大學(xué),2007.]
[9]GUO Qingbo,GUO Bing,SHEN Yan.Strategy of higher reliability memory management in μC/OS-Ⅱwith buddy algorithm [J].Microcontrollers &Embedded Systems,2011,11(7):30-33 (in Chinese). [國(guó)慶波,郭兵,沈艷.Buddy算法的μC/OS-Ⅱ高可靠?jī)?nèi)存管理方案 [J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2011,11 (7):30-33.]
[10]Masmano M,Ripoll I,Real J,et al.Implementation of a constant time dynamic storage allocator[J].Software:Practice and Experience,2008,38 (10):1000-1025.