stm32進入HardFault的異常定位方法

首先導致HardFault的原因有很多。堆棧溢出、未分配空間的指針(野指針)、等等。下面介紹幾種找出導致HardFault異常的比較實效有用的方法。

1、通過地址分析查找。

如下圖所示,程序進入HardFault異常。

可以看到SP寄存器,0x200045B8即爲棧地址,該地址裏面的值依次爲R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。每個寄存器的值存放4個字節。我們需要查找PC和xPSR的值。也就是查找棧裏面第21~24以及25到28字節的內容,就可以找到對應的值。通過在Memory中輸入棧的首地址,如下所示

從右往左看即可查詢到PC寄存器和xPSR寄存器的值分別爲0x0800427D和0x08004BFA。 

在show code at address中輸入0x08004BFA,點擊go to即找到出現異常的代碼段附近下面要執行的程序。

 我們用同樣的方法在show code at address中輸入0x0800427D,找到如下代碼段:

 可以發現異常代碼就在uart_send_noackdata這個函數裏,這個函數裏我們定義了一個指針,沒有給他分配空間便開始使用了。由此我們掌握了第一種查找異常的方法。只要記錄棧裏面第21~24以及25到28字節的內容即可方便的找到異常代碼。

CPSR(Current Program State Register)

當前程序狀態寄存器

SPSR(Saved Program State Register)

保存的程序狀態寄存器。主要在處理異常的時候使用。

以上內容來源於https://www.cnblogs.com/zhangshenghui/p/5944881.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章