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
在嵌入式开发,经常用到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
相关文章推荐
- 关于USART接收中断的BUG和注意事项
- Dotnet Debug/Release模式编译时要注意的事项
- 大数据基础环境搭建的从spark到hadoop,从底层硬件到上层软件的一些必备注意事项
- 硬件开发流程及注意事项
- 51中断函数编写注意事项
- 【虚拟机-可用性集】ARM 中可用性集使用的注意事项
- 软中断与硬件中断的区别
- 硬件仿真注意事项
- 关于USART接收中断的BUG和注意事项
- STM32外部中断处理流程及注意事项
- 购买CPU时注意事项
- 电脑硬件日常操作最忌什么?电脑维护注意事项大全
- SpriteFrameCache的注意事项
- Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity)
- 用ModelSim、Mars和Verilog做计算机组成原理CPU实验注意事项
- 高德LBS使用以及注意事项+debug版本直接用release的签名配置
- 软中断和硬件中断
- ASC0106硬件连接注意事项
- 在Windows Qt-4.8.x平台上编译Qt-5.0+ WebKit(即qtwebkit-2.3.x) Debug版注意事项
- Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity) 转