菜鸟学C#

淡泊以明志,宁静以致远

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
请教:请问硬件断点和软件断点的区别?

Q:RT,平时仿真调试的时候要用断点,但是发现好象一般象IAR,ADS的话好象只支持你设置2个断点(在想设置断点的地方按鼠标右键设置),如果多了的话就无法单步执行了。如果这种断点是硬件断点的话,那么外面经常说的软件断点又是什么呢?应该怎么设置软件断点呢?

Q1:你试试用H-jtag加wiggler(使用IAR),我用它可以设好几个断点,也可以单步运行. 在H-jtag的作者的一篇“ARM JTAG 调试原理.pdf”有详细说明断点的实现原理等。有介绍软断点和硬断点的。

Q:呵呵!终于知道区别了,硬件断点可以用在FLASH里面,而软件断点不能,这估计也是为什么在RAM DEBUG里面可以设置N多的断点,而在FLASH DEBUG的时候就只能设置2个断点的原因了。

Q:我的理解,所谓断点就是让PC停止的地址。所谓硬件断点就是由硬件支持的断点,可以在调试的时候看EICE资源看到使用状况。简单的说,硬件断点有一个专门的寄存器,保存一个地址,就是断点,然后会不停的与PC比较,当匹配的时候就通过一定的机制停止处理器运行,一般其还支持条件断点。而软件断点可通过运行时插入一条特殊的指令来实现,这显然要实现运行时修改程序所以在flash中运行的时候是使用硬件断点,所以出现这样的问题。

下边这段话引自《ARM JTAG 调试原理》

(1)WP Address Value/Mask Register和硬件断点
断点是用来标识某个地址上的指令的,所以要将一个WATCH POINT用作断点设置,首先需要将WP Control Value寄存器的nPOC位置0,用来表示:只有在当前的周期是进行取指令的条件下,才触发断点。要在一个地址设置一个断点,可以通过WP Address Value/Mask这两个寄存器来实现。假设,要在地址0x0040设置一个断点,可以将WP Address Value寄存器的值设置为0x0040,同时将WP Address Mask寄存器的值设置为0x0。另外,将WP Data Mask设置为0xFFFFFFFF,这样可以屏蔽掉WP Data value寄存器的影响,在进行比较的时候,只考虑地址是否匹配。这样,每次ARM7TDMI从地址0x0040取指令的话,不管该指令是什么,断点就会被触发,ARM7TDMI会暂停当前的运行,自动进入调试状态,要清除该断点的话,只要改变WP Address Value寄存器的值,或者设置WP Control Value寄存器,禁止该功能。如果你想在所有地址的低16位的值为0x0040的地方设置断点,可以配合使用WP Address Mask寄存器,  将它的值设置为0xFFFF,0000,这样的话,每次比较的时候,高16为的地址就会被屏蔽掉。其实这种使用方式应该是比较少的,比较多的情况是,屏蔽掉最低2位或者最低1位的地址。在ARM状态下,因为ARM指令的长度是32位的,所有指令地址的最低2位必须为0,所以,如果在ARM状态下,一般将WP Address Mask的低2位置1,在进行地址比较的时候,屏蔽掉地址低最低2位,确保断点是被设置在正确的地址上;如果类似,如果是在THUMB状态下,一般需要将WP Address Mask的最低1位置1。上面描述的是第一种设置断点的方式,这种方式是通过地址比较来实现断点的。这也是我们常说的硬件断点,这类断点可以被设置在任何地址(包括FLASH和SDRAM)。因为ARM7TDMI提供了两组WP Address Value/Mask寄存器,所以,可以支持两个硬件断点。下面让我们来看看断点的另外一种实现方式。
(2)WP Data Value/Mask Register和软件断点
在调试过程当中,通过WP Data Value/Mask寄存器也可以实现断点设置。利用WP Data Value/Mask如何实现断点设置呢? 和硬件断点的设置一样,首先需要将WP Control Value寄存器的nPOC位置0,用来表示:只有在当前的周期是进行取指令的条件下,才触发断点。 然后,将WP Address Mask寄存器的值设置为:0xFFFFFFFF, 这样可以屏蔽掉WP Address value寄存器的影响,在进行比较的时候,只考虑数据是否匹配。接下来,将WP Data Value寄存器的值设置为一个固定的值,例如:0xDEDEDEDE,将WP Data Mask寄存器的值设置为0x00000000。在需要设置断点的地方,将其内容替换为0xDEDEDEDE。这样,一但程序运行到该位置,尝试从该位置取指令或者数据的时候,因为取得的数据值和WP Data Value寄存器的值相同,ARM7TDMI会暂停当前的运行,自动进入调试状态。要清除该位置上的断点,我们只需要将该位置原来的指令恢复就可以了。这样,退出调试状态后,程序可以继续正常的运行。通过WP Data Value/Mask寄存器,我们可以在任何需要设置断点的地方,将其内容替换为一个固定的序列,就可以达到设置断点的目的。这种断点就是我们通常所说的软件断点。软件断点的设置方式使得ARM7TDMI可以支持任意数量的软件断点。但也决定了软件断点的局限性:软件断点不能设置在ROM/FLASH里面。因为软件断点的实现需要替换要设置断点的位置的内容,这点在ROM/FLASH做不到。(虽然从某种意义上来说,FLASH也是可读写的,但是需要特殊的指令)。

posted on 2010-04-13 13:15  东东会会  阅读(9227)  评论(0编辑  收藏  举报