嵌入式 AXD调试经验,使用及问题

来源:互联网 发布:nvidia优化游戏好用么 编辑:程序博客网 时间:2024/05/18 01:25

AXD 使用经验

1、使用AXD进行调试:

AXD不会自动去帮你配置SDRAM,配置SDRAM是用户的事情。AXD只不过提供了命令行,让用户可以配置CPU内部的管理单元。AXD下载的时候,假设用户已经配置好了SDRAM,所以在下载的时候,是用户的责任去确保下载的区域是可写的。所以在AXD中应在运行程序之前让AXD运行一段自动配置SDRAM的指令。

AXD中的VECTOR CATCH的作用,其实VECTOR CATCH的原理就是在相应的位置设置断点,捕捉中断。你在VECTOR CATCH的设置的地方设置了相应的位,就会设置断点。

在AXD中可以随意设置PC。下载到RAM中设定PC为0x30000000(64SDRAM,s3c2440时)如果你想让程序从地址0x0开始执行,你可以在AXD里自己设定PC的值,不过你自己要保证从地址0x0能取到有效的指令

2、1. AXD调试没有什么特别的,他的工作原理是将编译好的运行时映像download到ARM相应地址中去,

然后捕获arm 的PC 强制其到 ADS中 entry point 所设置的映像入口地址上,然后你一点击run,pc就从这个入口地址取指,后面该咋执行就咋执行去了。实际代码的硬件运行环境就是ARM芯片的运行环境。

首先要明确一点的是ADS(AXD) 在线debug时要将编译好的运行时代码download到ARM 的相应地址上去,这里这个download的地址,就是arm上存储部件的地址,必须是RAM型的存储特性才可以被AXD进行download,如果这个地址域被映射成是Flash存储器,AXD 是download不了的,虽然AXD不报错,但可以

通过在AXD下用dissambly 查看一下,如果是flash则看不到正确的指令。

3、正确download之后就是执行程序了,一般外扩SDRAM要有对它时序的配置,这里用AXD调试注意一点

当用外部SDRAM进行download程序时,比如说刚复位过的ARM,extern SDRAM这时还没有对他进行时序配置,这时用AXDdownload到 SDRAM的话可能会有问题,(AXD是通过jtag口在通过sdram把code放到sdram上去的,如果不在axd加载code前实现配置好sdram时序就无法保证加载的正确性,和运行时的正确性,)运行会产生什么异常指令之类的怪现象。sothat ,定要给AXD提供一个已经配置好时序确实可用的SDRAM 这样才能保证download。

正确做法是:在AXD界面内执行菜单Options/Configure Interface/Session File,选择Run Configuration Script,单击Browse,找到该初始化脚本.注意,初始化脚本"2440init.txt"必须放在英文目录下.在AXD界面内的Command Line Interface,可以看到AXD是否运行了该初始化脚本,初始化脚本的内容为(micro2440 ):

Setmem 0x53000000 0x00000000 32
Setmem 0x4A000008 0xFFFFFFFF 32
Setmem 0x4A00001C 0x000007FF 32
Setmem 0x53000000 0x00000000 32
Setmem 0x56000050 0x000055AA 32
Setmem 0x4C000014 0x00000007 32
Setmem 0x4C000000 0x00FFFFFF 32
Setmem 0x4C000004 0x00061012 32
Setmem 0x4C000008 0x00040042 32
Setmem 0x48000000 0x22111120 32
Setmem 0x48000004 0x00002F50 32
Setmem 0x48000008 0x00000700 32
Setmem 0x4800000C 0x00000700 32
Setmem 0x48000010 0x00000700 32
Setmem 0x48000014 0x00000700 32
Setmem 0x48000018 0x0007FFFC 32
Setmem 0x4800001C 0x00018005 32
Setmem 0x48000020 0x00018005 32
Setmem 0x48000024 0x008E0459 32
Setmem 0x48000028 0x00000032 32
Setmem 0x4800002C 0x00000030 32
Setmem 0x48000030 0x00000030 32

可以把这保存为.txt格式的,然后放在没有中文的目录下,在用刚才那样导入进去就行了。在ads中点击调试后,如果SDrAM被配置过了,在axd的command line中会出现

4. 正确进行AXD download 后,接下来就是执行代码了, 这里也有要注意的事情,就是,代码里不要有再次对SDRAM进行时序配置的指令出现,这就好比,程序已经在SDRAM里运行了,然后在运行的过程中又对SDRAM进行了配置,这会出现什么异常之类的怪现象的。但全速运行可能没事。

5.不要用AXD的"reload current image" 进行reload 可以通过设定PC指针:setpc 0x30000000 在command line中让程序从起始处执行

6.cpu 发生中断的跳转地址永远是0x00000000 - 0x000020。

对于发生其他的几种异常也是这样,当发生了这些异常后,cpu的pc指针就自动指向此处,在这些地址通常放一些跳转指令,跳转到真正的中断程序或者其他异常处理程序。(对于2440来说是这样)


AXD 运行错误;

1.Processor ARM720T raise a exception cause : the processor was reset

