嵌入式基础知识–硬件和软件断点

每个开发人员都使用断点来调试其软件。这是根本。双击要中断程序执行的代码行,然后放开它(否则就中断了?)。我遇到的很多开发人员都没有意识到,在后台出现了提供此关键功能的不同断点机制。在本文中,我们将研究硬件和软件断点之间的差异以及它如何影响我们作为开发人员。

使用且通常首选的第一个断点类型是硬件断点。每个微控制器都有比较器,这些比较器是调试模块的一部分。例如,ARM Cortex-M微控制器的调试模块中可以具有2-4个比较器。比较器被设置为程序计数器值,并且当匹配发生时,将引发调试事件并且程序停止。硬件断点是最快和最常用的断点。

硬件断点有问题。一个微控制器通常只有2-4个比较器,这意味着一旦它们用完,就不能再添加断点了!我无法告诉您多少次我想要在应用程序中使用三个或更多断点,而只是必须策略性地切入和切出哪些断点处于活动状态。这既烦人又耗时。值得庆幸的是,还有一些软件断点。

软件断点通常是一条指令,该指令临时替换RAM中的一条指令,该指令要么是非法指令,而且会导致故障,或者旨在导致应用程序中断。一个完美的例子是ARM指令集中的BKPT指令。当CPU到达该指令时,它将暂停执行。软件断点只能用于驻留在RAM中的应用程序代码。原因是一条指令从字面上换成了断点指令。一旦开发人员跨过BKPT,将运行在该位置执行的原始代码。

开发人员可以使用几乎无穷无尽的软件断点,但是主要的问题是它们还是为运行在RAM中的代码而设计的。在像ARM Cortex-M这样的现代微控制器上,很可能代码是从闪存​​执行的。这将我们带到第三个断点类型,即闪存断点。

Flash断点允许开发人员为从Flash运行的应用程序创建无限的断点。就像常规软件断点一样,闪存断点具有几乎无限数量的断点的能力。它们还可以在微控制器的内部和外部闪存上工作!具有此功能的示例调试器是Seggar J-Link(通常是Pro或Ultra +版本,但我知道也可以为其他版本购买许可证)。调试器供应商可使用多种方法来创建闪存断点,而最好的方法几乎与典型的硬件断点一样快。

从开发人员的角度来看,使用哪种断点类型几乎没有关系。对于开发人员来说,重要的是要了解正在使用的断点类型以及他们的系统能够支持的最大硬件断点数。购买高质量,专业的调试器始终是一个不错的主意,以确保有足够数量的断点可用,并且它们对于手边的应用程序足够快。如果不是这种选择,那么仔细选择微控制器还可以帮助您确保最大程度地获得可用的硬件断点。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.