2011-03-08 42 views
0

我想在MSP430上的项目中发现堆栈溢出,并发现它主要发生在堆栈非常满后发生IRQ时。MSP430 IRQ处理程序显示调用堆栈与IAR

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

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

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

回答

0

如果中断处理程序是用C编写的,这应该可以正常工作,因为即使是中断函数,生成的CFI(调用帧信息)也应该是正确的。但是,如果这个(出于某种原因)不应该工作,或者如果中断程序是用汇编语言编写的(没有合适的CFI指令),你可以使用一些小技巧。您可以通过从堆栈中检索PC并通过“备份”功能内部调整的SP来在注册窗口中手动修改PC和SP寄存器。之后,调试器将显示中断发生时正在执行的功能。

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

+0

IRQ处理程序是用C编写的,具有适当的属性,因此在最后生成“reti”并启用“修改保存的状态寄存器”内在函数,因此所有信息都应该在那里;修改SP是一个好主意,我应该自己想到这个。 – 2011-03-11 10:02:01

+0

我困惑的是调用堆栈不起作用。这可能表示堆栈包含垃圾,并且调试器在CFI信息后停止。如果没有,你已经找到了一个工具相关的问题。 – Lindydancer 2011-03-11 10:09:47

+0

好吧,原则上我希望CFI有一个说明,即当前函数是一个中断函数,因此需要解开一个额外的单词才能回到中断函数的调用帧;原来的电脑显示正确,但没有尝试解决其框架。 – 2011-03-11 10:22:50