这篇文章总结了刚接触ARM的网友们的常见问题,希望对快速掌握ARM调试有帮助。
1 - 检测不到目标系统
调试前,请把目标板连接好,然后用调试软件检测目标系统。如果检测不到目标系统,请做以下的检查。
A - 有些芯片是可以加密的,加密后JTAG接口就自动被禁用掉了;
B - 确定你的连接是正确的;
C - 确定你使用的仿真器是被调试软件支持的
D - 对WIGGLER而言,因为没有固定的电路图,所以需要在软件里做相应的设置;
E - 对LPC2000系列而言,RTCK管脚一般是用来控制是否使能JTAG接口的,请查阅数据手册;
F - 如果你用的芯片比较特殊,例如STR91X,因为内部扫描链是串接的,请设置好TAP,以让仿真器知道扫描链的长度;
2 - 程序下载不正确,程序跑飞
一般的用户,刚开始调试的时候,编译好程序,就直接点击调试。但结果发现调试根本没有
按照预期的进行。发生这种问题一个最常见的原因是程序根本没有正确下载到目标系统中去。
对SDRAM而言,上电后一般都是不可以使用的,需要进行相应的配置才可以使用。所以如果是在SDRAM里进行调试,请先对SDRAM进行配置,或者确定SDRAM已经初始化好了。如果是内部SRAM,一般来说,可以直接使用。所以,做一般的测试,最简单的办法是使用片内SRAM。
在调试的时候,最好是自己通过内存观察窗口判断一下,程序是否是下载到期望的地址去了,下载是否正确。以免出现调试跑飞的问题。
3 - 软件断点和硬件断点的区别和数量限制
所有的ARM7/ARM9芯片,内部有2个断点单元。断点单元可以用于设置硬件断点或是软件断点。
先说说硬件断点和软件断点的区别。硬件断点是通过监测地址来触发断点的。所以,硬件断点可以设置在任何地方,不管是FLASH,ROM还是RAM,只要给定地址就可以了。而软件断点是通过监测特定的指令来触发断点的。在某个地址设置软件断点的时候,仿真器会将这个地址的数据/指令替换成一个特殊格式的指令。断点单元通过监测这个特殊格式的指令来触发断点。
因为需要执行替换操作,所以软件断点只能设置在RAM里面。如果断点单元设置成监测某个地址,那一个断点单元只能监测一个地址,所以只能设置2个硬件断点。如果断点单元设置成监测某个固定格式的指令,那一个断点单元可以支持数量没有限制的软件断点。因为设置软件断点的时候只需要把要说着断点的位置的数据替换成被监测的固定格式的指令就可以了。这就是为什么大家经常看到说支持2个硬件断点和数目不限的软件断点。但这里还是要提醒以下,如果2个断点单元都用于硬件断点,那用户就不可以设置软件断点了。
4 - 在FLASH内进行调试
在FLASH进行调试,本质上来说,和在SDRAM/SRAM里调试是一样的。区别是,FLASH是只读的,对FLASH进行写操作的时候,需要特别的命令。如果IDE支持直接将程序烧写到FLASH进行调试,那调试就会和在RAM里差不多。如果IDE不支持自动下载,可以先通过烧写软件将要调试的程序烧写到FLASH里面,然后在进行调试。在FLASH和RAM里面进行调试的另外一个区别在与可使用的断点数量。因为FLASH是只读的,所以只能使用硬件断点,所以最多只能使用2个断点。很多时候,单步运行也需要一个断点来实现,所以,用户只能使用一个断点。清楚了这点,碰到提示说没有断点可以使用了,不能设置断点,或者不能单步运行的时候,就知道是怎么回事情了。
5 - 软件断点被覆盖
前面我们提到,软件断点是通过替换指令来实现的。这就存在一个可能,设置好的软件断点被覆盖掉了。特别是自拷贝程序,仿真器在拷贝前在某个地址设置了一个软件断点。然后执行拷操作,这样的结果是设置断点的位置的值由于自拷贝而发生了改变,由于新的值并不是被监测的特殊指令,所以这个断点就会失效。造成在这个位置程序不能停止的情况。这样的情况相对来说比较少,这里只是提醒一下,希望对碰到类似情况的朋友有帮助。
6 - 反汇编调试
在调试的时候,一般看的都是源文件,汇编或C语言。如果调试的时候发现运行与期望的不一或是跑飞,可以看看反汇编,单不运行几步,然后通过观察寄存器和内存来判断每条指令的运行是否正确。
7 - 调试的时候,注意内存观察窗口对调试的影响
在调试的时候,如果内存观察窗口打开了,每次目标板被停止后,DEBUGGER都会通过调试代理读取内存,更新内存观察窗口的值。一般情况下,这样做都不会带来什么影响。但有个特殊情况必须要注意。在某些情况下,调试目标的某些寄存器有特别的地方。例如,有些寄存器,只能读取一次,读取后它们的值就会变化。在这种情况下,因为更新内存观察窗口的值的时候会执行一次读操作,所以程序重新运行的时候,在读取寄存器的值的时候,该值已经改变了,程序运行出现不期望的情况。