断点如何在嵌入式设备上工作?

How are breakpoints working on an embedded device?

这只是个人兴趣问题。我知道我的 JTAG 能够读取 uController 的寄存器值。但我不知道 JTAG 设备如何知道何时停止 uController。我认为也许添加了一些调用中断的代码,但您可以在操作期间添加断点,因此这个接缝是错误的。那么它是怎么做到的呢?

正如 @Martin James 在评论中提到的,这种工作的典型方式是目标硬件本身支持断点。

调试器再通过JTAG接口设置片内寄存器来配置断点,实际"breaking"则由芯片自己完成

这通常意味着您可以拥有的同时断点的数量被限制在一些较小的数量,因为存在的此类硬件数量有限。

This link 例如描述了 ARM Cortex-M0 的调试硬件,并表示它具有(客户可选择的)1 到最多 4 个硬件断点和最多两 (2) 个观察点。因此,非常有限(但作为一名实际的嵌入式开发人员,我看到了这一点并认为 "mmmm hardware breakpoints, such richness")。

@unwind 已经提到了硬件断点。

有些 MCU 还提供单步 interrupt/mechanism。
每条指令后代码将停止,但调试器不需要为单步执行每次都设置断点。

而在一些没有硬件断点的老款mcu上,断点是通过软件中断指令代替指令实现的。
当代码驻留在闪存中时,这很糟糕,因为必须为每个断点重新编程闪存,这通常非常慢