std*_*all 2 c arm cortex-m3 stack-trace 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 ;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
ARM 定义了一对部分,.ARM.exidx 和 .ARM.extbl,它们包含足够的信息来展开堆栈而无需调试符号。这些部分用于异常处理,但您也可以使用它们来执行回溯。添加 -funwind-tables 以强制 GCC 包含这些部分。