基于Proemulator的插桩构架研究
摘 要:将可扩展、可裁剪的嵌入式模拟器应用于嵌入式软件测试有很多优点。详细研究了已有嵌入式模拟器Proemulator的工作机制,提出基于模拟器的嵌入式测试平台构架。首先将被测软件进行插桩,生成目标程序运行于模拟器之上,模拟器进程在执行过程中实时地将桩数据发送给桩信息分析器,由分析器即时得出程序运行过程中的语句覆盖率。实现了基于Proemulator的插桩构架,包括桩数据的发送与获取,能有效进行白盒测试。
关键词:嵌入式测试平台;模拟器;插桩;Proemulator
中图分类号:TP391.9 文献标识码:A
文章编号:1004-373X(2010)03-188-03
Research on Instrumentation Frame Based on Proemulator
FAN Lin,WANG Zhongmin,LIANG Chen,XIE Yonggang
(Xi′an Institute of Post and Telecommunications,Xi′an,710061,China)
Abstract:There are many advantages of applying extensible and scalable embedded simulator to embedded software testing.Particular researches are made to working mechanism of existing embedded simulator:Proemulator.An Embedded System Testing Environment Frame(ESTE) is brought forward.Adding instrumentation into embedded program under test,compile and link the instrumented program to get an executable program.Running it on the simulator,the simulator process sends instrument information timely to instrument analyzer.The analyzer can calculate program statement coverage.An instrumentation frame based on Proemulator which can send and analyze instrumentation effectively and timely to do white box testing are realized.
Keywords:embedded test environment frame;simulator;instrumentation;Proemulator
0 引 言
由于目标机与宿主机处理器体系结构不同,嵌入式软件无法在宿主机上直接运行与测试[1],因此嵌入式软件的开发过程常常比硬件开发过程还要漫长,导致整个系统开发周期长,软件功能调试和性能测试不能及时完成,软件质量无法保证。嵌入式模拟器能良好地解决这一问题[2]。
将模拟器应用到嵌入式软件的开发与测试中,其优点有如下几个方面:
(1) 采用模拟器进行嵌入式开发与测试能让软件和硬件开发同步进行,缩短开发周期;
(2) 能提供比真正硬件环境下更丰富的测试环境,拓宽测试范围;能进行长时间的测试,甚至能在真实硬件不能承受的“危险”条件下测试[3]。
(3) 能提供调试,测试,变量查看,性能分析,实验数据存储等多种额外功能,便于开发与测试人员进行分析。
1 国内外模拟器相关研究
国内外已有若干较成熟的嵌入式系统模拟器,如ARM公司的ARMmulator[4],同济大学开发的Proemulator中针对ARM芯片的指令模拟器[5],清华大学Sky Eye项目中的指令模拟器[6],Linux上的开源软件GDB ARMulator[7]。
Proemulator是一个源码开放的通用模拟器架构,能在宿主机上以纯软件方式模拟各种硬件设备(包括CPU、输入/输出设备等),也可以模拟由这些设备组成的单片机或嵌入式系统。它基于插件机制,主程序提供整个构架,包括运行环境的建立、代码的装载和运行时内存、寄存器、端口的查看界面等,而插件负责模拟不同硬件设备的行为和特性,并抽象成一个统一的接口提供给主程序调用[6]。通过这个机制,模拟新的设备变得更为容易。Proemulator提供多种CPU插件与若干种片内与片外外设,结构图如图1所示。
图1 Proemulator结构图
2 基于嵌入式模拟器的插桩构架
嵌入式测试平台建立在嵌入式模拟器之上,测试过程中首先对被测程序进行插桩,桩节点在程序运行过程中能同步的,即时地向桩信息分析器输出预设的桩信息。分析器能实时接收装数据,并进行分析,从而得出整个被测程序运行过程中的覆盖率和分支情况。基于嵌入式模拟器的插桩构架如图2所示。
图2 基于嵌入式模拟器的插桩构架
3 基于Proemulator的插桩构架实现
嵌入式模拟器和桩信息分析器为两个独立进程,在两者之间实现桩数据的传递,需采用进程间通信机制。常见的进程间通信方法有以下几种:
(1) Socket通信是常见的进程间通信方法,它能良好地支持网络通信协议TCP/IP,在进行通信时,需要设置端口,并通过几次握手建立TCP连接,因此适合网络间的大量数据传输,而对于单机上的少量多次数据传输并不合适。
(2) 共享内存的方法较为常见,对于每个进程来说,获得共享内存后,就能实现内存的读写操作。但是如果不进行同步,则一个进程在进行读的过程中另一个进程进行写操作,就会造成数据的不一致。因此在采用共享内存的方法时,需要将共享区域设置为临界资源。常用的方法有信号量机制,两个进程访问共享内存时,利用P,V操作进行读写的互斥。当P操作成功时,才能访问临界区,访问完毕后进行V操作,让出使用权,使得别的进程能够访问。共享内存的方法适合多个进程间的大量数据共享,只要处理好操作的互斥性,该方法非常实用。
(3) WM_COPYDATA消息是Windows底层消息,使用非常方便,只需获得进行通信的进程的窗口句柄,就能通过SendMessege函数将数据封装在消息中传递给该进程,因为SendMessege函数在接收进程接到消息后才会返回,因此绝对不会发生消息丢失的情况,是可靠的通信。接收方只需要处理WM_COPYDATA消息,便能获得传递来的数据。当然,该方法不能用于网络间的传输,只能用于单机环境下的Windows操作系统。还有管道,剪贴板,文件映射等方法,本文不做详细介绍。下面详细介绍基于嵌入式模拟器获取桩数据的技术难点。
3.1 基于Proemulator的插桩构架
Proemulator源码完全开放,提供了UART插件,对外设的模拟可以简化为对端口寄存器的模拟,当程序访问相应的端口时,触发其对应外设的动作。UART内部包括控制口和数据口。向控制口写入工作方式控制字后,访问数据口数据能触发事件。在被测程序中进行插桩初始化,设定UART工作方式,在需要插桩的位置将桩数据写入UART数据端口,然后在UART插件中将写入数据端口的桩信息使用Windows进程通信机制输出。
Proemulator提供了多种串行数据重定位的方式来将模拟器内部的数据信息发送至外部,包括控制台、磁盘文件、命名管道和串口[5]。其中命名管道是一种较好的方式,只需编写自己的管道接收器,就能实时地接收管道发送出来的桩数据,使用串口也比较方便。还能在Proemulator中加入共享内存,或者发送WM_COPYDATA消息,基于Proemulator的插桩构架如图3所示。
图3 基于Proemulator的插桩构架
3.2 插桩构架性能分析
本文实现了基于Proemulator的桩数据的发送与获取,并进行了分析,见表1。
表1 基于ARMulator和Proemulator的插桩构架比较
基于Proemulator的ESTE
桩数据发送不采用中断机制,桩数据发送比ARMulator慢
桩数据获取机制支持磁盘文件,WM_COPYDATA消息通信,共享内存机制,串口通信,命名管道等各种Windows进程通信机制
是否需要编写外设插件来发送桩数据提供UART插件,能直接使用
外设插件提供插件较多,如UART,LED,LCD等
插件编写规范其插件编写规范相应简单
加载插件修改配置文件无需修改配置文件
4 结 语
本文提出基于嵌入式模拟器的插桩构架,将插桩后的程序经编译生成可执行代码,运行于模拟器上,在运行过程中模拟器能实时地将桩信息发送到桩信息分析器,进行代码的白盒测试。本文基于已有的嵌入式模拟
器Proemulator实现了桩数据获取。基于嵌入式模拟
器的插桩架均能即时地进行桩数据的发送接收与分析,能有效进行白盒测试。
参考文献
[1]Alex Heunhe Han,Yong-Ho Ahn,Ki-Seok Chung.Virtual ARM Simulation Platform for Embedded System Developers[A].ITC-CSCC[C].2008:253-256.
[2]李明.两种嵌入式软件仿真环境的分析与比较[J].电子产品世界,2003(7):47-49.
[3]蒋崇武,杨顺昆,刘斌.面向嵌入式软件测试的仿真建模[J].计算机工程,2008,34(4):87-89.
[4]ARM Limited.ARM Application Notes[EB/OL].http://rtds.cs.tamu.edu/web_462/techdocs/ARM/appsnotes/index.htm,2003.
[5]Stanley Huang.ProEmulator Introduction[EB/OL].http://proemulator.sourceforge.net,2005.
[6]SkyEye开发小组.Sky Eye项目文档[EB/OL].http://www.huihoo.org/mirrors/skyeye/skyeyedoc.html.2003.
[7]David McCullough.μClinux in the GDB/ARMulutor[EB/OL].http://www.uclinux.org/pub/uClinux/utilities/armulator,2005.