閆洋銘,蔡建平
(北京工業大學,北京 100124)
RTEMS[1]是80年代美國研制的軍用實時操作系統且被運用于導彈控制系統。1994年源碼開放后,多被應用于衛星探測系統、武器控制系統和工業中控系統。因此一般運用RTEMS系統的領域都對系統可靠性和實時性有很嚴格的要求,然而RTEMS在真實環境下測試難度和風險都很大。由Fabrice Bellard主要編寫的一套二進制指令動態翻譯器QEMU[2],是一款跨平臺、仿真速度快、開源并且支持多種CPU架構的虛擬軟件。
RTEMS多應用于一些要求質量和可靠性很高的領域,并且其使用的硬件和儀器都十分精密和昂貴,有的甚至需要保密,所以直接在目標環境下運行和測試RTEMS不是特別合適的選擇。嵌入式仿真測試可以構建一個不需要真實目標機參與的測試環境,利用QEMU模擬真實的嵌入式系統、CPU架構和外圍設備等,從而建立RTEMS仿真測試環境。
與其他嵌入式測試不同,基于RTEMS仿真測試是在同一宿主機下搭建測試環境,可以是Windows平臺或者Linux平臺。本文研究的是Windows平臺下,通過全數字仿真測試策略完成對RTEMS嵌入式軟件的黑盒測試。如圖1所示,QEMU模擬出指定的CPU架構和I/O,并且不需要修改和特殊編譯的RTEMS應用程序就直接能運行在虛擬目標機上。測試代理上解析擴展的Python實時測試腳本,通過外圍激勵相關技術和重定向讀寫技術[3],完成開環測試、閉環測試、混合測試以及多路并發測試4種外圍激勵模式,從而達到對RTEMS嵌入式軟件自動、實時、非侵入性的黑盒測試。

圖1 基于RTEMS仿真測試環境
面對復雜而繁多的嵌入式硬件接口,如果靠修改QEMU源碼來修改需要的I/O和外圍設備效率很低,另外,為了保證RTEMS嵌入式軟件的高可靠性和魯棒性,通過設計SystemC下的虛擬I/O仿真模塊[4],從而方便并且靈活地進行黑盒測試和故障注入測試,方便地收集RTEMS在正常和異常情況下的測試數據。
測試代理是銜接上層用戶UI接口和下層測試實施接口的測試執行管理器,根據QEMU特性,測試代理與QEMU上的Monitor進行通信。由于測試代理內各個模塊之間的數據需要頻繁交換,保證測試代理的高效性、數據精準及整個系統各模塊間無誤的工作,基于C++面向對象程序設計,設計了仿真代理模塊數據傳輸類,對各個模塊間的數據進行包裝,保證數據傳輸時協調和準確[5]。
仿真平臺控制模塊是黑盒測試當中最基本、也是最重要的一個部分,它負責連接虛擬環境,加載相關參數操作,在測試過程中負責與QEMU Monitor交互通信,控制QEMU的啟動、停止和掛起,并且可以從QEMU Monitor中讀取虛擬環境運行狀態。相關參數操作環節主要是啟動環境參數配置,其中包括虛擬目標機IP地址、文件系統類型、測試代理工作端口號、RTEMS的elf二進制文件映像絕對地址和外圍設備參數等。仿真平臺控制視圖如圖2所示。

圖2 仿真平臺控制視圖
Python[6]是一種解釋型、面向對象、動態語義、語法優美、跨平臺的開源腳本語言。結合QEMU黑盒測試的特點,使用C或C++對其核心命令集和數據集進行擴展。通過上述激勵方式介紹,Python的擴展[7]需要與仿真激勵控制的數據保持同步,包括仿真時鐘標識、仿真激勵方式和仿真I/O標識等,同時,指令集的擴展包括激勵控制、數據收集和生成xml測試報告等。
QEMU自身提供的仿真I/O外圍設備少而簡單,而RTEMS使用的都是復雜或者在測試過程中需要修改的外圍設備。如果通過修改QEMU的硬件抽象層源代碼來實現仿真I/O等外圍設備功能,不僅開發效率低耦合度高,而且系統可擴展性和可復用性也很差,所以使用SystemC仿真外圍虛擬設備。SystemC是一種非常著名的系統級描述語言,QEMU和SystemC之間的通信機制可以分為分布式系統和單一系統[8]2種。本文是在同一系統平臺下進行黑盒仿真測試,QEMU與SystemC的通信機制主要通過Socket API實現。嵌入式仿真測試重點在于激勵的注入、采集和虛擬 I/O外圍設備,SystemC不像其他硬件仿真語言,它可以提供多種抽象層次的仿真,包括寄存器傳輸層和功能參數層。對于黑盒仿真測試只關注虛擬I/O的功能參數層就夠了,不需要其精確的行為描述,所以SystemC非常適合黑盒仿真測試虛擬I/O編寫。通過修改虛擬的I/O設備運行狀態、功能和參數,可以快速地進行激勵控制,同時,還可以方便地進行故障注入測試。QEMU本身沒有包含任何與SystemC通信的接口,通過Socket APIs生成TLM(Transaction Level Modeling)[9]通道連接 QEMU和SystemC,如圖3所示。

