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