Eclipse/GDB: 如何设置硬件复位后的自动断点?

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 调试控制台中的行为设置所致。

但是,我也想要一个自动断点机制,它会在出现

时停止程序

由于我的软件通常基于具有无效函数指针的自动任务,我想知道何时由于要调用的函数出现问题而发生硬故障,

但是到目前为止,我唯一一次注意到 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 :

The implementation of prvGetRegistersFromStack() is shown below. prvGetRegistersFromStack() copies the register values from the stack into the C variables, then sits in a loop. The variables are named to indicate the register value that they hold. Other registers will not have changed since the fault occurred, and can be viewed directly in the debugger’s CPU register window.

也比照How do I debug unexpected resets in a STM32 device?

您无法检测到硬件重置,因为它们会擦除整个内存。再次启动时,您可以找到导致硬件重置的原因,这在 中。可能将结果存储在某个永久存储器中,该存储器在下次硬件重置期间不会被擦除

我发现由于 NYE 假期,我还没有正式解决我的问题:)

感谢 ralf htp 我能够解决我最初的问题,即由 GDB 控制台选项导致的预加载断点。

总而言之: 最后link贴解决了OpenOCD版本。 https://electronics.stackexchange.com/questions/28593/hardware-breakpoints-on-the-stm32

SEGGER j-link是

break main
break Default_FaultHandler

两者都可以在 Eclipse 调试配置(在启动选项卡中)中为 GDB 添加,如下所示

很有魅力...

谢谢!

如果你想在可疑函数或处理程序中放置断点,只需使用

__BKPT();

或者如果您不使用 ARM CMSIS

#define __BKPT(value)                       __ASM volatile ("bkpt "#value)

示例:

void Default_FaultHandler(void)
{
  __BKPT();
  while();
}

当这个内在函数被命中时,你的调试器将接管控制权:)