这个是AXD 检测到PC指针跳到 0x00000000,从0x00000000 取指执行 后产生的东东, 一般正常运行情况下PC只会产生其他7种异常(watch dog 例外). 当pc跳转到0x00000000 取指执行时会被AXD截获作为异常处理而弹出上面的终止框. (ex. mov pc,#0x0 这样的指令在AXD下全速运行时就会引起上面的终止) 其实有时用户就是想要在AXD监视下仍能使PC模拟复位的状况从0x00000000 执行程序,这样的话可以将AXD->option-->configurate processor 对话框中的vector catch选项的[R] 选项去掉. 这个选项就是AXD用来监视PC从0x00000000 取指时产生终止的功能。把它去掉,这样就可以在AXD下顺利模拟PC从复位(0x00000000)来取指执行了。还有其他几个选项是:



AXD使用技巧

1.如何保存当前的调试现场。
我们在调试过程中,经常需要在不同的地方设置断点、设置Watchpoint或者打开很多source文件。但是,一旦我们关闭了AXD,所有的工作都白费了。当我们再次打开AXD后,我们得到的仍然是没有任何断点、只打开一个entry文件的调试环境。这里介绍一种方法可以自动保存上一次的调试现场(寄存器的数据都是保存的)。
Options->General tab. 这里确认Save and load default sessions 选项是选中的。然后打开Session File,确保Rselect Target和Reload images 选项是选中的。
在设置保存后,我们在关闭AXD后,再次启动,就会自动加载上次的image,恢复寄存器了。
如果需要保存多个现场,那么就在设置保存后,在File菜单中选择Save Session来进行保存。不过注意,保存的路径中不能有空格和特殊字符。最好保存在ClearCase上。在需要恢复现场的时候,只需要Load Session就一切OK。你以前辛辛苦苦设置的断点、 Watchpoint全都回来了。

2.不能设置断点,怎么办?
不能设置断点时,我仅知有几种解决方案,这里列举一下:
A:清空CPU的Vector Catch 。
在Options->Configure Process..中清除。
B:Run一下,马上暂停。
这种方式对要求不高的断点(诸如设置在APP层中的断点)比较合适。方便。
C:清除以前的断点。
一般发生在Flash调试的情况。因为如果要在flash中调试的话,可以设置的断点数是有限的,首先清除以前的断点,然后才能设置新的断点。
D:命令行 spp vector_catch 0
其实和A相同。如果写在开机script中,那么就可以自动排除开机无法设置断点问题。
E:启动AXD的时候使用—debug这个参数,这样就可以添加一个自动断点在Main()上。

3. 如何不reload image就可以重新从头开始调试。
很多时候我们需要让代码重头跑起来复现一个bug。但是,一般来说,都是reload一下。如果image比较小还可以忍受,但是想660那种16M左右的巨型image,这种代价就未免太大。这里介绍几种我所知道的方法,可以从头开始调试:
A:设置Current寄存器。
点击 打开process register->current 组。设置pc为0 , cpsr为 svc模式下。关闭Thumb模式。这时F5即可运行下去。
B:运行脚本
这种方式速度更快,也方便。上上之选。
setpc 0
sreg cpsr 0xd3
5、 如何无条件跳转?
一般这种事情最好是在同一个函数中,某条语句无条件跳到另一条语句上时使用。最好不要跨函数使用(否则有堆栈错误,很难查的)
把光标定在需要跳转到的代码上,右键菜单execute->Set Next Statement .
6、 AXD有没有什么辅助工具?
有的。
IDA pro ,非常好的axf解析工具。可以统计axf文件中的函数、全局变量、调用关系等。界面非常友好,代码界面可以清楚看出函数引用关系、变量初始话、变量引用、修改的统计。
可以说,IDA Pro是汇编级的Source insight 。大家可以在网络上下载它的最新版安装使用。
7、 如何调试需要加载到Flash上的代码
以下是我的经验:
1、 在有jTag调试口的板子上Download一个版本。
2、 选择 File->load debug symbols 。然后选择CodeWarrior上Release版生成的那个AXF。
3、 现在就可以调试Flash上的程序了。和Debug完全一样。不过注意,在这种情况下,一般只能设置2个断点。
8、 使用fromelf命令
fromelf命令可以对我们生成的axf文件进行进一步操作的命令。
诸如:
从axf文件中抽出二进制代码:fromelf –bin –output a.bin a.axf
从axf文件中抽出二进制代码:fromelf –m32 –output a.s32 a.axf
9、 FAQ
Q: 生成的ram方式的redboot映像文件,应该使用什么工具调试编译的ram方式的redboot。
用ADS调试工具只能加载.axf格式的文件
A: 用ADS还可以加载bin文件(File->Load Memory From Memory...),可以使用ADS命令行或脚本初始化SDRAM
load bin文件时需要指定载入地址,对于s3c44b0x通常为0x0c040000,即在相应的ldi文件中指定的
SECTION_rom_vectors (ram, 0x0c040000, LMA_EQ_VMA)
将BIN程序Load后,将PC指针修改为0X0C040000即可

原创粉丝点击