1、ADS(AXD) 调试之我见 以前用 ADS(AXD) 进行 ARM 调试时遇到不少莫名其妙的问题,一会可以一会又不成,昨天跑的好好的,今就跑掉,当时感觉就是 ADS 这个工具不好用。最近有接触了一下 ADS(AXD)调试,觉得其实是以前不太会用,没 adptor 他的性情。总结一下吧:1. AXD 调试没有什么特别的,他的工作原理是将编译好的运行时映像 download 到 ARM相应地址中去,然后捕获 arm 的 PC 强制其到 ADS 中 entry point 所设置的映像入口地址上,然后你一点击 run,pc 就从这个入口地址取指,后面该咋执行就咋执行去了。实际代码的硬件运行环境就是
2、 ARM 芯片的运行环境。首先要明确一点的是 ADS(AXD) 在线 debug 时要将编译好的运行时代码 download 到ARM 的相应地址上去,这里这个 download 的地址,就是 arm 上存储部件的地址,必须是RAM 型的存储特性才可以被 AXD 进行 download,如果这个地址域被映射成是 Flash 存储器,AXD 是 download 不了的,虽然 AXD 不报错,但可以通过在 AXD 下用 dissambly 查看一下,如果是 flash 则看不到正确的指令。2.正确 download 之后就是执行程序了,一般外扩 SDRAM 要有对它时序的配置,这里用AXD 调试
3、注意一点当用外部 SDRAM 进行 download 程序时,比如说刚复位过的 ARM,extern SDRAM 这时还没有对他进行时序配置,这时用 AXDdownload 到 SDRAM 的话可能会有问题,(AXD 是通过 jtag 口在通过 sdram 把 code 放到 sdram 上去的,如果不在 axd 加载 code 前实现配置好 sdram 时序就无法保证加载的正确性,和运行时的正确性,)运行会产生什么异常指令之类的怪现象。sothat ,定要给 AXD 提供一个已经配置好时序确实可用的 SDRAM 这样才能保证 download。3. 正确进行 AXD download 后,接
4、下来就是执行代码了 , 这里也有要注意的事情,就是,代码里不要有再次对 SDRAM 进行时序配置的指令出现,这就好比,程序已经在 SDRAM里运行了,然后在运行的过程中又对 SDRAM 进行了配置,这会出现什么异常之类的怪现象的。4.能运行了,后面要想再跑一遍程序,不要用 AXD 的“reload current image“ 进行reload,最好把 AXD 关掉,然后点 ADS 的 debug 按钮以重新 download 的方式加载映像。感觉上 AXD 的“reload current image“ 还是会破坏 ram 运行时环境的,我指的是和时序相关的运行环境。重新 download
5、不会破坏 bootloader 所建立的 SDRAM 运行环境。5. 可以实现烧一个 bootload 代码让他脱离 ADS 就可运行的那种,在这个 bootloader 里为AXD 做好 RAM 存储域 的 remap 和 SDRAM 的配置,然后用 ADS(AXD)加载映像时 SDRAM 已经就是一个可用的 SDRAM 了, (硬复位bootloaderAXD 截获 cpuPC to image entry point).if 不去 bur 这样的 bootloader 代码,也可以先用 AXD 把一个类似于 bootloader 功能的code download 到ARM 内部 ram
6、中去(internal ram 不用配置时序之类的随时可用) 完成对 sdram 的配置 和 SDRAM 的 remap然后再用 AXD 将要调试的 code download 到这个已经配置好的 SDRAM 上去,这种方式也可以。xx. 还有就是在调试有中断的代码时,要注意 ram remap 到 0x00000000 地址然后重构中断向量表,犯过的一个错误是,在 0x00000000 重构了中断向量表,但是没有先把 sdram remap 到0x00000000 地址,实际填充的 flash 区,当然是写不进去的. cpu 发生中断的跳转地址永远是 0x00000000 - 0x00002
7、0。这与用不用 AXD 没有关系,AXD 不会干预 CPU 中断时 PC 的强跳转到 0x00000000-0x00000020 的特性。xx Processor ARM720T raise a exception cause : the processor was reset这个是 AXD 检测到 PC 指针跳到 0x00000000,从 0x00000000 取指执行 后产生的东东, 一般正常运行情况下 PC 只会产生其他 7 种异常(watch dog 例外). 当 pc 跳转到0x00000000 取指执行时会被 AXD 截获作为异常处理而弹出上面的终止框. (ex. mov pc,#
8、0x0 这样的指令在 AXD 下全速运行时就会引起上面的终止) 其实有时用户就是想要在AXD 监视下仍能使 PC 模拟复位的状况从 0x00000000 执行程序,这样的话可以将 AXD-optionconfigurate processor 对话框中的 vector catch 选项的R 选项去掉. 这个选项就是 AXD 用来监视 PC 从 0x00000000 取指时产生终止的功能 。把它去掉,这样就可以在 AXD 下顺利模拟 PC 从复位(0x00000000)来取指执行了。/其他几个选项是:Table 4.5. BreakpointsVector DescriptionR ResetU
9、 Undefined instructionS Software interrupt (SWI)P Instruction prefetch abortD Data access abortA1 Address exceptionVector DescriptionI Interrupt request (IRQ)F Fast interrupt request (FIQ)E2 Error1 Not used by AXD.2 Not used by AXD or ADW.写了这么多,其实最本质的东西就是,一定要为 AXD 建造一个合适的 RAM 运行环境,很多异常的发生都与这个有关。没有给他合适的运行环境。