默认情况下,在调试嵌入式应用程序时,目标通常在停在main()处:
停在main()函数
这通常很好,但如果我想调整复位后的启动代码怎么办?我在本文中使用的是基于Eclipse的NXP MCUXpresso IDE 10.3,但是相同或类似的东西适用于大多数基于gdb + Eclipse的现代IDE。
为什么应用程序停在main()位置?因为调试器在main符号(或函数)上设置了临时断点:
临时断点
这可以通过在Debugger Console视图的日志来确认:
调试器控制台中的临时断点
所以,调试器的工作流程是: 1. 调试器下载二进制文件 2. 调试器在main处设置临时断点 3. 调试器向目标发出重置,然后执行'run' 4. 目标将在临时断点处停止 显然,调试启动代码的一种简单方法是在启动代码中设置一个断点:
ResetISR上的断点
另一种方法是检查和更改调试器启动配置。因为每个调试配置可能会有所不同,我将介绍LinkServer、Segger和PEMicro的配置。
LinkServer LinkServer(CMSIS-DAP、LPC-Link2)连接没有专用的“运行”设置:要调试启动代码,我必须将“main”更改为“ResetISR”符号。要还原,请将符号更改回“main”。
停在ResetISR的启动代码
SEGGER 使用GNU Mcu Eclipse插件,设置如下所示,并且易于更改:
Gnu Mcu Eclipse Segger
要执行启动代码调试,请禁用“Continue”选项。
P&E(PEMicro) 下面的屏幕截图显示了P&E设置临时断点和“复位时运行”设置,这些设置易于查找和更改:
PEMicro启动配置
要从复位向量开始调试,只需禁用“Run on reset”选项。
总结 为了使用Eclipse和GDB调试启动代码,我可以在复位函数中设置断点,或者我可以更改Eclipse CDT启动配置中的设置以在ResetISR中停止(或者重置函数名称)。 |