我想创建一个调试工具来帮助我更好地调试我的应用程序。 我正在工作(没有操作系统)。在 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/