gpt4 book ai didi

ARM cortex m3 中的调用堆栈展开

转载 作者:太空宇宙 更新时间:2023-11-04 00:19:00 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com