/**************************************************************************
** 标题: 使用ADS调试bootloader
** 作者: ProEmbedded & 韦伯嵌入式开发网
** 发布日期: 2011-2-12
** 最后修改: 2011-2-12
** 注意事项: 转载需注明出处,且转载过程中不得修改、删除文章中的任何内容;
** 未经作者同意,商业网站不可转载
**************************************************************************/
所谓使用ADS调试WINCE的BOOTLOADER,实际上是用到ADS的调试工具AXD,当然其它的一些ARM开发平台也可以。
BOOTLOADER虽然不复杂,但是却是WINCE、LINUX等系统运行的前提保证,只有BOOTLOADER运行了才能进行后续的OS启动,而很多人对BOOTLOADER的调试很头疼,其实BOOTLOADER调试并没那么复杂。
既然是做WINCE或者LINUX的移植,那么首先拿到一套BSP是必须的,而这个BSP通常是针对某个平台可以正常运行的,BOOTLOADER功能相对简单,开发者只是根据自己的产品做些代码的修改,当自己修改的BOOTLOADER不能正常运行的时候完全可以借助,AXD来进行调试,而必需的工具是一个JTAG,调试ARM9可以使用并口的H-JTAG,ARM11可以用盗版的JLINK-V8等。
(原帖地址:http://www.veabol.com/thread-56-1-1.html,转载请注明bm)
当系统运行异常时不要断电,将JTAG连接好,启动AXD,这个时候就可以查看当前的PC值,然后进行单步运行,追踪问题。
假如无法连接JTAG,则可能系统出现了比较严重的异常等,导致CPU无法正常连接JTAG,这个时候可以找一段确保无误的代码,在其后边加入死循环while(1),(比如,你确认第N个函数执行正常,当执行第N个函数之后的代码时出现异常,那么便可以在第N个函数中加入死循环),下载到电路板上后运行死循环便会停住,此时查看当前的PC值比如,0x00000228,然后通过AXD的命令窗口将PC值置到下一句代码的位置,如setpc 0x0000022C,然后再音步执行,这样就可以继续查问题了。
这种调试方法需要一定的汇编语言分析能力,因为通过AXD查看的内容全是经过机器码反汇编出来的,但是源代码是自己编写的,对照着源代码分析是可行的,所以这个方法对于调试BOOTLOADER十分有用。
注意:while(1)之后的语句可能被优化掉,所以可以采取另一种方式,定义一个变量 i,在函数中将i = 1,然后在需要的地方加入while(i)就可以了。