每个开发人员都使用断点来调试他们的软件,这是根本。双击你想中断程序执行的代码行,然后放开它(或者它中断了?)。相当多的嵌入式开发人员没有意识到在后台有不同的断点机制来提供这个关键的功能。在这篇文章中,我们将研究硬件和软件断点之间的区别,以及它如何影响我们这些开发者。

使用的第一种断点类型通常是硬件断点。每个微控制器都有比较器,它们是调试模块的一部分。例如,ARM Cortex-M微控制器的调试模块中可以有2-4个比较器。比较器设置有程序计数器值,当出现匹配时,会引发调试事件,程序暂停。硬件断点是最快和最常用的断点。

硬件断点有问题。一个微控制器通常只有2-4个比较器,这意味着一旦它们用完,就不能再添加断点了!

软件断点通常是临时替换RAM中的指令的指令,该指令或者是非法指令并导致故障,或者是被设计为导致应用程序中断。ARM指令集中的BKPT指令就是一个很好的例子。当CPU到达这条指令时,它就停止执行。软件断点只能用于驻留在RAM中的应用程序代码。原因是指令实际上被断点指令换出。一旦开发人员跨过BKPT,原本应该在该位置执行的代码就会运行。

嵌入式开发人员可以使用几乎无限数量的软件断点,但主要问题是,它们是为运行在RAM中的代码而设计的。在ARM Cortex-M等现代微控制器上,代码很可能是从闪存中执行的。这就引出了第三种断点类型,即flash断点。

Flash断点允许开发人员为从flash运行的应用程序创建无限的断点。就像常规软件断点一样,flash断点有能力拥有几乎无限数量的断点。他们还可以在微控制器内部和外部闪存上工作!Seggar J-Link就是一个具有这种功能的调试器例子。调试器供应商使用许多方法来创建闪存断点,最好的方法几乎与典型的硬件断点一样快。

从开发人员的角度来看,使用哪种断点类型几乎无关紧要。对于开发人员来说,理解正在使用的断点类型以及他们的系统能够支持的硬件断点的最大数量是很重要的。购买一个高质量的专业调试器总是一个好主意,这样可以确保有足够数量的断点可用,并且对于手头的应用程序来说足够快。如果这不是一个选项,仔细选择微控制器也有助于确保嵌入式开发人员最大限度地增加可用的硬件断点。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部