[原创] ARM JTAG调试常见问题 (供新手参考)

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

很早就听说楼主做了个H-JTAG , 希望大侠帮忙下面的问题

los&nbsp;发表于&nbsp;2008-1-15&nbsp;10:16&nbsp;嵌入式系统&nbsp;←返回版面&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />楼主:&nbsp;s3c3440如果裸奔请问使用哪个IDE来开发??&nbsp;<br /><br />keil&nbsp;3可以么?<br />感觉不可以,keil&nbsp;3.11就不可以<br />至少s3c3440头文件都没有<br />我是菜鸟,只能从裸奔开始<br />希望指点<br />谢谢<br /><br />s3c3440如果裸奔请问使用哪个IDE来开发??<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
 楼主| twentyone 发表于 2008-1-15 13:00 | 显示全部楼层

To los

如果你是想裸奔的话,我推荐ADS。从学习的角度来看,如果你想从头了解程序的结构及其编程模型,我建议你裸奔。<br /><br />从开发的角度来看,如果你拿到一块新的板子,而且KEIL支持得很好,你可以用KEIL,利用它提供的头文件,省事很多。
 楼主| twentyone 发表于 2008-1-15 13:02 | 显示全部楼层

To netjob

正在考虑M3的调试,目前正在看些资料,毕竟是一个全新的内核。
lpf336 发表于 2008-1-15 13:16 | 显示全部楼层

好东西

  
 楼主| twentyone 发表于 2008-1-15 22:18 | 显示全部楼层

re

出现这个问题的时候,有可能是JTAG信号不好,例如CABLE太厂了,并口供电不足。或者是读写收保护的空间,或是未定义的空间。
db10 发表于 2008-1-15 23:33 | 显示全部楼层

顶一下大牛的贴

  
muslimsali 发表于 2008-1-16 08:30 | 显示全部楼层

以后要学习,先收下了,以后再看!

mohanwei 发表于 2008-1-16 08:49 | 显示全部楼层

不错,收藏之

  
machunshui 发表于 2008-1-16 09:15 | 显示全部楼层

感谢twentyone为我们提供Hjtag!!

别的什么也不说了,<br />感谢twentyone为我们提供Hjtag!!
xusn 发表于 2008-1-16 16:21 | 显示全部楼层

在realview下,是不是H-FLASHER不支持在FLASH中调试

我有REALVIEW时,H-FLASHER总是提示不能加载*.axf文件,<br />然后就放弃了
wzjsh 发表于 2008-1-16 22:27 | 显示全部楼层

谢谢twentyone的回复

不用并口线,wiggler板直接插到并口上,仍然进不入调试状态,一开始load&nbsp;image时弹出错误信息。<br />检查wiggler板的电压只有2.9V,是否算正常呢?
luate 发表于 2008-1-17 09:50 | 显示全部楼层

我在用H-JTAG,谢谢!

 楼主| twentyone 发表于 2008-1-17 13:30 | 显示全部楼层

To wzjsh

如果电压是2.9V,好像有点低。可能是这个问题。
 楼主| twentyone 发表于 2008-1-17 13:32 | 显示全部楼层

TO xusn

你指的REALVIEW是不是KEIL?&nbsp;KEIL调试应该没有问题的,如果你装载AXF文件失败,应该和你的KEIL设置有关系。KEIL本身带的编译和链接器,包括3种:GNU的,KEIL自己的和ARM公司的。
lzyr 发表于 2008-1-18 21:31 | 显示全部楼层

能否添加对ft2232 USB->JTAG的支持

  
lpf336 发表于 2008-1-18 21:43 | 显示全部楼层

ls的主意不错

也不知道好不好加
licolico 发表于 2008-1-18 22:04 | 显示全部楼层

新手参考中~~~~~~~~~~~~~

  
lzyr 发表于 2008-1-18 22:27 | 显示全部楼层

应该好加的

ft2232官方提供了驱动和动态链接库,只是缺少rdi1.5协议,可以直接从动态库中读取数据,openocd都支持,好像open-ocd还是开源的,能找到驱动ft2232的源码<br /><br />ps现在的用笔记本搞开发的多了,很少有并口的笔记本,ft2232片子也不贵,完全可以做到和wiggler一样普及的
zjapq 发表于 2008-1-18 23:06 | 显示全部楼层

有用,支持

您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

203

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部