再上一篇:15.3 调试模式
上一篇:15.4 调试事件
主页
下一篇:15.6 调试时访问寄存器
再下一篇:15.7 内核的其它调试特性
文章列表

15.5 Cortex-M3 中的断点

《Cortex-M3 权威指南》,嵌入式处理器开发教程。

在大多数单片机中,用得最多的可能就是断点了。在CM3中,有两种断点机制:
 断点指令
 基于FPB地址比较器的断点
断点指令的格式为BKPT #im8,它是一个16位的Thumb指令,编码为0xBExx——其低8位就是 指令中#im8的值。当该指令执行时,会产生一个调试事件。当C_DBGEN置位时可以用于喊停处理器 内核;或者当调试监视器使能时,触发调试监视器异常。对于后者,因为调试监视器异常也是一种 优先级可编程的普通异常,所以也可以因为其优先级不够高而不能立即响应。可见,因为NMI和硬
fault的优先级总是比它的高,所以不能在它们的服务例程中使用BKPT指令来启动调试——只有在 它们返回时才能响应调试监视器异常。
使用BKPT时另一个要注意的是,当调试监视器异常返回后,它返回到的是BKPT指令的地址,而 不是返回BKPT后面一条指令的地址。这与常规的异常返回是不同的,原因在于,在正常情况下使用 BKPT指令时,BKPT用于取代一条正常的指令,并且当命中了该断点而执行了调试动作后,把该BKPT 指令所占用的内存恢复为先前被BKPT取代的指令,并且让该指令是下一条即将执行的指令,而其它 的部分不受影响(这其实也是软件断点的实现方式)。
如果在BKPT指令执行时却发现C_DEBUGEN和MON_EN都为0,则会因为无法进入调试而上访成硬

fault,并且把硬fault状态寄存器(HFSR)的DEBUGEVT位给置1,同时在调试fault状态寄存器

(DFSR)中的BKPT位也置1。 如果程序存储器的值不能更改,则可以通过编程FPB来产生硬件断点。但是,只支持6个指令地
址和两个文字地址。下一章将展开叙述FPB。 使用BKPT指令取代正常指令,以及对FPB的编程,通常都是在我们设置断点时,由调试器负责
做的事。