ARM JTAG仿真器调试方法之FLASH篇

一般状况下,咱们并不推荐在FLASH中进行程序调试,这是由于相对于其余调试方法而言:sass

       1)将程序下载到FLASH中的速度较慢,操做也较复杂;函数

       2)程序在FLASH中的运行和调试速度较慢;工具

       3)对FLASH频繁擦写会缩短FLASH的使用寿命。spa

       但某些状况下,必需要在FLASH中进行程序调试,这是由于在实际的系统中,代码老是固化在FLASH中,在FLASH中运行程序更能反应程序的实际状况。例如如下情形之一:调试

       1)程序在SDRAM中调试经过能够正确运行,而下载到FLASH中却运行异常;code

       2)使用AXD调试有中断服务例程的程序。orm

       本文主要简单介绍基于AXD使用JTAG仿真器(Banyan-UE)在FLASH中调试程序的基本方法。主要步骤以下:xml

       1)将二进制映像文件(调试对象)下载到FLASH中。对于PXA270,使用外部FLASH存储器,可以使用FlashWrite软件进行烧写。对于一些有内部FLASH的芯片如LPC21xx系列,还能够将.axf或其余格式的映像文件加载到内部FLASH进行调试。对象

 

 

   2)使用fromELF工具生成映像文件的反汇编代码,具体作法是:在CodeWarrior中对工程进行设置,在Edit->DebugRel Settings...ARM fromELF一页中选择Output format“Text information”,选中“Disassemble code”(这样fromELF工具就能够根据映像文件生成反汇编代码等信息,还能够选上Print symbol tablePrint object size等),并在Output file name一栏指定输出到某一文本文件。本文使用这种方法,设置的对话框以及输出文件的部份内容以下图所示。 排序

这主要是为了帮助咱们找到反汇编代码与源文件的对应关系,特别是一些符号值以及子程序入口地址(函数名)。生成的反汇编代码相似下图示例:

 

ARM fromELF生成的反汇编代码还能够看出,连接器是按照输入段的属性对其在映像文件中进行排序的,Section #1’ER_RO’RO段,其中又按RO_CODERO_DATA的顺序来排列),Section #2’ER_RW’RW段),随后为’ER_ZI’段(若是有的话),再后面是调试信息的相关段。

3)从开始菜单启动AXD——对于使用外部FLASH存储器的平台如PXA270,注意不要在CodeWarrior中的工程管理窗口启动AXD,这样AXD会自动试图加载该工程对应的映像文件(.axf格式),这并不能保证与FLASH中的映像文件相一致,还可能引起其余问题。

4)在AXD中进行必要配置。假设已经在“Options->Configure Target...”中配置好JTAG仿真器。还必须对目标处理器进行配置,选择Options->Configure Processor...,以下图。

对于调试中断服务例程,一般要在中断服务程序入口处或IRQ/FIQ异常处理程序入口处设置断点,以观察程序是否进入了中断以及进入中断以后的运行状态。断点分为硬件断点和软件断点两种。软件断点的数目没有限制,而硬件断点只能有2个,这是ARM处理器的特性所决定的。设置Watchpoint、在FLASH空间设置断点、在不存在的地址空间设置断点(例如MMU使能前的虚拟地址空间),都会占用硬件断点;另外若是0地址对应的空间为FLASHVector CatchSemihosting也会占用硬件断点。所以,在上面的设置中,咱们将Vector Catch所有clear,而且不使用Semihosting机制。

提示:Vector catch选项中的各项实际上分别对应于ARM处理器的7种异常,若是勾选了某项例如“I”(对应IRQ),则表示发生IRQ异常时,由调试器来响应,这时AXD会弹出一个提示对话框,告诉咱们检测到IRQ异常。所以,若是要调试IRQ中断程序,必定不能勾选“I”,这样调试器就不会捕捉目标处理器的IRQ异常并做出响应,而是由目标处理器本身来响应IRQ异常中断。

5)从AXD菜单“Execute->Show Execution Context”打开FLASH中映像文件的反汇编代码,如图:

 

这时蓝色箭头指向0x0处的第一条语句,即跳转到Reset_Handler的入口。

这时,就能够对照第(2)步中使用fromELF工具生成的映像文件的文本信息(特别是反汇编代码)来进行程序调试了。

6)另外还须要注意的是,应慎用“Processor Views->Memory”窗口,虽然Memory窗口是咱们在调试过程当中的得力助手,不过默认状况下,因为会自动单步刷新或定时刷新Memory窗口的内容,所以调试器会试图读目标平台的Memory,这样可能会读到某些存储器映射的寄存器,而对某些特殊的中断标志寄存器进行读操做会清除其中的中断标志,致使没法进入中断或者影响程序的调试工做。

在确保不会对程序的运行及调试产生影响的状况下,或者对Memory窗口的刷新进行了正确设置,使用Memory窗口是颇有帮助的。相关设置能够在Options->Configure InterfaceTimed refresh一页或者Memory窗口右键菜单Properties...对话框中进行。在AXD主菜单Windows下拉菜单中也能够对Timed Refresh进行开关控制,还能够人工进行Refresh All