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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值