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