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

http://blog.chinaunix.net/u/26710/showart_293962.html

通常情况下,我们并不推荐在FLASH中进行程序调试,这是因为相对于其他调试方法而言:

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

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

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

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

       1)程序在SDRAM中调试通过可以正确运行,而下载到FLASH中却运行异常;

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

 

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

       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

 

你可能感兴趣的:(Driver,flash,汇编,vector,output,工具,存储)