ARM cortex m3 中的调用堆栈展开

标签 c arm stack-trace cortex-m3 iar

我想创建一个调试工具来帮助我更好地调试我的应用程序。 我正在工作(没有操作系统)。在 Atmel 的 SAM3 上使用 IAR 嵌入式工作台。

我有一个看门狗定时器,它会在超时的情况下调用特定的 IRQ(这将在发布时被软件重置所取代)。 在 IRQ 处理程序中,我想打印出 (UART) 堆栈跟踪,了解看门狗超时发生的确切位置。

我查看了网络,但没有找到该功能的任何实现。

有人知道如何处理这种事情吗?

编辑:好的,我设法从堆栈中获取了返回地址,所以我确切地知道 WDT 超时发生的位置。 展开整个堆栈并不像最初看起来那么简单,因为每个函数都会将不同数量的局部变量压入堆栈。

我最终得到的代码是这样的(对于其他人来说,可能会发现它有用)

void WDT_IrqHandler( void )
{
    uint32_t * WDT_Address;
    Wdt *pWdt = WDT ;
    volatile uint32_t dummy ;
    WDT_Address = (uint32_t *) __get_MSP() + 16 ;
    LogFatal ("Watchdog Timer timeout,The Return Address is %#X", *WDT_Address);
    /* Clear status bit to acknowledge interrupt */
    dummy = pWdt->WDT_SR ;

}

最佳答案

ARM 定义了一对部分,.ARM.exidx 和 .ARM.extbl,它们包含足够的信息以在没有调试符号的情况下展开堆栈。这些部分用于异常处理,但您也可以使用它们来执行回溯。添加 -funwind-tables 以强制 GCC 包含这些部分。

关于ARM cortex m3 中的调用堆栈展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11325915/

相关文章:

c - 我怎样才能将 SpaceManager cpShape 存储在类似数组的东西中?

c++ - 将 C 中的图像加载到 unsigned char

c - U-Boot 2020.04 : Probing SPI flash fails - Invalid bus 0 (err=-19)

java - 如何在java中获取调用层次结构

c - 外部函数?

C 宏 _Generic 给出了意外的编译器错误

c - LPC17XX SPI : Implementing pulse-sensitive(edge-triggered) interrupts

linux-kernel - 使用 32 位操作执行 ioread/write64

c++ - 崩溃后如何处理 "impossible"堆栈跟踪?

c# - 异常堆栈跟踪丢失的项目