在IAR Embedded Workbench中有效地使用不同类型的代码断点
在如何在IAR Embedded Workbench中充分利用各种类型的断点一文中提到,代码断点是使用最多的。本文着重介绍如何在IAR Embedded Workbench中有效地使用不同类型的代码断点。
代码断点的类型
硬件代码断点(Hardware Code Breakpoint)
硬件代码断点是通过MCU内部的专门硬件模块来实现。以ARM Cortex-M为例,Flash Patch and Breakpoint Unit (FPB)包含对应的PC地址比较器,当CPU想要运行对应地址的指令时,比较器会触发并返回Breakpoint Instruction (BKPT) 指令给到CPU,CPU会暂停,从而实现硬件代码断点功能。硬件代码断点的优势是速度快(因为是通过MCU内部的硬件比较器实现), 劣势是数量有限(ARM Cortex-M最多是6-8个)。
软件代码断点(Software Code Breakpoint)
软件代码断点是通过调试器(Debugger)将对应地址的指令替换成专门的断点指令。以ARM Cortex-M为例,调试器将对应地址的指令替换成Breakpoint Instruction (BKPT) 指令。当CPU想要运行对应地址的指令时,将会运行Breakpoint Instruction (BKPT) 指令,CPU会暂停,然后对应地址的指令又会恢复成原来的指令,从而实现软件代码断点功能。软件代码断点的优势是数量没有限制,但是由于对应地址的指令需要被调试器替换成专门的断点指令,只能用于在RAM中运行的代码。
闪存代码断点(Flash Code Breakpoint)
闪存代码断点是IAR公司在IAR Embedded Workbench for ARM version 7.60.1上新加的一个功能,通过使用IAR公司的I-jet硬件调试器,可以在一些基于ARM Cortex-M的MCU上设置没有数量限制的闪存代码断点。
闪存代码断点的优势是数量没有限制,而且是用于在Flash中运行的代码。但是由于闪存代码断点需要在下载的时候使用Flash Loader来擦除和重写Flash,只能在调试模式开始之前设置(IAR Embedded Workbench支持在编辑代码的时候设置断点,所以这个劣势对使用基本没有什么影响)。
不同类型的代码断点比较
前面介绍了不同类型的代码断点的工作原理和特点,下面是不同类型的代码断点的一个比较:
有效地使用不同类型的代码断点
前面介绍了不同类型的代码断点的工作原理,特点和优劣势比较,下面介绍如何在IAR Embedded Workbench中有效地使用不同类型的代码断点:
1. 当使用的代码断点数目没有超出可用的硬件代码断点数目时,优先使用硬件代码断点,因为硬件代码断点是最快的,使用也是最方便的。在IAR Embedded Workbench中,可以在调试时通过Breakpoint Usage窗口来检查硬件代码断点的使用情况(当不能设置更多的硬件代码断点时,通常是因为可用的硬件代码断点已经被用完了)。
2. 当硬件代码断点不够用时,需要调试的代码如果在RAM中运行,可以使用软件代码断点,因为软件代码断点是没有数量限制的。如下所示,CounterIncrement()函数在RAM中运行,在硬件代码断点已经用完的情况下,可以使用软件代码断点。
3. 如果代码是在Flash中运行,则需要确认使用的MCU是否支持闪存代码断点。如果使用的MCU支持闪存代码断点,则可以在调试模式开始前设置闪存代码断点。(注意,目前IAR Embedded Workbench中闪存代码断点只支持I-jet硬件调试器)
同时由于闪存代码断点需要使用Flash Loader在下载的时候对Flash进行编程操作,所以需要在Download选项中勾选Use flash loader(s)选项:
当前面所说的闪存代码断点的条件都满足之后,在需要打代码断点的地方右击,然后选择Toggle Breakpoint(Flash)就可以使用闪存代码断点了(有Toggle Breakpoint(Flash)这个选项说明使用的MCU支持闪存代码断点)。(注意:闪存代码断点必须在调试模式开始之前设置好,而且进入调试模式之后不能更改任何闪存代码断点设置!!!)
可以看到,闪存代码断点不会影响硬件代码断点的使用。
4. 如果MCU不支持闪存代码断点,则需要在调试的时候通过不使能某些硬件代码断点来腾出可用的硬件代码断点给其它的代码使用。
总结
本文主要介绍了不同类型的代码断点的工作原理,特点和优劣势比较以及如何在IAR Embedded Workbench中有效地使用不同类型的代码断点。
参考文献:
- C-SPY® Debugging Guide (Breakpoint types)
- https://www.iar.com/knowledge/learn/debugging/making-the-best-use-of-the-available-breakpoints/
- https://netstorage.iar.com/SuppDB/Public/UPDINFO/011006/arm/doc/infocenter/readme.ENU.html
- https://www.iar.com/knowledge/support/technical-notes/debugger/use-all-hardware-breakpoints-ewarm-6.x-5.x--4.x/
- https://mcuoneclipse.com/2012/07/29/software-and-hardware-breakpoints/