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

4

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


这取决于你的集成开发环境。一些像uVision这样的IDE是专门设计用于嵌入式设备编程的。 - Ian
3
通常情况下,通过与内置的调试硬件进行接口连接来实现。这就是为什么你经常会看到限制,比如“一次只能有2个断点”(芯片只有2个断点寄存器)的原因。 - Martin James
这个问题有点太宽泛了。它取决于调试器、ICD适配器和微控制器。 - Lundin
2个回答

6
正如@Martin James在评论中所提到的,这种调试方式的典型方法是目标硬件本身就支持断点。

调试器使用JTAG接口来设置芯片内部寄存器以配置断点,而实际的“断点”操作则由芯片本身执行。

这通常意味着您可以拥有的同时断点数受到一些小的限制,因为这种硬件的数量是有限的。

该链接描述了例如ARM Cortex-M0的调试硬件,说它具有(可供客户选择的)1到最多4个硬件断点和最多两个(2)监视点。所以,相当严格限制了(但作为一个真正的嵌入式开发者,我看到这一点并想:“哇,硬件断点,这真是太棒了”)。


2
这里还有一个有用的讨论关于软件与硬件断点,他们解释了两者的区别。 - Emilien

3

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

有些单片机也提供了单步中断/机制。
在每个指令执行完之后,代码将停止,但调试器不需要为每个单步设置断点。

对于一些旧的没有硬件断点的单片机,断点是通过用软件中断指令替换指令来实现的。
当代码驻留在闪存中时,这是可怕的,因为每个断点都要重新编程闪存,这通常非常缓慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接