圖3 QEMU-SystemC仿真框架
外圍激勵是驅動黑盒測試重要部分,外圍仿真激勵主要分為2種:向虛擬 CPU發送外部中斷和向虛擬I/O端口發送信號。RTEMS是實時操作系統,激勵的注入應考慮到邏輯、時序和實時問題,為了盡可能地滿足仿真激勵注入的正確和有效,保證仿真系統和宿主機平臺數據一致性和實時性,設計了以CPU滴答時鐘為基礎的仿真時鐘(Simulation Clock,ST)[10]。仿真時鐘頻率(Simulate Timer Frequency,STF)與計數初值之間的關系為:
STF=輸入時鐘頻率/計數初值。
這樣做也是為了方便在今后工作中需要對RTEMS應用性能評估和基準測試起到鋪墊作用。ST仿真時鐘有5元組:ST{STI(仿真時鐘標記),SF(仿真頻率),SL(仿真激勵發射器),SII(仿真I/O標記),SSU(仿真激勵更新)}。仿真時鐘工作模式如圖4所示。

圖4 仿真時鐘工作模式
設計了4種激勵模式:開環激勵模式、閉環激勵模式、混合外圍激勵模式和多路并發激勵模式。其中開環激勵模式較為簡單,閉環激勵模式較為復雜,混合外圍激勵和多路并發是建立在開環和閉環之上的。
更新的激勵種子來自于仿真模型的激勵計算器,仿真模型可以是開發人員根據實際項目定制的各種模型,也可以是由第三方提供的如事件模型、中斷模型、重力模型或運動模型等等[11]。將第一輪產生的激勵反饋邏輯寫入激勵控制器計算出下一輪的激勵種子,根據仿真時鐘的屬性再次加載注入到指定I/O里,直到仿真模型激勵計算器計算結束,退出閉環激勵模型。多路閉環外圍激勵模型如圖5所示。

圖5 多路閉環仿真激勵接口模型
本文實現了基于虛擬機QEMU搭建RTEMS系統仿真平臺,使測試用例通過測試代理模塊將外圍激勵注入,從而驅動測試執行,并通過重定向端口來收集測試數據。在取得一定成果的同時,還存在很多工作需要改進和完成,測試代理內的數據交換頻繁,需要一個實時、準確并且與仿真平臺同步的數據傳輸協議,同時需要優化仿真I/O外圍設備性能。為了盡可能地達到與真實環境一致的條件,準備基于RTEMS應用進行性能基準測試,一是使仿真環境接近真實環境,二是可以采集RTEMS應用性能測試數據以備分析。 ■
[1]BRUNO B,JOSEPH S.Embedded System Design[M].Germany:Springer Berlin Heidelberg,2005.258 -286.
[2]DANIEL B.QEMU:A Multihost,Multitarget Emulator[J].Specialized Systems Consultants,2006,6(145):145-150.
[3]王軼辰,劉 斌.嵌入式軟件仿真測試環境接口通訊協議研究[J].計算機工程與設計,2005,26(2):451-453.
[4]馮志華,陳 曦,高社生.一種異構多核片上系統的SystemC系統級綜合方法[J].系統工程與電子技術,2010,32(11):2484 -2489.
[5]韋 工.嵌入式仿真測試系統設計與實現[J].船舶電子工程,2004,24(6):103 -106.
[6]陳 儒.Python源碼分析[M].北京:電子工業出版社,2008:23-96.
[7]蔣崇武,劉 斌,王軼辰,等.基于Python的實時嵌入式軟件測試腳本[J].計算機工程,2009,35(15):64-67.
[8]MONTON,PORTERO,MORENO,et al.Mixed SW/SystemC SoC emulation framework[C]∥International Symposium on Industrial Electronics,2007:2338 - 2341.
[9]CHEN T,GUO T,MING C .A Fast Cycle-Accurate Instruction Set Simulator Based on QEMU and SystemC for SoC Development[J].Journal of System Architecture,2012,58(3):1033 -1038.
[10]李興瑋,張衛華,潘玉林.通用計算機實時仿真技術[J].國防科技大學學報,2005,27(2):75 -79.
[11]何新華,蔡紅柳,王 維.嵌入式軟件數字仿真測試研究[J].儀器儀表學報.2002,23(3):471-472.