STM32 ~ MDK環境下調試程序 HardFault_Handler 相關

STM32出現HardFault_Handler故障的緣由主要有兩個方面:指針

一、內存溢出或者訪問越界。這個須要本身寫程序的時候規範代碼,遇到了須要慢慢排查。調試

二、堆棧溢出。增長堆棧的大小。blog

出現問題時排查的方法:ip

一、添加軟件斷點,一旦在調試過程當中出現Hard Fault 則會停在__breakpoint(0)處。內存

void HardFault_Handler(void)  
{  
   
   if (CoreDebug->DHCSR & 1)
   { 
      //check C_DEBUGEN == 1 -> Debugger 
      Connected  
      __breakpoint(0);  // halt program execution here         
    }  
    while (1)  
    {  
    }  
}  

  當進入HardFault斷點後,菜單欄Peripherals >Core Peripherals >FaultReports打開異常發生的報告,查看發生異常的緣由。io

 

上面的報告發生了BUS FAULT,並將Fault的中斷服務轉向Hard Fault。


相對於檢測發生了什麼異常,定位異常發生位置顯得更重要。
(1)打開Call Stack窗口(以下圖左側,斷點停在Hard Fault服務程序中)class

(2)在Call Stack的HardFault_Handler上右鍵Show CallerCode(有的Keil版本也能夠直接雙擊)變量

這時將跳轉到發生異常的源代碼位置(如上圖),異常發生在p->hour=0這一行。這裏錯誤很明顯:指針p還沒有爲成員變量分配內存空間,直接訪問未分配的內粗空間確定出錯。軟件

補充:
[1] 在複雜的狀況下,即便定位了異常發生位置也很難容易的改正錯誤,要學會使用Watch窗口對發生錯誤的指針變量進行跟蹤;
[2]在問題不明晰的狀況下,嘗試分析反彙編代碼,就本身遇到的,部分狀況下的異常發生在BL等跳轉指令處,BL跳轉到了不合法的內存地址產生異常bug

相關文章
相關標籤/搜索