硬件代码断点(Hardware Code Breakpoint)
硬件代码断点是通过MCU内部的专门硬件模块来实现。以ARM Cortex-M为例,Flash Patch and Breakpoint Unit (FPB)包含对应的PC地址比较器,当CPU想要运行对应地址的指令时,比较器会触发并返回Breakpoint Instruction (BKPT) 指令给到CPU,CPU会暂停,从而实现硬件代码断点功能。硬件代码断点的优势是速度快(因为是通过MCU内部的硬件比较器实现), 劣势是数量有限(ARM Cortex-M最多是6-8个)。
本地的CortexM33 的MCU 试验最多可以添加8个硬件断点,继续添加时回报如下的错误,添加硬件断点失败。
上述绿色部分描述对应cortex -m 架构的Flash Patch and Breakpoint Unit 对应的寄存器如下,对应的芯片的COMP 寄存器为8个,跟上述的8个硬件断点保持一致,硬件断点实现跟底层该寄存器数目相绑定。
添加如下硬件断点配置,设置断点后读取上述寄存器查看硬件断点配置情况。
读取对应的COMP 寄存器和断点设置地址发现寄存器数值和断点地址是匹配的,相对断点的地址要多1 是因为THUMB指令集的原因。
上述0xc26b7 对应的地址产看代码发现为如下main 函数的地址。
该断点的设置对应IAR 自动会停在main 函数的配置,也验证了IAR 函数debug 在main 函数停住也是配置了断点配置。
在非Debug 状态未设置断点时,读取FP_COMP 寄存器的值发现都为0
软件代码断点(Software Code Breakpoint)
软件代码断点是通过调试器(Debugger)将对应地址的指令替换成专门的断点指令。以ARM Cortex-M为例,调试器将对应地址的指令替换成Breakpoint Instruction (BKPT) 指令。当CPU想要运行对应地址的指令时,将会运行Breakpoint Instruction (BKPT) 指令,CPU会暂停,然后对应地址的指令又会恢复成原来的指令,从而实现软件代码断点功能。软件代码断点的优势是数量没有限制,但是由于对应地址的指令需要被调试器替换成专门的断点指令,只能用于在RAM中运行的代码。
在代码运行在flash 的基础上修改link file 将程序运行在RAM中,来验证上述标红部分的描述,发现这次IAR 中断点数量超过8个也不会报错了,没有数量的限制了。
验证完了上述标红部分的描述,我们继续对上述橙色部分的描述的软件断点的触发机制。我们在代码中添加如下连续地址的软件断点。
设置好断点后读取0x20050730 对应的RAM 空间数据如下。
取消断点后再读取0x20050730 对应的RAM 空间数据如下。
对比设置断电前后的memory 数据可以发现上述断点地址处的数据在设置断点后被修改为0xbe00,0xbe00是什么呢?
从上面曾色的内容描述,我们不难猜测0xbe00对应着BKPT 指令,查看ARM-M 指令可知0xbe00 对应 BKPT 0 的汇编指令编码。