2.3 嵌入式软件测试技术
操作系统的裁剪和应用软件的编码都是在通用的台式机或工作站上完成的,称这样的台式机为宿主机;而待开发的硬件平台通常被称为目标机。
嵌入式软件的突出特点在于其运行环境和开发环境的不一致,这一特点也导致典型的实时嵌入式软件测试要从宿主机下载到目标机上进行测试。
嵌入式软件测试的步骤是在主机上编写测试代码,然后把该代码编译加载到目标机,接着通过测试代理执行该测试目标代码。测试工具运行在宿主机上,测试所需要的信息在目标机上产生,由于目标机的资源相对匮乏,测试所得的信息在目标机上不便分析,通过主机和目标机之间的通信把测试所得信息上传回主机,再由主机中的测试结果分析工具对测试信息进行分析。嵌入式测试系统基本结构如图2-3所示。
图2-3 嵌入式测试系统基本结构
2.3.1 宿主机—目标机开发模式
这种在宿主机上完成软件功能,然后通过串口或者网络将交叉编译生成的目标代码传输并装载到目标机上,在监控程序或者操作系统的支持下利用交叉调试器进行分析和调试,最后,目标机在特定环境下脱离宿主机单独运行的系统开发模式,称为宿主机—目标机(Host-Target)模式,它是嵌入式系统常采用的一种典型开发模式。
在宿主机—目标机开发模式中,交叉编译和远程调试是系统开发的重要特征。
(1)交叉编译
宿主机上的CPU结构体系和目标机上的CPU结构体系是不同的。为了实现裁剪后的嵌入式操作系统,在移植它们之前,必须在宿主机上建立新的编译环境,进行和目标机CPU相匹配的编译,这种编译方式称为交叉编译。新建立的编译环境称为交叉编译环境。交叉编译环境下的编译工具在宿主机上配置编译实现,必须是针对目标机CPU体系的编译工具。只有这样,对源代码编译生成的可执行映像,才会被目标机的CPU识别。
(2)远程调试
远程调试是一种允许调试器以某种方式控制目标机上被调试进程的运行方式,并具有查看和修改目标机上内存单元、寄存器及被调试进程中变量值等各种调试功能的调试方式。
在嵌入式系统中,调试器运行在宿主机的通用操作系统之上,被调试的进程运行在目标机的嵌入式操作系统中,调试器和被调试进程通过串口或者网络进行通信,调试器可以控制、访问被调试进程,读取被调试进程的当前状态,并能够改变被调试进程的运行状态。
嵌入式系统的交叉调试可分为硬件调试和软件调试两种。硬件调试需要使用仿真调试器协助调试过程,硬件调试器是通过仿真硬件的执行过程,让开发者在调试时可以随时了解到系统的当前执行情况。而软件调试则使用软件调试器完成调试过程。
在目标机上,嵌入式操作系统、应用程序代码构成可执行映像。可以在宿主机上生成完整映像,再移植到目标机上;也可以把应用程序做成可加载模块,在目标机操作系统启动后,从宿主机向目标机加载应用程序模块。
2.3.2 目标监控器
嵌入式系统开发环境中,目标监控器对嵌入式软件的开发和调试有至关重要的意义。
嵌入式系统的调试,与一般台式机上编程调试显著不同。嵌入式调试工具是用于嵌入式系统开发中代码定制和调试的工具,分为驻留主机部分和驻留目标机部分。驻留主机部分称为调试器,驻留目标机部分称为目标监控器。目标监控器是解决嵌入式软件开发工具与这些支撑硬件的连接和通信的一个重要支持部件,是嵌入式应用开发、调试环境的核心部件,是许多功能模块实现的基础。
按照具体的实现方式的不同,可以将目标监控器分为软件监控器、硬件监控器、软件仿真器和软件模拟监控器。
(1)软件监控器
软件监控器是驻留在目标机上通过软件手段实现的调试代理。实际上,主机端的调试命令不是直接交由目标机硬件执行的,而是首先发送给软件监控器,再由软件监控器转交给目标机执行,然后将所监控的程序运行到断点处的相关信息反馈给主机端的调试器。按照对目标机硬件和软件的控制能力,软件监控器分为引导型监控器和应用型监控器。
1)引导型监控器
引导型监控器是一种具有启动系统、加载和调试包括内核在内的程序等功能的软件监控器,它实际上是一个具有监控功能的微型操作系统。
引导型监控器应用上投资较小、功能强大,能够调试内核程序;研发上虽然有公开源码的实用系统和完善的调试器GDB可供配套选用,但开发引导型监控器仍然需要对目标机硬件和操作系统、编译技术的某些核心技术、实时监控、故障现场保存、应用重新加载和运行技术等进行相关的研究。
2)应用型监控器
应用型监控器是运行在目标机操作系统之上的软件调试代理,用于调试操作系统上的应用程序。在嵌入式系统应用软件开发过程中,许多软件只要求运行于特定嵌入式操作系统之上。对于调试与硬件和内核结合不很紧密的应用,所需监控器也无需监控系统内核。
在目标机上直接运行调试器总是受资源限制的,这时可以使用一种依赖于操作系统运行的软件调试代理,为调试器提供非内核应用的调试代理服务。运行于嵌入式Linux之上的自由软件GDBSERVER,是应用型软件监控器的代表。
(2)硬件监控器
硬件监控器是由硬件实现的监控器,按照硬件实现技术途径的不同,可分为ICE,ICD和ROM仿真器3类。
1)ICE
ICE是一种替代CPU执行的设备,真正将CPU动作全部执行。在嵌入式系统开发环境中,可以将开发平台上的串口线或网线直接连向ICE装置,然后设置好端口号和通信速率,就可以代替原来的目标机进行应用程序调试了。
ICE一般都具有中断内存、拥有大量硬件中断点、模拟内存采用双口内存和能在执行时同时看到数据的变化的特点;同时附有功能强大的分析器,可以分析状态、效率和时序等。它不但可以向前执行,还可以倒退执行,所有信息都可以记录下来,包括计时器状态、工作切换状态、内存状态、寄存器状态、变量等。更重要的是这些信息全部是实时的,不像软件方式看到的是近似停止的情况,这是软件监控器无法达到的效果。
2)ICD
ICD是通过将监控功能直接做到目标机CPU上来实现的。将监控功能的接口引出来,让外部硬件能够直接接到这些引脚上去监控整个CPU的动作。通过这些接口,就可以利用比较便宜的调试工具和CPU沟通。
对具有监控功能的CPU来说,可以使用ICD实现硬件监控辅助调试的功能。ICD速度在应用上比ICE慢很多;研发上受制于目标机CPU自身提供的监控功能、扩展功能。
3)ROM仿真器
ROM仿真器就是仿真目标机上ROM的RAM装置。在结构上ROM仿真器是一个有两条电缆的盒子,一条电缆连接到主机串口,通过这条串行连线下载新的执行程序到ROM仿真器的RAM中;另一条电缆插在目标系统的ROM插座上,目标平台认为它在访问ROM,而实际访问的是ROM仿真器的RAM,该RAM中含有所下载的用于测试的程序。
ROM仿真器为编辑、编译、下载、调试开发过程节省运作时间。在更新ROM中的程序时,一般是取下旧PROM,将其放到EPROM烧结炉中,烧结新的程序,然后再插回到目标系统,这样很快就会老化。使用ROM仿真器,就可以生成程序,将其下载到ROM仿真器中,运行测试它,等到满意时再下载到目标机ROM或内存中。
(3)软件仿真器
软件仿真器是一种软硬件结合型的目标监控器,其安装部分或全部目标平台硬件仿真到软件环境中。与其他类型目标监控器的调试器与目标监控器分离不同的是,软件仿真器同时集成了调试器和目标监控器的功能。根据仿真程度的不同,可以分为低档软件仿真器和高档软件仿真器。
(4)软件模拟监控器
在嵌入式系统开发环境中,通常会提供软件模拟监控器。一些基本的语法和逻辑错误往往通过在开发平台上的模拟环境就可以检测出来,没必要每次都加载到目标机上;特别是,这使得在没有目标机的情况下,也能进行某些嵌入式应用的初期开发工作。
软件模拟监控器是一个软件仿真环境,它可以帮助开发者在没有实际硬件的前提下,对应用程序进行设计和调试。
软件模拟监控器具有类似于软件仿真器的仿真运行环境,同时还具有一定的监控功能,但是这种监控是针对模拟平台运行的应用,与该应用在目标机上的实际运行情况并不完全一致。所以,只能用于应用程序初期的开发调试。