Debugging 使用IAR在MSP430上的IRQ处理程序下方显示调用堆栈

Debugging 使用IAR在MSP430上的IRQ处理程序下方显示调用堆栈,debugging,iar,msp430,Debugging,Iar,Msp430,我试图在MSP430上的一个项目中发现堆栈溢出,并发现它主要发生在堆栈非常满后出现IRQ时 我在堆栈指针写入上设置了一个断点,其值小于堆栈的起始地址,并且CPU在IRQ处理程序中暂停 IAR C-SPY中的调用堆栈显示在handler函数处终止,但是我对下面的内容感兴趣,因为这是填充堆栈的内容 有没有办法在当前中断处理程序下显示调用堆栈?如果中断处理程序是用C编写的,那么它应该可以正常工作,因为生成的CFI(调用帧信息)即使对于中断函数也应该是正确的 然而,如果这(出于某种原因)不起作用,或者如

我试图在MSP430上的一个项目中发现堆栈溢出,并发现它主要发生在堆栈非常满后出现IRQ时

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

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


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

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

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


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

IRQ处理程序是用C编写的,具有适当的属性,因此在最后生成“reti”,并启用“修改保存的状态寄存器”内部函数,因此所有信息都应该存在;修改SP是个好主意,我应该自己考虑。让我困惑的是调用堆栈不工作。这可能表示堆栈包含垃圾,并且调试器已停止跟踪CFI信息。如果没有,您已经发现了一个与工具相关的问题。原则上,我希望CFI注意到当前函数是一个中断函数,因此需要解开一个额外的字以返回到中断函数的调用帧中;原始电脑显示正确,但未尝试解析其边框。