最近在調試STM32 Cortex-M3 HardFault異常,以外發現程序居然進入了NMI異常。對於這種異常,從來沒有出現過,如下圖所示。

此時的R0等寄存器的值如下圖所示,
堆棧指針是0x2000 74F4,以此推斷程序跑飛的地方,向后或者向前都不對,不是R0等8個寄存器的值。

這樣無法找到出錯的指令在何處了,后來跟蹤調試程序,找到了出錯的地方,如下圖所示,在0x0801 98CC處,有一條跳轉指令BLX R9,此時的R9的值是0x0800 0135,而這個地址對應的就是NMI中斷處,即程序自己跳轉到了NMI中斷。

已經找到了出錯的地方,可不可以據此反推呢?正常程序觸發中斷后,會將R0等8個寄存器一次入棧,而此時沒有入棧。R14即LR寄存器的值卻是0x0801 98CF,而這個值卻是在程序跑飛的指令所在的地址,發生NMI異常時,是怎么壓棧的,不得而知。
