嵌入式系统的测试装置及测试方法

文档序号:6371374阅读:278来源:国知局
专利名称:嵌入式系统的测试装置及测试方法
技术领域
本发明涉及含计算机程序系统的测试装置及测试方法,特别涉及嵌入式系统的测试装置及测试方法。
背景技术
目前,对通信领域中诸如交换机、基站系统等嵌入式系统的测试,一般通过具有测试功能的代码,即“测试代码”来实现。
其中,测试代码包括源代码和目标代码。源代码是指编译以前的程序代码;而目标代码是指经过编译器编译,可以在目标系统中链结运行的代码。值得注意的是,在通过测试代码测试嵌入式系统的方法中,由于加入测试代码的方式不同,测试的效率和测试深度会有所差别。
当进行系统测试时,技术人员根据系统的测试需求,决定是否需要在被测试的系统中加入新的测试代码,以支持系统的测试需求。如果需要,便设计出相应的测试源代码,再与被测试的系统的源代码一起通过编译器编译成为目标代码,并加入到该系统中,最后通过重新启动该被测试系统,开始测试工作。
上述方式的缺陷在于,1、先决条件是被测试的系统是否具有源代码,如果没有源代码,就无法完成对该系统的测试工作;2、每一次新的测试工作,都必须重新启动系统,从而严重影响测试效率。另外,某些被测试的系统不允许终止运行,因此根本无法使用这种测试方法。
与此同时,补丁技术越来越多地被软件开发商用于解决已经发行软件版本中存在的缺陷,或使其性能更加优化。在补丁技术中,“补丁函数”指的是用于替换系统中已有函数的新增函数;“被补丁函数”指的是被上文中的新增函数(即“补丁函数”)替换掉的系统中的原有函数。
通常补丁函数的实现过程,是在被补丁函数的源代码的基础上进行修改,生成补丁函数,并替换被补丁函数,以达到解决被补丁函数存在的问题,或对其性能进一步优化的目的。
随着测试技术和软件技术的发展,有些技术人员曾尝试在将补丁技术结合到嵌入式系统的测试工作中,但发现在实践中存在以下困难由于一旦补丁函数替换被补丁函数后,被补丁函数就无法继续在系统中使用,而被补丁函数往往是需要被测试的主要对象之一,因此,用于测试目的的补丁函数除了需要具有测试功能以外,还需要保留被补丁函数的原有功能,从而给其设计和实现的简化带来困难。
另外,当被测试的系统没有源代码时,还必须为实现被补丁函数的原来功能而重新设计补丁函数,工作量很大。当该被补丁函数与被测试系统的其他部分耦合较多时,可以说补丁函数的设计和实现相当的困难。
由于上述原因,目前尚没有一种较好的方法,既能够通过补丁技术顺利的对嵌入式系统进行测试,又可避免上述种种不利因素的困扰。

发明内容
本发明要解决的技术问题是提供一种嵌入式系统的测试装置和测试方法。采用这种装置对嵌入式系统进行测试时,既不需要被补丁函数的源代码,也不需要终止待测嵌入式系统的运行;同时能够简化测试代码的设计和实现工作。
为了解决上述技术问题,本发明提供的嵌入式系统的测试装置包含源代码生成器,用于根据外部输入的补丁函数的源代码生成补丁源代码;编译器,用于将所述源代码生成器输出的补丁源代码编译为补丁目标代码;下载器,用于将所述编译器输出的补丁目标代码下载到被测的嵌入式系统中,并控制所述嵌入式系统执行补丁目标代码产生测试函数并进行测试。
本发明还提供了一种嵌入式系统的测试方法,包含以下步骤A根据外部输入的补丁函数的源代码生成补丁源代码;B将步骤A所述补丁源代码编译为补丁目标代码;C将步骤B所述补丁目标代码下载到被测的嵌入式系统中,并控制所述嵌入式系统执行所述补丁目标代码产生测试函数并进行测试。
其中,所述补丁目标代码包含的指令实现以下步骤将嵌入式系统中的被补丁函数的首条指令修改成无条件跳转指令,直接跳转到所述补丁函数的首条指令。
另外,所述补丁目标代码包含的指令还实现以下步骤在嵌入式系统中产生两条构造指令,第一条指令用于完成补丁安装前被补丁函数的首条指令,第二条指令用于直接跳转到被补丁函数的第二条指令;还在补丁函数调用被补丁函数处产生两条指令,第一条指令用于获取所述第一条构造指令的地址,第二条指令用于以所述第一条构造指令的地址为入口地址进行调用。
另外,作为替代方法,所述补丁目标代码包含的指令还实现以下步骤在补丁函数调用被补丁函数处产生以下指令恢复被补丁函数的首条指令;调用该被补丁函数;调用完成后,再次将所述被补丁函数的首条指令修改成无条件跳转指令,直接跳转到补丁函数的首条指令。
通过比较可以发现,本发明的技术方案与现有技术的区别在于,首先,给出了将补丁技术应用于嵌入式系统测试工作的实际例子;其次,通过调用的方式在补丁函数中实现被补丁函数的功能。
这种技术方案上的区别,带来了较为明显的有益效果,即不但可以在既没有源代码,也不需要系统终止运行的情况下开始测试工作;而且保证了被补丁函数的原有功能仍然可以继续使用,从而降低补丁函数的开发难度。克服了补丁函数在用于系统测试时的局限性。总之,这种新的测试装置较大地提高了测试效率和测试深度。


