摘要:在嵌入式开发调试中,开发人员的调试手段包括断点、触发和跟踪三种。随着集成电路技术的发展,新一代的嵌入式处理器集成度和工作频率越来越高,芯片封装形式也越来越趋向表贴化。本文描述了
逻辑分析仪在嵌入式开发调试中的应用,以飨读者。
在嵌入式开发调试中,开发人员的调试手段包括断点、触发和跟踪三种。随着集成电路技术的发展,新一代的嵌入式处理器集成度和工作频率越来越高,芯片封装形式也越来越趋向表贴化。在线调试器(ICD)与逻辑分析仪的组合开发调试平台越来越多地成为广大的新一代嵌入式处理器的开发人员实现上述三种调试手段的。
开发人员使用断点功能控制所调试的应用程序的起和停。使应用程序运行到自己想要调试的程序上。通过观察在断点处的应用程序的变量以及寄存器和存储器的值检测所调试的应用程序运行是否正确。断点是开发人员经常使用的调试手段。
断点,顾名思义就是(应用程序)停下来的地方。断点按照其实现方法分为软件断点和硬件断点。软件断点是靠程序指令陷阱来实现的。硬件断点是靠嵌入式处理器或调试工具硬件来实现的。软件断点的实现方法对于不同的嵌入式处理器和不同的调试工具而言,实现方法都是一样的,都是通过修改程序指令的方法实现的。硬件断点的实现方法对于不同的嵌入式处理器和不同的调试工具而言,实现方法是不一样的。有的嵌入式处理器具有片上调试逻辑,调试工具通过JTAG、BDM、OCDS、NEXUS等接口访问控制片上调试逻辑,通过片上调试逻辑实现硬件断点。这种硬件断点的数量是有限制的。由于不同的嵌入式处理器上的调试逻辑实现方法不同,因而它们提供的硬件断点的数量是不一样的。在线调试器(ICD)就是通过访问控制片上调试逻辑实现硬件断点的。没有片上调试逻辑的嵌入式处理器不能使用在线调试器。在线仿真器(ICE)通过基于存储器的断点技术实现硬件断点。在线仿真器实现的硬件断点的数量是没有限制的。对于没有片上调试逻辑的嵌入式处理器,可以考虑用在线仿真器(ICE)进行调试。
单步是断点的一种特殊形式,它相当于在下一条指令或程序行上设置一个断点,程序启动运行到断点停下来。
触发用于捕捉所调试的应用程序在运行中出现的某一特定目标状态。这一特定的目标状态就是通常所说的触发条件。触发条件通常是处理器的特定的地址、数据、控制总线以及内部/外部信号状态的逻辑组合。当一个触发条件不足以描述要捕捉的目标状态时,开发人员通常会使用触发序列器(Sequencer)将多个触发条件级联起来。调试工具在触发发生之后,要么停止所调试的应用程序的运行,要么增加触发记数器,要么输出一个触发信号,以便通知开发人员,所要捕捉的触发条件已发生。为了便于开发人员观察触发发生之后应用程序的执行情况,调试工具通常会提供触发滞后的功能。触发滞后就是调试工具在发生触发之后仍然使应用程序结续运行一段特定的时间之后才将应用程序停下来。
不同的调试工具对触发功能的实现程度是不一样的。在线仿真器(ICE)绝大多数都可以实现完型的触发功能。在线调试器(ICD)对触发功能的实现程度取决于所调试的嵌入式处理器上的片上调试逻辑。在线调试器(ICD)与逻辑分析仪组合,可以宴现较完整的触发功能。
开发人员通常将触发功能与下面要讲到的跟踪功能一起使用,来捕捉导致应用程序中问题产生自原因。
跟踪就是记录所调试的应用程序的执行过程,以便开发人员分析导致应用程序出现问题的原因。跟踪的记录方式有*先出方式和压栈方式。*先出方式总是记录应用程序停下来之前的运行过程。在*先出方式下,如果跟踪记录缓冲填满的话,zui先跟踪的记录就要丢弃,以便填充新的记录。压找方式记录跟踪开始到跟踪记录缓冲被填满这段时间内应用程序的运行过程。在压栈方式下,如果跟踪记录缓冲填满的话,新的应用程序执行过程将不被记录。跟踪还可以有选择地记录程序的执行过程,例如,只记录函数入口和出口的执行过程。当然,要进行有选择跟踪,开发人员必须对跟踪功能进行设置。
不同的调试工具对跟踪功能的实现方式是不一样的。在线仿真器(ICE)由于其结构的特殊性,它可以捕获到嵌入式处理器的总线周期,它的跟踪记录的zui小单位就是总线周期。在线仿真器(ICE)调试软件译码这些总线周期,倒推出程序的执行过程。在线调试器(ICD)因为不能捕获嵌入式处理器的总线周期,因而决大多数没有跟踪功能。有些嵌入式处理器的片上调试逻辑能够将程序的执行过程信息压缩之后通过特定的接口送到芯片外部,供外部的调试工具使用。这样,在线调试器(ICD)可以通过增加跟踪模块捕获这些信息的方法实现跟踪功能。在线调试器(ICD)调试软件从跟踪模块记录的嵌入式处理器送出来的指令流信息,还原出应用程序的执行过程。基于ARM内核的嵌入式处理器芯片上的ETM接口就是一个这样的接口。通过这种方法实现的跟踪功能的完善程度*取决于片上调试逻辑。
由于逻辑分析仪具有*的逻辑跟踪分析功能,因而它可以捕获记录嵌入式处理器的总线周期,也可以捕获记录来自象ETM这样的接口的程序执行信息,并对这些记录进行分析,译码或还原出应用程序的执行过程。逻辑分析仪通过触发接口与在线调试器(ICD)协调工作,补充在线调试器(ICD)在跟踪功能方面的不足,与在线调试器(ICD)一起为开发人员提供断点、触发和跟踪三种调试手段。
下面以Lauterbach公司的TRACE32-ICD和Tektronix公司的TLA700逻辑分析仪为例,介绍如何将逻辑分析仪与在线调试器组合成开发调试平台,为开发人员提供的断点、触发和跟踪功能。
首先介绍一下Lauterbach公司的TRACE32-ICD。
TRACE32-ICD是在线调试器。它采用模块化的设计,可以支持具有JTAG、BDM、0CDS、NEXUS等调试接口的嵌入式处理器。它可以为嵌入式处理器的开发人员提供断点及触发功能(利用片上调试逻辑)。TRACE32-ICD的调试器软件运行在Windows平台上。TRACE32-ICD通过并口、以太网口、USB口等形式与PC连接。TRACE32-ICD具有触发输入/输出端口,通过它TRACE32-ICD与逻辑分析仪连接。TRACE32-ICD与逻辑分析仪通过该连接相互触发,协调工作。
接下来,介绍一下Tektronix公司的TLA700逻辑分析仪。
TLA700逻辑分析仪除了具有传统的逻辑分析仪的逻辑采集和分析功能之外,是它采用了开放灵活的Windows平台架构,具有串口、并口及以太网等接口。这样一来,基于Windows平台的嵌入式开发调试软件就可以运行在TLA700上。嵌入式处理器的开发人员可以用TLA700搭建嵌入式开发调试平台。另外,TLA700的HLL源码支持功能可以直接分析采用IEEE695、OMFx86、COFF、ELF/Dwarf、ELF/Stabs和ASCII格式的可调试的应用程序。这也为它集成在线调试器,例如,TRACE32-ICD,补充在线调试器在跟踪功能方面的不足奠定了基础。
首先,将TRACE32-ICD的调试器软件安装到TLA700的Windows平台上。将TRACE32-ICD连接到TLA700的串口、并口或以太网口上。将TRACE32-ICD的触发输入/输出端口与TLA700的触发输出/输入端口连接。TRACE32-ICD的调试电缆与目标板上的JTAG、BDM、0CDS、NEXUS等接口连接,用来控制目标板上的嵌入式处理器。TLA700的逻辑探头连接到嵌入式处理器的地址、数据和控制总线上,采集嵌入式处理器的总线周期,或者连接到片上调试逻辑的指令流信息接口(例如,ETM口)上,采集嵌入式处理器执行的指令流信息。由TRACE32-ICD和TLA700组合成的嵌入式处理器高度平台与目标板的连接关系,如图1所示。
在完成了TRACE32-ICD和TLA700以及目标板之间的连接之后,开发人员就可以使用这一组合开发调试平台了。
开发人员首先启动TLA700,等TLA700启动完成之后,再来启动TRACE32-ICD调试器软件。在TRACE32-ICD和TLA700都完成了启动之后,TRACE32-ICD的调试界面和TLA700的逻辑跟踪界面就会分别显示在不同的Windows窗口中。当然,这些显示都在TLA700自带的彩色液晶屏上,或者在TLA700外挂的显示器上。
开发人员开始真正的调试工作之前,还要分别对TRACE32-ICD和TLA700进行设置。当然,这些设置是在TRACE32-ICD和TLA700各自的Windows窗口中完成的。对TRACE32-ICD的设置工作主要完成对目标板上的嵌入式处理器的设备寄存器的初试化,将准备调试的应用程序下载到目标板上的嵌入式处理器的程序存储器空间,定义触
发输入/输出端口的方向。对TLA700的设置工作包括定义逻辑通道,用HLL源码支持功能加载分析TRAC32ICD所下载的可调试格式(IEEE695、OMFx86、ELF/Dwarf、ELF/Stabs和ASCⅡ)的文件,定义触发条件。
接下来,开发人员就可以开始调试他们的应用程序了。
开发人员用TRACE32-ICD设置断点调试程序,用TLA700设置触发条件,并由TLA700完成跟踪功能。
TRACE32-ICD和TLA700如何同步工作呢?这就要借助与TRACE32-ICD和TLA700的触发输入/输出端子了。
当开发人员想要用TLA700的强大的触发功能来捕捉产生某一特殊目标状态的程序时,可以将TRACE32-ICD的触发输入/输出端子定义为输入(可以是高电平或低电平触发),然后,将TLA700所定义的触发条件对应到连接TRACE32-ICD的触发输出端子。开发人员运行程序的时候,如果目标状态出现,TLA700就会产生触发信号送给TRACE32-ICD,TRACE32-ICD在收到这个触发信号之后,它就会将开发人员所调试的应用程序停下来。由于TLA700不停地跟踪记录应用程序的执行情况,这时候,将TLA700停下来,就可以看到产生触发前后应用程序的执行情况。由于TLA有很深的记录存储,开发人员可以观察到很详尽的程序执行情况。
开发人员也可以将TRACE32-ICD的触发输入/输出端子定义为输出,将该信号连接到TLA700的一个触发输入端子,并设置TLA700根据该信号控制跟踪的启动或停止。这样就可以实现跟踪与程序运行同步,使开发人员能够跟踪到程序在调试过程中所有的运行情况。
TRACE32-ICD和TLA700给开发人员提供了灵活的触发设置功能,开发人员可以充分发挥聪明才智来设计复杂的触发条件,来捕捉应用程序中的问题。
在嵌入式系统的开发调试中,开发人员通常会遇到四类问题:逻辑问题、软/硬件相互影响问题、软件实时问题和崩溃问题。应用程序逻辑设计或编码错误或设计假设不正确都属于逻辑错误。指令引起的存储器访问出错,应用程序在运行过程中出现在数据总线上的特定数据格式引起的串扰假信号,这些都是软/硬件相互影响问题。应用程序在单步、端点的调试中都运行正常,而只有在目标系统全速运行的时候才会出问题,这类问题就属于软件实时问题。目标系统在运行中发生系统崩溃,这类问题就是崩溃问题。逻辑问题大约占开发人员遇到的所有调试问题的80%。解决这类问题,开发人员通过在应用程序中设置断点,检查寄存器、存储器、变量等的值来解决。开发人员解决逻辑问题的时间约占解决所有调试问题的总时间20%。而解决其它三类问题所用的时间要占到解决所有调试问题的总时间的80%。这三类问题只靠设置断,点的方法,往往是比较难以解决的。由于产生这三类问题的原因通常都比较复杂,所以,开发人员必须通过触发来捕捉这些问题,然后,再通过跟踪来分析产生这些问题的原因。
传统地,嵌入式系统的开发调试人员通常使用在线仿真器(ICE)来完成端点、触发和跟踪这三种调试手段。随着集成电路技术的不断发展,新一代的嵌入式处理器的工作频率越来越高,封装越来越表贴化。由于在线仿真器要通过仿真探头取代目标系统上的嵌入式处理器来和目标系统连接,所以,在线仿真器对新一代的嵌入式处理器而言,连接是一大问题。嵌入式处理器的设计生产厂商已经认识到这个问题。他们在新一代的嵌入式处理器增加了片上调试逻辑,而访问片上调试逻辑只须不到十根连接线,且时钟频率不高。在采用新一代的嵌入式处理器来开发目标系统的时候,越来越多的开发人员会选择在线调试器加逻辑分析仪形式的组合开发调试平台。