2011-03-08 56 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