基于QEMU仿真平台下RTEMS应用测试技术研究
2013-10-18闫洋铭蔡建平
闫洋铭,蔡建平
(北京工业大学,北京 100124)
0 引言
RTEMS[1]是80年代美国研制的军用实时操作系统且被运用于导弹控制系统。1994年源码开放后,多被应用于卫星探测系统、武器控制系统和工业中控系统。因此一般运用RTEMS系统的领域都对系统可靠性和实时性有很严格的要求,然而RTEMS在真实环境下测试难度和风险都很大。由Fabrice Bellard主要编写的一套二进制指令动态翻译器QEMU[2],是一款跨平台、仿真速度快、开源并且支持多种CPU架构的虚拟软件。
1 仿真测试平台设计
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]。
2 仿真测试控制
仿真平台控制模块是黑盒测试当中最基本、也是最重要的一个部分,它负责连接虚拟环境,加载相关参数操作,在测试过程中负责与QEMU Monitor交互通信,控制QEMU的启动、停止和挂起,并且可以从QEMU Monitor中读取虚拟环境运行状态。相关参数操作环节主要是启动环境参数配置,其中包括虚拟目标机IP地址、文件系统类型、测试代理工作端口号、RTEMS的elf二进制文件映像绝对地址和外围设备参数等。仿真平台控制视图如图2所示。
图2 仿真平台控制视图
Python[6]是一种解释型、面向对象、动态语义、语法优美、跨平台的开源脚本语言。结合QEMU黑盒测试的特点,使用C或C++对其核心命令集和数据集进行扩展。通过上述激励方式介绍,Python的扩展[7]需要与仿真激励控制的数据保持同步,包括仿真时钟标识、仿真激励方式和仿真I/O标识等,同时,指令集的扩展包括激励控制、数据收集和生成xml测试报告等。
3 外围设备仿真
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 外围激励注入
设计了4种激励模式:开环激励模式、闭环激励模式、混合外围激励模式和多路并发激励模式。其中开环激励模式较为简单,闭环激励模式较为复杂,混合外围激励和多路并发是建立在开环和闭环之上的。
更新的激励种子来自于仿真模型的激励计算器,仿真模型可以是开发人员根据实际项目定制的各种模型,也可以是由第三方提供的如事件模型、中断模型、重力模型或运动模型等等[11]。将第一轮产生的激励反馈逻辑写入激励控制器计算出下一轮的激励种子,根据仿真时钟的属性再次加载注入到指定I/O里,直到仿真模型激励计算器计算结束,退出闭环激励模型。多路闭环外围激励模型如图5所示。
图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.