(五)stm32工程代碼HardFault異常查錯調試方法


一、導致異常的原因很多,例如:直接使用未分配空間的指針、棧溢出等一場非法操作便會使程序進入HardFault異常狀態。下面介紹怎么找出程序中的異常。

接下來在keil_MDK工程中,編譯代碼,並debug,之后全速運行,可以看到如下圖所示程序進入HardFault異常。

如下所示我們找到SP寄存器,0x200045B8即為棧地址,棧里面的值依次為R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。如圖我們看到划紅線的地方,注意從右往左看。分別為0x0800427D和0x08004BFA。

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

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

可以發現異常代碼就在uart_send_noackdata這個函數里,這個函數里我們定義了一個指針,沒有給他分配空間便開始使用了。由此我們掌握了第一種查找異常的方法。只要記錄棧里面第21~24以及25到28字節的內容即可方便的找到異常代碼。下面介紹使用.map文件查找異常。.map文件在keil工程里面隨着程序的編譯會自動生成。

在.map文件里我們查找0x08004BFA,找到了0x08004bd8指示是uart_send_noackdata函數,到此我們找到了異常代碼所在的位置。

 由此我們知道我們只要找到棧里面PC(Return address)、xPSR(CPSR或SPSR)寄存器里的內存地址便可以找到異常代碼。

CPSR

當前程序狀態寄存器 (Current Program State Register)

SPSR

保存的程序狀態寄存器 (Saved Program State Register), 有6個,主要是在處理異常的時候使用.

每一種處理器模式下都有一個專用的物理寄存器作為備份的程序狀態寄存器SPSR , 當特定的異常發生時,這個物理寄存器負責保存CPSR當前程序狀態寄存器的內容, 當異常處理程序返回時,再將內容恢復到當前程序狀態器中,繼續向下執行原來程序.

PC

程序計數器,是用來計數的,指示指令在存儲器的存放位置,也就是個地址信息

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM