硬件断点与嵌入式系统中的软件断点

问题描述 投票:2回答:2

我的理解是插入软件断点涉及替换软件中断指令要执行的代码中的下一条指令,这将导致CPU在达到该指令时停止。

硬件断点涉及将要执行的断点之后的下一条指令的地址放入寄存器,当地址匹配时,通过使用硬件比较器,这会导致CPU停止(如果我错了,请纠正我)。

令我困惑的是,我们在使用硬件调试器通过JTAG调试电路板时是否只使用硬件断点?或者JTAG也可以使用软件断点吗?

GDB是仅用于软件断点,还是可以与JTAG一起使用?对不起,如果问题有点宽泛。

debugging embedded interrupt breakpoints jtag
2个回答
3
投票

“如我错了请纠正我”

在指令上设置断点,而不是在指令之后 - 断点发生在指令执行之前,而不是之后 - 否则在跳转,调用或分支指令上设置断点将失败。

“在使用硬件调试器通过JTAG调试电路板时,我们是否只使用硬件断点?”

JTAG是片上调试的简单通信接口(用于其他目的,例如在线存储器和FPGA编程以及边界扫描)。

虽然它可能因ARM Cortex-M架构而异,但您可以从目标代码访问片上调试寄存器并设置硬件断点。 Yoiu还可以使用BKPT指令在您的代码中放置软件断点(而不是您建议的SWI)。

或者JTAG也可以使用软件断点吗?

正如我所说,JTAG只是片上调试的通信接口,但通过片上调试,您可以直接设置任何RAM内容,因此在开发主机上运行的JTAG连接调试器软件可以暂时修改RAM中的代码设置软件断点(通过用BKPT替换目标指令,然后当命中断点时,恢复到原始指令,以便可以执行。虽然一些调试器支持,但软件断点对于从ROM运行的代码来说并不是那么简单无限制的ROM断点(价格) - 这些硬件的制造商不一定公开他们用来做这件事的方法。

在JTAG和片上调试在evebnlow-end部件上广泛使用之前,使用了在线仿真和ROM仿真器等技术。这些通常是昂贵且复杂的解决方案。

GDB是仅用于软件断点,还是可以与JTAG一起使用?

GDB可以以多种方式使用。它需要一个“调试存根” - 将调试器软件映射到可用硬件的软件层 - 其性质取决于所使用的调试接口和目标器件。例如,当使用UART或以太网端口时,存根实际上是在目标本身上运行的代码(例如Linux的gdbserver)。在这种情况下,它不太可靠,因为软件错误可能会阻止调试端口驱动程序实际运行,尤其是在缺少MMU保护的目标中。更简单的JTAG设备通过在开发主机上运行的存根(例如常用的OpenOCD软件)与GDB连接。更昂贵的JTAG调试硬件可以在JTAG硬件本身上运行存根 - 例如Abatron的bdi2000。无论哪种方式,调试存根都可以根据目标功能使用硬件和软件断点。


0
投票

Breakpoint Definition

在本文的上下文中,让我们就断点的统一定义达成一致。这里讨论的断点是程序位置,我们希望处理器暂停,以便我们可以进行某种调试。可能存在其他类型的断点,例如由数据访问触发的断点,但在本文中,我们将仅讨论程序断点,我们的应用程序代码中的位置,我们希望每次遇到代码时停止这些位置。

Hardware vs. Software Breakpoints

硬件和软件断点之间有什么区别?嗯,显而易见的答案是“硬件断点在硬件中实现”和“软件断点在软件中实现”。但究竟是什么意思,它的后果是什么?为什么我会选择一个而不是另一个?

硬件断点

硬件断点实际上是由集成到器件中的特殊逻辑实现的。您可以将硬件断点视为一组连接到程序地址总线的可编程比较器。这些比较器使用特定的地址值进行编程。当代码执行时,程序地址总线上的地址中的所有位都与编程到比较器中的位匹配,硬件断点逻辑会向CPU发出一个停止信号。使用硬件断点的优点是它可以用在任何类型的内存中。在讨论软件断点之后,这可能更有意义。当我们讨论软件断点时,我们会发现它们只能用于易失性存储器。无论正在执行的代码是在RAM还是ROM中,都可以使用硬件断点,因为对于硬件断点逻辑,没有区别。它只是匹配PAB上的地址,并在找到CPU时暂停CPU。 HWBP的缺点是,因为它们是在硬件中实现的,所以可用数量有限。可用的HWBP数量因架构而异,但在大多数情况下,只有2-8个可用。确定设备数量的最简单方法是在CCS中连接它并继续设置HWBP,直到收到没有可用的错误消息。

软件断点

如上所述,软件断点是在软件中实现的。但那怎么办?实际上有两种不同的实现。某些设备在其操作码定义中保留指定软件断点的指定位。例如,在C6000系列的一个体系结构中,所有指令都是32位长,而位28保留用于指示软件断点,因此该指令集中的所有指令都将位28作为零。在这种情况下,当在CCS中设置软件断点时,它实际上将修改该位置处的指令的操作码并将位28设置为1.然后,当位28为1时,仿真逻辑监视程序操作码,并且发生这种情况时暂停CPU。请注意,这是少数情况。大多数架构都不这样做。原因是它限制了指令集的灵活性。此外,它不适用于具有可变长度指令的体系结构,因此它也限制了代码密度。实现软件断点的更流行方式也要复杂得多。在这种情况下,有一个指定的断点操作码。通常,操作码是8位。每当设置断点时,该位置指令的前8位将被删除并替换为该8位断点操作码。然后将指令的原始8位存储在断点表中。每当遇到断点时,CPU停止并且CCS用指令的原始8位替换断点操作码。重新启动执行时,CCS必须做一些技巧,因为实际CPU管道中的指令不正确。它仍然有断点操作码。因此,CCS刷新CPU管道,然后将其中待处理的指令重新提取到其原始状态,下一个要执行的功能是设置断点的功能。同时,CCS使用断点操作码重新加载该位置的指令,以便下次遇到此代码时,它将再次停止。 SWBP的优势在于它们的数量不限,因此您可以将它们放在任意数量的地方。缺点是你不能把它们放在ROM / FLASH等非易失性存储器中,因为CCS不能将操作码写入该位置。

http://processors.wiki.ti.com/index.php/How_Do_Breakpoints_Work

© www.soinside.com 2019 - 2024. All rights reserved.