图1是根据本发明一个实施例的嵌入式系统测试装置示意图。
图2是根据本发明一个实施例的嵌入式系统测试方法流程图。
具体实施例方式
为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作进一步地详细描述。
图1是根据本发明的嵌入式系统测试装置的一个实施例,其中,为了更加清楚地显示本发明,图中还标示了待测嵌入式系统2。参见图1中的虚线框,本实施例的测试装置1包含依次连接的三个模块源代码生成器、编译器和下载器。其中,下载器通过通信端口和待测嵌入式系统2连接。
另外,在如图2所示的根据本发明一个实施例的嵌入式系统测试方法流程图中,基于本发明提供的嵌入式系统测试装置,当需要对系统进行测试时,在步骤100中,由测试装置中的源代码生成器根据外部输入的补丁函数的源代码,生成用于测试的补丁源代码,该补丁源代码用于在待测嵌入式系统中生成测试函数,其中,测试函数包含有用于替代待测嵌入式系统中的被补丁函数的补丁函数,此后进入步骤200。
在步骤200中,源代码生成器将补丁源代码输出给与之相连的编译器;编译器将此源代码编译成待测嵌入式系统能够执行的目标代码,即补丁目标代码,并将补丁目标代码输出给下载器;此后进入步骤300,由下载器把编译器输出的补丁目标代码下载到待测嵌入式系统中,并且让嵌入式系统内部的处理器执行所述补丁目标代码,完成嵌入式系统的测试工作。
当需要对嵌入式系统2进行测试时,测试人员根据对测试需求的分析结果,确定需要测试的函数,以及需要加入测试功能的函数实体(以下称为被补丁函数)。根据上述测试需要,编写能够替代被补丁函数、完成测试功能的补丁函数的源代码。
这里需要说明两点,一是一般来说,被补丁函数类型(包括但不限于函数的参数个数及其数据类型、返回值的类型)应当和补丁函数的类型一致;二是在补丁函数的源代码中,如果需要调用原来的被补丁函数,可在每一个调用处加入一个调用标记。
随后,将上述补丁函数的源代码,连同被补丁函数的名称一起输入到源代码生成器中。源代码生成器接收到后,对补丁函数的源代码进行分析,生成补丁源代码,该补丁源代码用于在嵌入式系统中生成测试函数,其中,测试函数包含有补丁函数,在一些情况下,还包含构造指令,这将在下文中详细描述。在本发明中,该补丁源代码能够实现以下两个基本功能基本功能一,先根据输入的被补丁函数的名称,寻找被补丁函数在嵌入式系统2中的入口地址(即被补丁函数第一条指令的地址),再寻找在补丁函数加入嵌入式系统2以后的入口地址(即补丁函数第一条指令的地址)。将被补丁函数的首条指令修改成无条件跳转指令,直接跳转到补丁函数的首条指令。
基本功能二,如果在补丁函数中需要调用原先的被补丁函数,源代码生成器会找到补丁函数源代码中的调用标记,在调用标记处插入一段代码来调用被补丁函数。所述的用来调用被补丁函数的代码可以由两种方式构成。下面予以具体说明。
第一种方式是在执行补丁目标代码的时侯构造两条指令,本文中将它们称为构造指令。第一条指令完成补丁目标代码执行前被补丁函数的首条指令功能,第二条指令是一条跳转指令,直接跳转到被补丁函数的第二条指令。
在补丁函数中需要调用被补丁函数处,先获取第一条构造的地址,然后以所获取的地址为调用入口进行调用即可。实现上述功能的代码段构成第一种调用被补丁函数的方法。
第二种方式是先恢复被补丁函数的首条指令(如上所述,这条指令在执行补丁目标代码的时侯已经被替换成无条件跳转指令),然后调用该被补丁函数,调用完成后,再次把被补丁函数的首条指令替换成跳转到补丁函数首条指令的无条件跳转指令。实现上述功能的代码段构成第二种调用被补丁函数的方法。
因此,当待测嵌入式系统2中的其他代码调用被补丁函数时,由于被补丁函数的首条指令已经被替换成跳转到补丁函数首条指令的无条件跳转指令,待测嵌入式系统2将执行补丁函数,从而完成补丁函数中测试代码的功能。
随后,如果使用第一种调用被补丁函数的方法,当补丁函数调用被补丁函数时,因为以构造的第一条指令地址为入口,所以先执行被补丁函数的第一条指令,然后根据第二条指令跳转到被补丁函数的第二条指令,接着从被补丁函数的第二条指令一直执行到被补丁函数的最后一条指令,最后返回补丁函数调用被补丁函数的地方,继续执行补丁函数剩余的指令。从而完成了在补丁函数中调用被补丁函数的功能。
另外,如果使用第二种调用被补丁函数的方法,当补丁函数调用被补丁函数时,先恢复被补丁函数的首条指令(这条指令在打补丁的时侯已经被替换成无条件跳转指令),此时被补丁函数恢复到执行补丁目标代码以前的状态,然后调用该恢复原状的被补丁函数。调用完成后再次把被补丁函数的首条指令替换成跳转到补丁函数首条指令的无条件跳转指令,实现这一步的目的是当待测嵌入式系统2中的其他部分再次调用被补丁函数时可以顺利地跳转到补丁函数。可见,这样也能够完成在被补丁函数中调用被补丁函数的功能。
在上述补丁源代码中涉及的一些基本功能,例如根据函数名获取函数首条指令地址、修改内存中的某一条指令为无条件跳转指令等,在一般的嵌入式系统2的操作系统(如VxWorks)中都可以方便地实现。
源代码生成器生成补丁源代码后,将其输出给编译器,由编译器编译成待测嵌入式系统2能够执行的目标代码,并输出给下载器。需要说明的是,需根据待测嵌入式系统2所使用的操作系统和语言的不同而选择相应的编译器。
测试装置1的下载器有两个主要任务,一是下载补丁,二是控制待测嵌入式系统2执行补丁。更具体地说,下载器由一个和待测嵌入式系统2相连接的通信端口和一个控制器组成。通信端口的类型取决于待测嵌入式系统2的支持类型,常见的有串行口、并行口、通用串行总线口(USB)。控制器的作用一方面是与待测嵌入式系统2协调以完成补丁目标代码的下载,另一方面是在补丁目标代码下载完成后指挥待测嵌入式系统2执行补丁目标代码。
上面已经详细描述了测试装置的组成和测试方法的原理。接下来通过本领域的普通工程师容易读懂的类似于C语言的伪代码,举例说明应用于三种常见的测试要求的补丁。
例1嵌入式系统2中器件读写偶发故障模拟测试。
在测试中有时需要通过模拟器件读写数据过程中偶然发生的故障,来测试嵌入式系统2的可靠性。在这个实例中的被补丁函数是器件数据读写驱动函数,假设原驱动函数为int WriteDrv(DATA*pData){实现对设备写入某些数据;if(写成功)返回OK;Else返回ERR;}实际应用中通常总是返回OK,如果在测试中希望模拟该设备随机数据写入失败,可以使用补丁函数(newWriteDrv)替换原来的被补丁函数,补丁函数实现时只需要知道被补丁函数的函数原型,不需要有被补丁函数的源代码,也不必关心被补丁函数如何实现。补丁函数可以按如下方法完成<pre listing-type="program-listing">int newWriteDrv(DATA*pData) {产生一个随机数;if(随机数满足某条件){故障注入统计;返回ERR;&lt;dp n="d8"/&gt;}Else{调用标记(调用WriteDrv);返回WriteDrv的调用返回值;}}</pre>编写好补丁函数后,将补丁函数源代码和被补丁函数名称输入源代码生成器,生成补丁源代码,经过编译器编译后生成补丁目标代码,通过下载器下载到待测嵌入式系统2中,并且指挥待测嵌入式系统2执行该补丁目标代码。执行补丁目标代码时修改了WriteDrv的首条指令,将其改为跳转到newWriteDrv函数的指令。这样嵌入式系统2中需要调用WriteDrv时,实际调用的是newWriteDrv,实现了故障模拟。
这种故障注入测试应用比较广泛,嵌入式系统2中任何存储器件的读写失败模拟,只要存在读写驱动函数,都可以通过上述代码实现。例如闪速存储器(以下称为Flash)器件写失败模拟。通过在Flash写驱动函数中插入故障注入函数实现,可以按照一定的概率直接返回写失败,模拟偶发的Flash器件写失败。
电子可擦写编程只读存储器(Electrically Erasable ProgrammableRead-Only Memory,以下称为EEPROM)读、写失败模拟。通过在EEPROM读、写驱动函数中插入故障注入函数实现,可以按照一定的概率直接返回读或写失败,模拟偶发的EEPROM读、写失败。
硬盘读、写失败模拟。通过在硬盘访问驱动函数中插入故障注入函数实现,可以按照一定的概率直接返回读或写失败,模拟偶发的硬盘读、写失败。
非易失性随机存储器(Non-volatile Random Access Memory,以下称为NVRAM)读、写失败模拟。通过在NvRam读、写驱动函数中插入故障注入函数实现,可以按照一定的概率直接返回读或写失败,模拟偶发的NvRam读、写失败。
内存拷贝偶发错误模拟。通过在内存拷贝函数中插入干扰函数(随机修改某些被拷贝的数据),实现内存拷贝时偶发数据错误模拟。
直接存储器存取(Direct Memory Access,以下称为DMA)传输偶发错误模拟。通过在DMA传输驱动函数中插入干扰函数(随机修改某些被传输的数据),实现DMA传输时偶发数据错误模拟。
例2嵌入式系统2资源故障注入。
嵌入式系统2资源故障注入在故障注入测试中有很大的需求。由于嵌入式系统2所选用的操作系统函数没有源代码,使用传统的修改源代码的方式难以实现,使用本发明提供的技术,这些故障模拟就可以轻松实现。例如内存申请失败模拟。通过替换申请内存的函数实现,可以按照一定的概率返回空指针,模拟偶发的内存申请失败。malloc函数用于申请一定数量的内存,在本实例中为被补丁函数,Newmalloc是补丁函数。Newmalloc可按如下方法实现<pre listing-type="program-listing">void*Newmalloc(size_t nBytes){产生一个随机数;if(随机数满足某条件){故障注入统计;返回NULL;&lt;dp n="d10"/&gt;}Else{调用标记(调用malloc);返回malloc的调用返回值;}}</pre>其它方面,凡是使用时需要申请释放的资源都可以通过此种方法模拟,例如定时器资源申请失败模拟。通过替换定时器申请函数,可以按照一定的概率返回空指针,模拟偶发的定时器申请失败。
信号量申请失败模拟。通过替换信号量申请函数,可以按照一定的概率返回空指针,模拟偶发的信号量申请失败。
数据Buf的申请释放。通过替换数据的申请函数,可以按照一定的概率返回空指针,模拟偶发的数据申请失败。
例3消息异常模拟。
消息异常测试是嵌入式系统2容错性测试的重要内容。例如对消息内容加扰。通过替换某通道消息发送或接收函数,可以按照一定的概率更改消息内容,模拟偶发的消息内容错误。此时被补丁函数是消息发送函数send,补丁函数是Newsend。如嵌入式系统2中原消息发送函数为int send(DATA*pData){将消息指针写入接收通道;
if(写成功)返回OK;Else返回ERR;}实际应用中消息内容可能会出现某些传输错误,通过本发明提供的技术可以模拟实际传输错误。使用Newsend补丁函数替换原来的被补丁函数,补丁函数可以按如下方法完成<pre listing-type="program-listing">int Newsend(DATA*pData){产生一个随机数;if(随机数满足某条件){故障注入统计;根据某种算法修改pData的部分消息内容;}调用标记(调用send,以pData为参数);返回send函数调用的返回值;}</pre>其它凡是存在发送接收函数的都可以通过此种方法实现类似测试目的,例如消息丢失模拟。通过替换某通道消息接收函数,可以按照一定的概率将接收消息直接丢弃,不传给给上层应用,模拟偶发的消息丢失。
消息发送失败模拟。通过替换某通道消息发送函数,可以按照一定的概率不发送消息,直接返回消息发送失败,模拟偶发的消息发送失败。
重复消息模拟。通过替换消息发送函数,可以按照一定概率将需要发送的消息连续发送多次,模拟偶发的消息重发错误。
虽然通过参照本发明的某些优选实施例,已经对本发明进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种各样的改变,而不偏离所附权利要求书所限定的本发明的精神和范围。
权利要求
1.一种嵌入式系统的测试装置,其特征在于,包含源代码生成器,用于根据外部输入的补丁函数的源代码生成补丁源代码;编译器,用于将所述源代码生成器输出的补丁源代码编译为补丁目标代码;下载器,用于将所述编译器输出的补丁目标代码下载到被测的嵌入式系统中,并控制所述嵌入式系统执行所述补丁目标代码产生测试函数并进行测试。
2.一种嵌入式系统的测试方法,其特征在于包含以下步骤A根据外部输入的补丁函数的源代码生成补丁源代码;B将步骤A所述补丁源代码编译为补丁目标代码;C将步骤B所述补丁目标代码下载到被测的嵌入式系统中,执行所述补丁目标代码产生测试函数并进行测试。
3.根据权利要求2所述的嵌入式系统的测试方法,其特征在于,所述补丁目标代码包含的指令实现以下步骤将嵌入式系统中的被补丁函数的首条指令修改成无条件跳转指令,直接跳转到所述补丁函数的首条指令。
4.根据权利要求2所述的嵌入式系统的测试方法,其特征在于,所述补丁目标代码包含的指令还实现以下步骤在嵌入式系统中产生两条构造指令,第一条指令用于完成补丁安装前被补丁函数的首条指令,第二条指令用于直接跳转到被补丁函数的第二条指令;还在补丁函数调用被补丁函数处产生两条指令,第一条指令用于获取所述第一条构造指令的地址,第二条指令用于以所述第一条构造指令的地址为入口地址进行调用。
5.根据权利要求2所述的嵌入式系统的测试方法,其特征在于,所述补丁目标代码包含的指令还实现以下步骤在补丁函数调用被补丁函数处产生以下指令恢复被补丁函数的首条指令;调用该被补丁函数;调用完成后,再次将所述被补丁函数的首条指令修改成无条件跳转指令,直接跳转到补丁函数的首条指令。
全文摘要
本发明公开了一种嵌入式系统的测试装置及测试方法,使得在对嵌入式系统进行测试时,不需要源代码,也不需要终止系统的运行;同时能够简化测试函数的设计和实现工作。本发明的嵌入式系统的测试装置包含源代码生成器,用于根据外部输入的补丁函数的源代码生成补丁源代码;编译器,用于将所述源代码生成器输出的补丁源代码编译为补丁目标代码;下载器,用于将所述编译器输出的补丁目标代码下载到被测的嵌入式系统中,并控制所述嵌入式系统执行补丁目标代码产生测试函数并进行测试。
文档编号G06F11/36GK1567232SQ0314735
公开日2005年1月19日 申请日期2003年7月10日 优先权日2003年7月10日
发明者陈志强, 韩富荣 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1