【问题标题】:Display call stack below IRQ handler on MSP430 with IAR使用 IAR 在 MSP430 上的 IRQ 处理程序下方显示调用堆栈
【发布时间】:2011-07-11 01:03:05
【问题描述】:

我试图在MSP430上的一个项目中查找堆栈溢出,发现它主要发生在堆栈已满后发生IRQ时。

我在堆栈指针写入上设置了一个断点,其值小于堆栈的起始地址,CPU 在 IRQ 处理程序中停止。

IAR C-SPY 中的调用堆栈显示然后在处理函数处终止,但是我会对下面的内容感兴趣,因为这是填充堆栈的内容。

有没有办法在当前中断处理程序下方显示调用堆栈?

【问题讨论】:

    标签: debugging iar msp430


    【解决方案1】:

    如果中断处理程序是用 C 编写的,这应该可以正常工作,因为即使对于中断函数,生成的 CFI(调用帧信息)也应该是正确的。

    但是,如果这(由于某种原因)不起作用,或者如果中断例程是用汇编程序编写的(没有正确的 CFI 指令),您可以使用一个小技巧。您可以在寄存器窗口中手动修改 PC 和 SP 寄存器,方法是从堆栈中检索 PC,并通过“备份”SP 在函数内调整的数量。之后,调试器将显示中断发生时正在执行的函数。

    注意,在传统的 MSP430 内核中,PC 存储为普通的 16 位值。但是,在 MSP430X 内核中,这 20 位与状态寄存器有点交织在一起,请参阅架构手册了解详细信息。

    【讨论】:

    • IRQ 处理程序是用 C 语言编写的,具有适当的属性,因此最后会生成“reti”,并启用“修改保存的状态寄存器”内在函数,因此所有信息都应该在那里;修改SP是个好主意,我自己应该想到的。
    • 令我困惑的是调用堆栈不起作用。这可能表明堆栈包含垃圾并且调试器已停止跟踪 CFI 信息。如果没有,您发现了与工具相关的问题。
    • 嗯,原则上我希望 CFI 有一个注释,当前函数是一个中断函数,所以需要展开一个额外的词才能回到被中断函数的调用框架;原始 PC 显示正确,但未尝试解析其框架。
    猜你喜欢
    • 2013-06-09
    • 2010-11-28
    • 2022-12-13
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2021-11-13
    • 2017-01-13
    • 2012-11-26
    相关资源
    最近更新 更多