摘要:在数字信息技术和网络技术高速发展的今天,嵌入式系统已经广泛地渗透到人们的日
常生活等方方面面中。而在嵌入式系统开发流程中调试是一个相当重要的环节.调试器是衡
量一个系统开发环境优劣的重要因素。嵌入式系统的特点决定了发过程中交叉调试的必然性。
本论文的主要工作是对当前两种主流的交叉调试技术即目标监控程序调试技术和片上调试
技术进行研究与实现,之后对目前在嵌入式系统开发中常用的硬件调试方法ICE、BDM、JTAG
的实现原理、系统结构作了详细的分析。在目标监控程序调试技术方面,根据Windows
目标监控程序调试技术的总体框架对几个主要组成部分的具体实现进行详细地阐述。在片上
调试技术方面,根据JTAG 片上调试技术的总体框架对各个组成部分进行具体实现。
关键词:交叉调试, ICE,JTAG
1、 嵌入式系统的概述和各种调试手段
对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理
器、外围硬件设备、嵌入式操作系统以及运行在嵌入式操作系统上的执行特定功能的各种应
用软件四个部分组成。一个嵌入式系统通常涉及对硬件的直接控制,并限于某些特定的功能。
入式应用程序。硬件抽象层将系统上层软件与底层硬件分离开来。使系统的底层驱动程序与
硬件无关,上层软件开发人员无需关心底层硬件的具体情况,根据硬件抽象层提供的接口即
可进行开发。当操作系统或应用程序使用硬件抽象层API 进行设计时。只要硬件抽象层API
能够在下层硬件平台上实现,那么操作系统和应用程序的代码就可以移植。
试的基本保障。如果不能确定硬件平台的正确性,调试过程中就不知道是软件系统出错还是
硬件系统的错误。所以我们在调试软件系统的时候要尽量确保硬件系统模块的正确性。针对
目标平台上的各个硬件模块,我们通常采用逐一测试调试的方法进行,通过常用的电子元件
的测试仪器,像万用表、示波器等进行电气参数的测试与调试。
的。主要包括错线、开路、短路。排除的方法是首先将加工的印制板认真对照原理图.看两
者是否一致。应特别注意电源系统检查,以防止电源短路和极性错误,并重点检查系统总线
(地址总线、数据总线和控制总线)是否存在相互之间短路或与其它信号线路短路。必要时利
用数字万用表的短路测试功能,可以缩短排错时间。
另一个是由于安装错误,造成器件烧坏。可以采取检查元器件与设计要求的型号、规格和安
装是否一致。在保证安装无误后,用替换方法排除错误。
成集成块损坏。加电后检查各插件上引脚的电位,一般先检查 VCC 与CND 之间电位,若在
5V~4 .8V
系统中的集成块发热损坏。
序是否正确,逻辑和结果是否与设计要求相符,能否满足功能和性能要求等。软件调试的方
法有很多。包括:
----------------------- Page 2-----------------------
把调试软件下载到目标板上运行。这种调试方法的限制条件是要在开发平台和目标平台之间
建立起通信联系( 目标板上称为监控程序),它的优点是成本价格较低、纯软件、简单、软件
调试能力比较强。但软件调试需要把监控程序烧写到目标板上,工作能力极为有限。
运行,由主机提供一个模拟的目标运行环境,可以进行语法和逻辑上的调试与开发。
ARM
AXD 能够装载映像文件到目标内存,具有单步、全速和断点等调试功能,可以观察变量、寄
存器和内存的数据等,同时支持硬件仿真和软件仿真 ARMulator 。ARMulator
种脱离硬件调试软件的方法,它与运行在通用计算机(通常是x86 体系结构)上的调试器相连
接,模拟 ARM 微处理器体系结构和指令集,提供了开发和调试ARM 程序的软件仿真环境。
ARMulator
围设备,例如中断控制器和定时器等,这样就模拟了一个进行嵌入式开发的最小子系统,另
外使用者还可以扩展添加自己的外设。这种调试的优点是简单方便、不需要开发板的硬件平
台的支持、成本低,但它不能进行实时调试.功能非常有限
试嵌入式系统的手段。这种方式用仿真器完全取代目标板上的 MCU,所以目标系统对开发
者来说完全是透明的、可控的。仿真器与目标板通过仿真头连接,与主机有串口、并口、网
口或 USB
连接目标板。实时在线仿真应用如图4 所示。在不同的嵌入式硬件系统中,总会存在各种变
异和事先未知的变化,因此处理器的指令执行也具有不确定性,也就是说,完全 一样的程
序可能会产生不同的结果,只有通过ICE 的实时在线仿真才能发现这种不确定性。最典型的
就是时序问题。使用传统的断点设置和单步执行代码技术会改变时序和系统的行为。可能你
使用了断点进行调试,却无法发现任何问题,就在你认为系统没有问题而取消后时序问题又
出现了,这个时候就需要借助ICE,因为它实时追踪数千条指令和硬件信号。实时在线仿真
的优点是优点功能强大,软硬件均可做到完全实时在线调试,缺点是价格昂贵。
方法,因为ARM 处理器中集成了JTAG 调试模块。调试主机上必须安装的工具包括程序编辑
和编译系统、调试器和程序所涉及的库文件。目标板必须含有J ,I'AG 接口。在调试主机和
目标板之间有一个协议转换模块,一般称为调试代理,其作用主要有两个:一个是在调试主
机和目标板之间进行协议转换;另一个是进行接口转换,目标板的一端是标准的JTAG 接口,
而调试主机一端可能是RS 一232 串口。也可能是并口或是USB 接口等。调试系统结构如图
3 所示。JTAC 仿真器比较便宜,比较方便,通过现有的JTAG 边界扫描口与ARM 处理器核通
信,属于完全非插入式(即不使用片上资源)调试,它不需要目标存储器的干预。也不占用目
标板上的任何端口,而这些条件是驻留监控软件所必须的。另外。因为ⅡAG
在目标板上执行的,仿真效果更接近于目标硬件,因此,对于一些高频的操作限制、接口操
作问题、AC(交流)和DC(直流)参数不匹配。电线长度的限制等被最小化了。我们使用集成开
发环境配合JTAG
何监控程序,软件硬件均可调试,可以重复利用JTAG 硬件测试接口,可以在RAM
断点外,还可以在ROM 中设置断点。但她仅适用于有调试接口的芯片。
2、 交叉调试技术
全,所以要在嵌入式设备上建立一套开发系统是不现实的。在开发嵌入式系统时,一般都采
用交叉开发(Cross Developping) 的模式,即:开发系统是建立在硬件资源丰富的Pc 机(或者工
----------------------- Page 3-----------------------
作站)—h,通常称其为宿主机(Host),应用程序的编辑、编译、链接等过程都是在Hast 上完
成的,而应用程序的最终运行平台却是和Host 有很大差别的嵌入式设备,通常称其为目标
机(Target),调试在二者间联机交互进行。
2.1 交叉调试原理及特点
的差别。普通的高级语言调试器一般与被调试的二进制代码运行香·同一台计算机和同一个
操作系统上,所以调试器可以直接控N---进制代码的执行过程。交叉调试器则是一种分布式
的系统,交叉调试器自身运行在宿主机端,而被调试的可执行代码运行在目标机端,宿主机
和目标机的体系结构和操作系统可能完全不同,调试器要直接控制代码的执行是非常困难的
事。因此,宿主机和目标机必须使用某种通信协议进行通信,调试程序使用这种通信协议把
调试命令从宿主机发给目标机;在目标机端必须有一个监控程序,根据宿主机的调试命令在
目标机上执行相应的调试功能,并且把调试结果送回宿主机端显示出来。由此可见,交叉调
试具有如下特点…:
上(即Host 上),而被调试程序运行在实际的某种嵌入式设备或者专业的评估板上(都被称为
Target) 。
专用的通信方式。
标机上运行的程序的调试。这种代理可以是某种软件,也可以是某种支持调试的硬件等。
台计算机。但是调试方式的本质没有变化,即被调试程序都是被下载到了目标机,对被调试
程序的调试并不是直接通过Host 的操作系统的调试支持来完成的,而是通过虚拟机代理的
方式来完成调试。
式,并且通过调试器能查看和修改目标机上的内存、寄存器以及被调试程序中的变量等功能。
2.2 交叉调试方法
1)Rom Monitor(ROM 监控)方式
2)Rom Emulator 方式
3)In—Circuit Emulator(在线仿真器)方式
4)on—Chip Debugging(片上调试)方式
5)simulator 方式、
3、 在线仿真器
3.1
标机上的处理器或MCU,其功能与被代理的目标机算计处理器完全一样,但是他能产生外
部电路所需要的信号,同时捕获外部的所有信号,以满足用户就可以查看处理器内部的数据
或代码并控制CPU 的运行。(图为主机、ICE 和目标机系统之间的典型连接关系)
----------------------- Page 4-----------------------
3.2
法是,将用户的待调试程序存储在仿真板外部的SRAM
控硬件(外部仿真逻辑)通过监视和控制仿真接上信号,来获取MCU 的状态,干预MCU 的运
行,实现调试功能。
通常包括仿真使能信号,bond。Out
以及少数几个用于仿真的控制信号。仿真接口是MCU 与外部仿真逻辑之间的桥梁,使得外
部仿真逻辑能够监控MCU 的内部状态。
MCU 中CPU
是 MCU
仿真接口模块负责对仿真接口所需的 CPU
制信号如地址锁存信号,并接收来自外部仿真控制器的控制信号等。这样就需要在原有芯片
设计上作些修改,包括bond.out 信号的引出、寄存器的读写控制等。
的仿真接口,控制仿真器的工作状态。
----------------------- Page 5-----------------------
20 字节的 RAM
就是所谓的“全透明仿真”,它能够在不消耗目标系统的任何资源的前提下,例如:不消耗
目标系统的堆栈空间和内存空间、不影响目标系统上的代码执行速度等,查看目标机的内部
信息。这一特点对于调试实时应用来使非常重要的。
程序流偏转到调试器上。硬件断点对于不同的嵌入式处理器和不同的调试工具而言,其实现
方法以及所实现的断点数量是不一样的。硬件断点一般有特殊的逻辑监测程序或者数据的地
址总线,如果发现符合了就暂时停止处理器或者给处理器返回一条跳转指令,跳到监控程序
去。因此而硬件断点则只需要设置一个指令的地址(或其他参数) ,程序执行到这个地址
时自动切换到中断。如上面提到的断点模块,将 CPU
应值比较,这里不需要修改任何程序存储器内容。但是软件断点仍然是很方便、有用的,一
般的仿真器两种断点功能都提供。当用户的目标程序存放在ROM 中时,软件断点就显得无
能为力了,因为无法插入TRAP 指令。对于ROM 程序存储器系统,只能使用硬件断点。
调试手段。所谓跟踪就是记录被调试程序的执行过程,以便开发人员分析导致应用程序出现
问题的原因,跟踪的记录方式有先进先出方式和压栈方式两种。先进先出方式总是记录应用
程序停下来之前最新的运行过程。在先进先出方式下,如果跟踪记录缓冲被填满的话,最先
跟踪的记录就要丢弃,以便填充心得记录。压栈方式则记录跟踪开始到记录缓冲被填满这段
时间内应用程序的运行过程。在压棱方式下,如果跟踪记录缓冲填满的化,新的应用程序执
----------------------- Page 6-----------------------
行过程将不被记录。跟踪功能对于调试实时功能特别有用,可以用束捕捉中断服务例程ISR
的每一个运行实力的执行过程,但喜好不影响 ISR
Monitor 没有跟踪存储器,也不能实现Trace 功能。
进行某个预先设定的行动,触发条件可以包括地址、数据、时钟周期和外部信号,这些条件
可以触发一个断点、启动/停止跟踪记录、记录个时间标记、以及很多其它由仿真器功能所
决定的行动。这种强大的工具只有在仿真器中才能实现。条件触发功能与跟踪功能结合起
来~起使用。
的内容,而不仅仅是软件模拟。在很多情况下我们可能已经发现,好像只有在接入实际的硬
件系统后某些问题才开始出现。采用仿真器能够使你从一开始就进入这一阶段,从而及早地
发现问题、更快地完成调试任务。因为仿真器内部自带的RAM 可以和目标系统中的ROM 互
相替代,所以你在ROM
标系统中还没有装上存储器时,可以使用仿真器中的仿真存储器对系统进行调试。仿真存储
器的大小、映像地址可以由用户选择。在线仿真器优点显著,但缺点也同样突出。首先其价
格十分昂贵。其次.随着 CPU
度的仿真器,就要采用更快的时钟频率,这样困难度也越来越大。另外,将CPU
同 附属设备封装在一起已十分普遍,这样带来的结果是变种太多,仿真器厂家难以一一实
现,而且封装之后的插针已经不能反映CPU 的情况。
4、 基于JTAG
4 .1 总体框架
图显示的是基于JTAG
----------------------- Page 7-----------------------
的实现精髓就在于ARM 处理器核有两种状态:系统状态和调试状态,而片上调试逻辑可以
完全控制CPU 核的状态转换。系统状态就是CPU 正常的运行状态,运行在主机上的调试软
件可以请求片上调试逻辑将处于系统状态的处理器核转换到调试状态下。当ARM 处理器位
于调试状态下时,用户就可以使用片上调试逻辑中的JTAG 扫描链向CPU 核的指令管道中插
入指令,并控制指令在 CPU
核和目标系统的当前上下文状态(包括寄存器、内存单元等) 。
有简单、通用和很高的可扩展性、移植性,为后续开发提供了良好的调试支持。
5、 小结
的多样化和更新速度的提高在带来开发软件复杂度提高的同时要求缩短开发周期,这就需要
对交叉调试技术进行深入研究,为嵌入式开发提供良好的调试支持。