您的位置:首页 > 其它

ARM cpu 软中断和硬件中断,带cache的debug注意事项

2017-03-23 17:18 876 查看
问题背景:cm4 带有cache,断点打成soft类型,导致断点发生后,不能正常step,不能正常run。使用的debug工具为trace32,本质跟keil一样。

嵌入式开发,经常用到JTAG仿真器。JTAG仿真器可以满足嵌入式程序调试的基本要求:断点设置、单步调试、内存编辑、变量、寄存器观测等。而断点设置是JTAG仿真器最基本的调试功能。用户需要系统在设置断点处停下来后再进行调试。断点根据原理和用途不同又分为几个不同的种类。断点可分为硬件断点和软件断点两大类:硬件断电和软件断电。对于ARM
debugger工具,常用的有两种breakpoint.  Hardware vs Software 类型。

硬件中断需要cpu支持,cm4有8个硬件中断。当前流行的ARM7/9内部硬件设计提供两组寄存器用来存贮断点信息,所以ARM7/9内核最多支持两个硬件断点,而ARM11则可以支持到8个硬件断点。这与调试器无关。硬件断点可以设置在任何位置的代码上,包括ROM和RAM;依赖于目标processor实现,
大多数ARM processor都包含了特定的硬件资源,ARM EmbeddedICE 硬件逻辑, 来匹配特定的硬件事件。调试时使用的调试器可以配置这些硬件资源来实现指令和数据断点。哪些硬件资源有效存在,依赖于所使用的处理器。硬件指令断点并不需要内存中的指令发生改变。这意味着硬件断点可以用来调试flash
和 ROM 中的代码, 并且也能被用于调试可自我修改的代码。

软件断点由于需要修改相应地址的值,所以一般只能设在RAM上,但是数量可以不受限制。由于硬件断点设置的灵活性,所以是最优先选用的断点资源,但是两个断点往往很难满足工程师进行深入调试的需要,于是软件断点可以作为硬件断点的补充资源来使用。软件断点是通过在代码中设置特征值的方式来实现的。当需要在某地址代码处设置软件断点的时候,仿真器会先将此处代码进行备份保护,然后将预先设定好的断点特征值(一般为0x0000等不易与代码混淆的值)写入此地址,覆盖原来的代码数据。当程序运行到此特征值所在的地址时,仿真器识别出此处是一个软断点,便会产生中断。当取消断点时,之前受保护的代码信息会被自动恢复。由于通常的软件断点只能设在RAM运行的代码上,而随着系统的代码量越来越大,特别是在移动通信领域,扩充大容量的RAM势必会增加产品的成本,所以现在很多系统直接在FlashROM上运行代码。对于这种在FlashROM上运行代码的系统,一般的软件断点是无法设置的,这也是软件断点的局限性。对于这样的系统,只能通过交替使用少量硬件断点满足需要,但是会带来一定的不便。要很好的解决这一矛盾,只有使仿真器增加在FlashROM上设置软件断点的功能,拓展仿真器中可供利用的断点资源。例如,日本横河计算机株式会社(YDC)最新推出的高端ARM仿真器—advicePRO,就是第一个支持Flash断点的ICE仿真器产品。在FlashROM上设置软件断点的原理与在RAM上设置软断点类似,也是在设定的断点处用特征码替换原有代码,通过识别特征码使断点事件发生。不同的是,在FlashROM上设置软件断点需要对Flash进行擦写操作,这就需要仿真器能够有Flash编程功能,并且能够在尽可能短的时间内完成特征码的写入。完成这一系列的读写操作,就可使在FlashROM上调试代码的工程师获得更充裕的断点资源,从而大大提高了开发效率。

软件指令断点修改内存中的指令以创造一个特殊的值, 该值被执行的时候使得处理器进入调试模式。写入内存中的特殊值取决于所使用的处理器类型。 对于ARM处理器, 根据体系结构和处理器版本,下列机制之一被使用:

a ) Undefined instruction 被写入内存中, 并且一个硬件断点资源被用来监测该指令的执行。

           当硬件断点单元监测到该 undefined instruction 进入执行流水线阶段, 则处理器进入调试模式。

    

b )  一条 ARMv5 BKPT 指令被写入内存, 并且一个硬件断点资源被用来监测该指令的执行。

           当硬件断点单元监测到该 BKPT 指令进入执行流水线阶段,则处理器进入调试模式。

c ) 一条 ARMv5 BKPT指令被写入内存。 当该条指令被执行的时候, 处理器自动进入调试模式。

当一个硬件断点单元被用于监测软件指令断点时, 无论有多少个软件指令断点被设置,仅仅只有单个的硬件断点资源被使用。 如果你不能成功设置软件指令断点, 你可能需要尝试首先释放一个硬件断点资源出来。

注意

1) 当浏览内存或者汇编代码时, 调试目标硬件给出的是内存实际值。

2) 在运行之前, 任何软件断点都已经被写入了内存。 

3) 当处理器停机的时候, 软件断点会从内存中被移除。 在许多处理器中,不能在运行时访问内存。

这意味着如果你在目标硬件运行时,断开了调试器和被调试处理器间的连接, 那些断点将被保留在内存中!

     如果处理器随后执行其中的某个断点指令,则(具体依赖于体系结构)处理器要么停在软件断点处;

     要么导致处理器产生一个未定义异常。

项目经验:enable cache后,trace32无法单步step

Cache enable后导致不能单步step原因为, 使用软件断点,enable
Icache后,导致原有数据不能恢复, 进而造成断点无法取消

 

具体分析如下:

 

通过trace32 load完code后,此时双击打断点,是软断点(一般只能设置在RAM上,通过copy原有数据,改写断点特征值来实现;取消断点后,恢复原有数据)

 

因cache line为8 word,一旦执行到断点code前,断点特征值已被缓存在Icache(RO)中待执行到断点处code, cpu会 收到断点中断,并试图通过Dbus恢复数据,此时 IRAM中已恢复,但Icache中确仍为断点特征值,造成cpu看到就是断点一直存在,即造成无法单步step现象;
 

解决方法:

Trace32脚本增加如下命令,后续使用硬件断点即可,cm4最多可支持6个 onchip 断点:

 

; using onchip breakpoints in this space(IRAM+DRAM+IROM)

map.bonchip 0x100000—0x300000  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: