王源源,賀紅衛(wèi),劉 冰,宋光照
(1.中國航天科工集團第二研究院706所,北京100854;2.中國兵器工業(yè)計算機應用技術研究所,北京100089)
大型軟件系統(tǒng)的研發(fā)是一項復雜的系統(tǒng)工程,現(xiàn)有大量大型系統(tǒng)軟件基于嵌入式實時操作系統(tǒng)開發(fā),許多工作的開展依賴于特定硬件,給開發(fā)和調試帶來諸多不便。因此在通用平臺上構建嵌入式軟件虛擬運行環(huán)境的重要性不言而喻,在通用平臺上開發(fā)調試嵌入式實裝軟件能充分地利用通用計算機的高配置、優(yōu)秀的人機界面及開發(fā)編程資源,有效的使嵌入式實裝軟件的開發(fā)和調試過程脫離特定的硬件?,F(xiàn)有的開發(fā)工具如VxSim 必須與Tornado環(huán)境配合使用且不開源,擴展性和安全性無法保障。該論文設計實現(xiàn)了一種虛擬運行環(huán)境,該環(huán)境使嵌入式實裝軟件能脫離對特定硬件的依賴運行在通用計算機上,因此開發(fā)人員可在通用計算機上開發(fā)嵌入式實裝軟件、搭建各子系統(tǒng)軟件的聯(lián)合調試環(huán)境,能夠提高開發(fā)效率,縮短裝備系統(tǒng)的軟件研發(fā)周期。另外,該虛擬運行環(huán)境支持在單臺計算機上配置運行多個實裝軟件,減少了聯(lián)合調試需要的計算機結點數。
Windows是一個通用的操作系統(tǒng)平臺,它以優(yōu)秀的體系結構,廣泛的硬件支持,豐富的應用程序接口以及人性化的圖形界面占據著通用操作系統(tǒng)的大部分市場。但是在需要硬實時特性的領域,如醫(yī)療、通信、航空航天等,Windows不能滿足要求。RTX 是美國的Ardence(已被IntervalZero收購)公司為了使Windows操作系統(tǒng)能滿足硬實時系統(tǒng)嚴格的響應時間要求而在Windows上做的擴展,其原理是在Windows平臺上提供一個實時子系統(tǒng)[1]。
通過實際的測評,Windows+RTX 能滿足硬實時性,其實時性接近于VxWorks操作系統(tǒng)。原因如下[2]:
(1)RTX 為Windows添加了一個實時子系統(tǒng)RTSS,如圖1 所示。RTSS 類似于Windows 的其它子系統(tǒng) (如Win32,DOS),RTSS有獨立的運行環(huán)境和API,有自己的線程調度器,采用搶占式調度策略。并且,當一個RTSS線程運行時,所有Windows管理的中斷會被屏蔽掉,包括延遲過程調用。
(2)RTX 含有一個定制的實時擴展硬件抽象層(HAL)。這個擴展通過控制處理器級的中斷來避免Windows屏蔽RTSS管理的中斷。該實時擴展還支持著RTSS環(huán)境的定時器以及高精度時鐘。
圖1 RTX 整體結構
根據以上分析及大量裝備系統(tǒng)嵌入式實裝軟件基于VxWorks操作系統(tǒng)研發(fā)這個事實,本文針對VxWorks 5.5嵌入式實時操作系統(tǒng),在安裝有RTX 擴展的Windows XP環(huán)境下構建嵌入式實裝軟件的虛擬運行環(huán)境。
VxWorks操作系統(tǒng)功能強大,其軟件平臺具備組件式結構[3],包括核心內核功能和依賴內核的外圍功能,這些組件的功能以各種功能庫的集合提供給應用程序,其庫由400多個相對獨立、短小的目標模塊組成[4,5],我們只關注在實裝軟件中用到的基本組件,包括內核、I/O 系統(tǒng)、文件系統(tǒng)和網絡通信。內核提供的功能按照功能庫可分為任務管理模塊、信號量模塊、消息隊列模塊、時鐘管理模塊等。虛擬運行環(huán)境的構建即實現(xiàn)上述各功能模塊的庫函數接口。虛擬運行環(huán)境的結構如圖2所示。
圖2 虛擬運行環(huán)境總體框
由前面的分析可知,在RTSS環(huán)境中RTX 提供的函數為實時函數,因此內核的虛擬我們只需關注如何利用RTX提供的實時函數設計實現(xiàn)VxWorks 5.5內核提供的庫函數接口。下面以圖2中內核組件中的任務管理、信號量好消息隊列為例分析內核的虛擬實現(xiàn)。
2.2.1 任務管理
任務的定義請參見文獻 [6]。VxWorks 5.5 內核的任務管理通過taskSpawn等函數提供了任務創(chuàng)建、刪除和控制任務等功能。
RTX 提供了大量線程管理的實時函數接口,與Vx-Works 5.5任務管理函數的部分接口對比見表1。
表1 兩平臺任務/線程接口函數對比
從表1中可以看出,RTX 提供了許多與VxWorks 5.5的任務管理函數類似的線程管理函數,但這些函數間又存在區(qū)別,下面是對這些區(qū)別及其解決方法的分析。
首先是參數的區(qū)別,包括參數的類型、個數和返回值。其次是部分RTX 線程函數接口提供的功能并不完全與Vx-Works 5.5相應的函數相同,如taskspawn函數的功能包括創(chuàng)建任務、設置任務優(yōu)先級,任務在創(chuàng)建后立即開始執(zhí)行,而RtCreateThread提供的功能是創(chuàng)建線程,沒有提供設置任務優(yōu)先級的功能。另外,兩者任務支持的優(yōu)先級數存在差異,VxWorks共256 個優(yōu)先級,編號從0 到255,數值越小優(yōu)先級越高,而RTX 支持的優(yōu)先級數值為0 到127,數值越大優(yōu)先級越高。前兩個問題可利用RTX 提供的豐富的庫函數編碼實現(xiàn),最后一個問題利用轉換算法將Vx-Works的優(yōu)先級數轉換為RTSS下的優(yōu)先級數即可。
2.2.2 信號量
VxWorks信號量用于解決任務間的互斥和同步,是一種快速的任務間通信機制。VxWorks主要提供了二進制信號量、互斥信號量以及計數信號量共3種信號量。提供的信號量管理函數請參考文獻 [7,8]。
信號量的虛擬比較簡單,使用RTX 下的RtCreateMutex模擬創(chuàng)建互斥信號量,使用RtCreateSemaphore函數模擬創(chuàng)建二值信號量和計數信號量,其中二值信號量的模擬需限定級數量最大值為1。將創(chuàng)建信號量函數返回的句柄存入哈希數組semMap數組中,semTake和semGive函數的實現(xiàn)根據其傳入參數semID,在semMap中找到相應的句柄, 調 用 RtWaitForSingleObject 和 ReleaseSemaphore函數。
2.2.3 消息隊列
Windows系統(tǒng)和RTX 提供文件映射、共享內存、管道等進程間通信方式,但不提供VxWorks的消息隊列機制進行進程間通信,因此需要建立模型設計和實現(xiàn)消息隊列功能。VxWorks消息隊列管理共提供5個函數接口:
①msgQCreate:創(chuàng)建一個消息隊列
②msgQDelete:刪除消息隊列
③msgQSend:往消息隊列中發(fā)送消息
④msgQReceive:從消息隊列中接收消息
⑤msgQNumMsgs:獲取消息隊列中的消息數
(1)消息隊列的整體結構設計
使用帶表頭節(jié)點的雙向循環(huán)鏈表來實現(xiàn)消息隊列,示意圖如圖3所示。
圖3 消息隊列結構
queue_t結構屬于每個消息隊列的公有部分,包括如下數據:
Qin:寫入位置指針,指向隊尾;Qout:讀取位置指針,指向隊列頭;length:隊列中已有的消息數;
maxMsgNum:隊列允許消息個數的最大值;msgLock:互斥鎖;ReceiveSem:接收信號量;SendSem:發(fā)送信號量。
鏈表節(jié)點數據結構如下:
(2)接口實現(xiàn)簡述
msgQCreate函數創(chuàng)建一個新的消息隊列。主要完成3個任務:為雙向循環(huán)鏈表分配空間;初始化互斥鎖;初始化發(fā)送和接收信號量。msgQSend函數發(fā)送消息到消息隊列,即往鏈表中添加消息,根據其超時參數和優(yōu)先級參數來決定添加時的超時時間和添加的位置。msgQReceive函數從消息隊列中接收消息,即從鏈表中刪除相應的節(jié)點,注意其超時參數。msgQDelete函數刪除鏈表中所有節(jié)點,刪除互斥鎖以及各信號量。
2.3.1 設計思想及所用技術
網絡通信模塊是虛擬運行環(huán)境最重要的組成部分之一。它為在一臺計算機上運行多個實裝軟件提供核心支持。該模塊實現(xiàn)了一套通信函數接口接管實裝軟件的套接字函數以控制實裝軟件的通信。將在本機運行的實裝軟件的網絡地址等信息存儲在配置文件中,實裝軟件通信時通過配置文件中的信息來判斷該數據是否需要發(fā)送給其它機器,如果僅是發(fā)送給本機器其它實裝軟件的數據,則只需簡單的將數據轉發(fā)到對應實裝軟件的接收共享內存中,否則才通過網口往外發(fā)送。
該模塊采用了配置文件驅動技術。實裝軟件的名稱、IP地址、子網掩碼、超時時間等信息均存儲在配置文件中。根據該配置文件來驅動數據的流向,將配置文件在中間件初始化時一次性讀入存入各數據結構中,提高了數據分發(fā)時的運行效率。
采用了共享內存技術,對配置表中的每個實裝軟件生成一個發(fā)送和接收共享內存、并為這兩個共享內存建立守護線程,借鑒了經典內存管理算法buddy算法[9,10]高效管理共享內存。采用消息隊列和大結構技術實現(xiàn)進程間的通信和數據共享,緩解通信壓力,提高通信可靠性。
2.3.2 網絡通信模塊結構
網絡通信模塊的數據流如圖4所示。系統(tǒng)的所有通信數據都進入網絡通信模塊。由網絡通信模塊負責分發(fā)或丟棄。
2.3.3 網絡通信模塊設計與實現(xiàn)
圖5展示了實裝軟件通信模塊的設計圖。實裝軟件的套接字函數被網絡通信模塊實現(xiàn)的通信函數接口替代。該設計定義了socket結構體及其可以動態(tài)增長的sockArray數組,socket結構體的成員包括與其綁定的IP 地址、子網、存儲隊列等。當實裝軟件調用socket函數創(chuàng)建套接字時,從sockArray數組中選擇一個socket對象并將其激活,將其地址加入到actQueHeeader鏈表中。
圖4 網絡通信模塊數據流
圖5 實裝軟件通信模塊設計
圖5中粗箭頭線表示的是數據流向。實裝軟件調用send或sendto函數將數據發(fā)送到共享內存,然后由守護線程發(fā)送到外機器或者本機器其它實裝軟件的接收共享內存。調用recv或者recvfrom 函數從套接字的subQue中讀取需要的數據。下面簡要分析下該設計中最重要的InVokeRecvMsg函數和SendThread、DisposeThread兩個守護線程。
中間件初始化時已經將所有實裝軟件的重要信息從配置文件中讀入內存,InVokeRecvMsg函數根據這些信息中的IP 地址和子網掩碼判斷應該將數據發(fā)送給哪些實裝軟件。這其中必須考慮數據的通信類型是單播、組播還是廣播。單播只需要將數據返給對應實裝軟件即可,若是組播,則需要根據組播地址將數據發(fā)給所有加入該組的實裝軟件,若是廣播,則根據子網掩碼將數據發(fā)給所有有該網段IP地址的實裝軟件。該函數設置了標志以判斷是否需要將數據發(fā)給其它機器。
發(fā)送共享內存的守護線程SendThread在共享內存中有消息時調用InVokeRecvMsg函數判斷該消息的具體流向。DisposeThread線程是接收共享內存的守護線程,該線程從共享內存中取出數據包,解析包頭找出目的地址和端口,遍歷激活的socket鏈表,找到與目的地址符合的socket,然后將該消息拷貝到符合條件的套接字的subQue中。
2.3.4 配置表說明
單臺計算機上通信相關的重要信息都存儲在配置表中,配置表如圖6 所示,該表以XML 形式組織。Mainworker為根節(jié)點,timeout屬性為共享內存讀取的超時值,machineFlag為機器編號,Mainworker節(jié)點包含一個或多個Agentworker節(jié)點。一個實裝軟件對應一個AgentWorker節(jié)點,其hostname屬性為實裝軟件的名字,timeout為消息隊列的存取超時時間,它包含一個或多個網絡地址信息。一個網絡地址對應一個HostAddress節(jié)點,其屬性address為IP地址,netmark為子網掩碼。
圖6 配置表
該虛擬運行環(huán)境已經成功地應用在系統(tǒng)軟件的開發(fā)和調試中。使用該虛擬運行環(huán)境,部門間只協(xié)調軟件,在計算機硬件條件足夠高時僅使用了少量幾臺計算機便搭建起了聯(lián)合調試環(huán)境。實際應用結果表明,實裝軟件在該虛擬運行環(huán)境上運行穩(wěn)定,且滿足實裝軟件要求的硬實時性,為該裝備系統(tǒng)軟件的開發(fā)節(jié)約了成本,提高了開發(fā)效率。
本文提出了一種構建嵌入式實裝軟件虛擬運行環(huán)境的方法,以基于VxWorks5.5實時操作系統(tǒng)為例,分析了虛擬運行環(huán)境的實現(xiàn)思想和具體實現(xiàn)。并通過實現(xiàn)網絡通信模塊接管實裝軟件通信的方式實現(xiàn)了在單臺計算機上運行多個實裝軟件。最后以該虛擬運行環(huán)境在某大型系統(tǒng)開發(fā)過程中的實際應用表明了該方法的可行性。下一步的研究工作是完善該虛擬運行環(huán)境并擴展其應用范圍。
[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ǒng)的設計方法 [J].計算機應用與軟件,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 的實時性分析與測試 [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嵌入式實時操作系統(tǒng)的原理和實現(xiàn) [J].無線電工程,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的模塊自動加載機制 [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的實時多任務軟件框架設計 [J].國外電子測量技術,2012,31 (4):80-82.]
[6]ZHANG Minyan.Research on platform based on RTOS [D].Nanjing:Nanjing University of Technology,2007 (in Chinese).[張敏燕.基于嵌入式實時操作系統(tǒng)VxWorks平臺的分析與研究 [D].南京:南京理工大學,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). [王鵬,張友根,李永剛,等.一種改進的VxWorks模塊卸載方法研究[J].裝備指揮技術學院學報,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實時系統(tǒng)的研究和開發(fā) [D].西安:西安電子科技大學,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). [國慶波,郭兵,沈艷.Buddy算法的μC/OS-Ⅱ高可靠內存管理方案 [J].單片機與嵌入式系統(tǒ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.