[英]Eclipse/GDB: How to set an automatic breakpoint after hardware reset?
我正在使用带有 Eclipse 和 GDB 的自建嵌入式 IDE - 几乎本网站描述的内容: https : //gnu-mcu-eclipse.github.io/
当我使用 OpenOCD 或任何其他调试配置(如 SEGGER JLink)来刷新我的 STM32F407 硬件时,它在我的 main.c 的第一行中断。 没什么不寻常的。
// ----- main() ---------------------------------------------------------------
int main(void)
{
//Initialization, if unsuccessful -> quit
if (!INIT_bInit())
return 0;
//infinite Loop
while (0x1337)
{
//Nothing
}
//Must not end here
return 0;
}
//main()
这可能是由于 Eclipse OpenOCD 调试控制台中的行为设置所致。
但是,我也希望有一个自动断点机制,它会在出现问题时停止程序
由于我的软件通常基于带有 void 函数指针的自动任务,我想知道何时由于要调用的函数出现问题而发生硬故障,
但到目前为止,我唯一注意到 HardFault 的时间是我在一段时间后暂停我的程序并检查它是否以我的(自定义)Default_FaultHandler(它实现了 HardFault_Handler 和其他)结束。
void Default_FaultHandler(void)
{
while(0xDEAD){}
}
硬件复位也是一样。 没有迹象,甚至没有在 main.c 上自动(重新)中断。
我从 NXP 的 MCUXpresso 或 Atollic Studio 等基于 Eclipse 的 IDE 中了解到,当调用任何故障处理程序或硬件重置时,可以自动中断程序。
关于如何使用我自己构建的 OpenOCD/Eclipse 解决方案自动化调试行为的任何想法?
热烈欢迎您的帮助
干杯
-亨尼
要分析您的硬故障,您可以编写一个更复杂的处理程序,参见https://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html :
prvGetRegistersFromStack()
的实现如下所示。prvGetRegistersFromStack()
将寄存器值从堆栈复制到 C 变量中,然后进入循环。 命名变量以指示它们保存的寄存器值。 其他寄存器自故障发生后不会发生变化,可以直接在调试器的 CPU 寄存器窗口中查看。
您无法检测到硬件重置,因为它们会擦除整个内存。 再次启动时,您可以找到导致硬件复位的原因,这是在STM32中如何获得上次复位状态。 可能将结果存储在一些永久存储器上,在下次硬件复位期间不会被擦除
如果你想在 suspiciuus 函数或处理程序中放置断点,只需使用
__BKPT();
或者如果您不使用 ARM CMSIS
#define __BKPT(value) __ASM volatile ("bkpt "#value)
例子:
void Default_FaultHandler(void)
{
__BKPT();
while();
}
当这个内在函数被击中时,您的调试器将控制:)
我发现由于 NYE 假期我还没有正式解决我的问题 :)
感谢ralf htp,我能够解决由 GDB 控制台选项导致的预加载断点的初始问题。
总结整个事情:发布的最后一个链接解决了 OpenOCD 版本。 https://electronics.stackexchange.com/questions/28593/hardware-breakpoints-on-the-stm32
对于 SEGGER j-link,它是
break main
break Default_FaultHandler
两者都可以在 Eclipse 调试配置(在启动选项卡中)中为 GDB 添加,如下所示
奇迹般有效...
谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.