调试嵌入式处理器的几种常用方法
在任何产品设计过程中,设计人员通常要将相当长的一部分时间,用于系统的集成性和软硬件调试。在引擎管理、硬盘控制和调制解调器之类的实时系统中尤其如此。
嵌入式系统中,由于微处理器嵌于ASIC或用户芯片的内部,系统调试变得更加困难,因为通常对处理器总线和信号的接入都是有限制的。在多处理器系统中(如硬盘驱动器、寻呼机、手机中常见的控制器-DSP体系结构)更是如此。
本文简要回顾了几种调试处理器系统的常见方法,并介绍了ARM公司新开发的调试方法,即通过使用电路内仿真器(In Circuit Emulators)、监控程序(Monitor Programs) 和逻辑分析仪(Logic Analysers)解决存在的问题。
电路内仿真器(In Circuit Emulators,即 ICE)
ICE由实时探测、实时追踪和记忆仿真组成,所有这些集成在一个统一的用户界面上。这能为软件工程师提供一个硬件保护层。此外,ICE不需要周围系统全部正常工作后才能调试,因而在软件开发和硬件开发之间提供了一定程度上的平衡,有利于缩短产品上市时间。
标准ICE存在的问题
● ICE的众多接点会影响目标系统的正常时序,从而降低其最快速度;
● ICE的存在使得处理器的更换牵涉到非常复杂的接点,更换处理器同时会改变原来的电气特性,这样就意味着有可能产生很多不可预知的问题;
● ICE的发布要落后于处理器,通常在一个新的处理器出台后的6-9个月的时间才会有与其配合的ICE;
● 一个深度嵌入的CPU需要很多的引脚才能将内部信号传递到ICE;
● 考虑到ICE所需要的资源,有些处理器的用户变量可能不被ICE所支持;
● ICE的成本可能十分昂贵。
调试监控程序(Debug Monitors)
在目标系统中安装调试监控程序是ICE外的另一个选择,它能为用户提供测试和调试软件所需的许多功能,例如设定断点、从目标存储器中上载数据以及下载应用程序等。
这种方法的优势在于开发的软件可以在同一个处理器上运行,并且能将硬件与最终系统进行整合。而且Debug Monitor价格低廉,能帮助节约系统开发成本。另一方面,目标系统的ROM中必须存有一个监控程序,这是一个很大的问题,因为它必须从最终产品中撤除,否则就会增加额外的开销。
另外,运行调试程序的主机和目标之间还需要一个通信通道。通常目标系统使用UART来实现。UART的驱动程序应在监控程序之前完成与目标系统结合的移植工作。
监控程序的代码也必须根据具体的目标系统进行移植,这意味着在系统硬件中,应保证主要的部分在监控程序启动之前能够正常工作。
逻辑分析仪
逻辑分析仪的调试功能并不十分完备,因而常常作为以上两种调试方法的有效补充使用。这是由于逻辑分析仪只能提供一个代码执行过程的回顾。用户无法改变变量或跳转至程序的其他位置,所以,在没有重新编译的情况下, “假设分析”测试无法进行。除此之外,许多逻辑分析仪只配置了一个定容量的存储器,因此每次运行的追踪量是受到限制的。
ARM的嵌入式ICE(EmbeddedICE)解决方案
ARM在支持这些传统调试工具的基础上,开发了全新的调试方案,希望解决传统工具无力解决的问题。为了简化调试过程,这种新的解决方案并没有限定于某一硬件或软件开发,而是一种面向系统调试的整体性方案。
EmbeddedICE结构体系包括:
● 一个与EmbeddedICE兼容的ARM核(如:ARM7DI),带有边界扫描接口和调试功能增强;
● 一个外部EmbeddedICE接口盒,连接开发主机和ARM内核;
● ARM SDT2.01主机软件开发和调试工具。
EmbeddedICE是一个面向ARM微处理器的JTAG的调试通道。它为ARM 的Windows工具包和嵌于ASIC中的ARM微处理器提供一个接口。
EmbeddedICE具有诸多ICE功能,例如实时寻址、断点、单步、对ARM CPU的完全控制、对ASIC系统其余部分的访问,以及对主机显示器外设的访问、键盘输入和磁盘存储。后三者保证了开发人员能够从目标向主机发送调试信息,并显示在主机屏幕上。
ARM EmbeddedICE解决方案的优势在于:
● 无需ICE 接点或串行接口等目标资源或特殊硬件。在目标系统中无需专门用于调试的RAM、ROM和特殊软件(因此,目标系统中的软件不必修改,可直接与ARM EmbeddedICE体系兼容);
● 边界扫描引脚可复用,不用增加引脚数量;
● 成本低廉,不需要专门的ICE芯片;
● 可以在系统最高速度下进行调试;
● 完全的主机系统访问,包括屏幕、键盘、目标存储等;
● 无需移动处理器 。这解决了许多问题,例如昂贵的接点、性能不稳定和电路电气特性的改变等等;
● 调试无需另外的通信通道;
● 与任何嵌入式ARM系统兼容;
● 支持多处理器的调试。
一个与EmbeddedICE兼容的ARM7DI宏单元包括一个ARM7内核、少量的内核调试逻辑、一个JTAG测试端口( TAP)控制器和EmbeddedICE宏单元。
EmbeddedICE宏单元包括断点寄存器,后者能够比较地址、数据和控制总线同寄存器内的设置值。若两者匹配,会产生一个断点信号,该信号将被传送到处理器。举个例子来说,当一个特定地址的指令或一个特定的数据值被加载入指定的位置,宏单元就会产生一个断点。
如果在一条指令上设置了断点,当指令到达流水线的执行级时,指令的执行将被中断,处理器进入调试状态。然后,处理器和存储系统通过TAP控制器由JTAG进行状态检测。
一旦处理器进入调试状态,它就会停止从数据总线读取指令,并且与存储系统隔离。EmbeddedICE此时就可以通过扫描链1将指令读入流水线、驱动处理器。寄存器和存储内容在调试状态下仍可以进行访问。这个过程是可逆的,用户可以在调试器下把代码下载进存储器,避免了烧写EPROM的不便。
EmbeddedICE在多处理器debug中的使用
EmbeddedICE宏单元提供的调试特征使ARM处理器能够在多处理器环境下进行调试。当ARM处理器遇到一个断点时,它的执行就被中断,控制权通过JTAG接口交由调试器。此时,ARM处理器向存储系统发出一个“调试确认”(Debug Acknowledge)信号,告知后者处理器处于调试状态。
同时,它不再向存储器发出访问请求,保证了其它处理器或者DMA通道继续工作、继续与存储系统通信。在调试过程的最后,ARM处理器会发出一个“存储请求”(memory request)信号,系统控制器将根据此信号对存储系统作出仲裁。
EmbeddedICE 接口盒
EmbeddedICE 接口盒在ARM软件工具包的调试器协议和JTAG协议之间执行协议转换。“在这个地址上设立一个watchpoint”之类的要求被转换成JTAG TAP控制器状态转变序列、指令和数据序列。
协议转换器可以根据不同的目标系统进行配置,例如,对含有不同扫描链布局的ARM7DI,也可以进行配置。
EmbeddedICE宏单元同时支持通信通道。通信通道在目标系统上提供了一个类UART的串行端口。它与处理器紧密相连,且不需要额外的引脚,因为它复用了JTAG口的引脚。这种方法需要在目标系统上安装软件而不需要UART。
程序开发过程
程序是在运行ARM WindowsTools 2.0的PC主机开发的。这个工具包含有编码所需的C语言编译器、汇编程序和连接器。
微软Windows平台下的窗口调试器以及Unix和DOS下的命令行调试器一起提供了调试支持。这些工具能提供完全C源代码或汇编语言级的调试。ARM的调试器既可以在指令精确模拟器(ARMulator)又可以在目标硬件上进行代码调试。软件模拟与真实芯片之间的转换只需在对话框中的轻轻一点即可。软件工具界面继续保持不变,用户可以无阻碍地在各目标之间切换。
ARMulator经过配置,可以为存储器分段指定不同的速度来仿真目标硬件。设计人员可以通过使用C 的建模工具,来对存储器配置中三个最重要的因素:速度、空间和功耗进行优化。
ARMsd是一个符号调试器,用户可以用它设置断点(指令读取阶段)和观察点(数据加载和存储阶段)、检测和修改处理器及存储器的状态。无论调试对象是芯片还是ARMulator,这个过程都能独立完成目标程序中的semihosting也能够被支持。这意味着包含ANSI C 库函数的程序可以直接移植到目标,无法被目标支持的请求将被主机中途截取。例如:C 库函数发出将状态信息显示在屏幕的请求被中途截取,这些信息将显示在主机的屏幕上。
结语
调试工具多种多样,它们各自具有不同的功能和价格。这些工具对于系统设计者来说,仍是一笔宝贵的资源,但是,随着系统的日渐复杂化和集成化,人们需要与之相适应的新的开发环境。
在系统设计中,处理器内核常常是嵌入在ASIC设计中的,传统的调试方法已不再适用。嵌入式调试体系(例如:ARM调试体系)成为了把握当今复杂系统市场的关键。
要保证产品在最短的时间内完成开发,一个完整的测试和调试环境是必需的,其中包括初始产品测试、系统设计仿真、最终产品测试等一系列调试工具。