stm32進入HardFault_Handler的定位方法


寫程序偶爾會遇到程序死機的現象。這個時候,就需要debug來定位。
通常情況下,程序會進入HardFault_Handler的死循環(針對stm32系列),我遇到過兩次。


第一次是使用數組之前,數組的下標清零了,導致無法訪問串口的數據,俗稱內存越界,你誤以為訪問串口的全局數組,其實是其他數據,uart[23],index=0,之后,想用uart[index-1]來訪問數組的最后一個數據,這個時候就出現問題了,其實是uart[-1]的數據,可想而知,什么數據不知道,就會出現程序死機的現象,這個現象debug的時候基本上要仔細看串口的緩存和下標的變化基本可以查到原因。


第二種是不同的任務訪問相同的外設資源。


我想用uart來打印數據,但是我默認上電后,建立了兩個串口的任務,這樣就產生了這個任務想使用串口來接收,但是其他任務又想打印數據,因此就沖突了,這樣的解決方式是把串口的任務都屏蔽了,這樣就可以單獨使用串口來發送了。debug的時候可以看《Call Stack窗口》,顯示停在了uart任務中,因此就判斷串口任務搗的鬼,之后屏蔽了就解決問題了。

調試的過程,我懷疑是printf有錯,因此全部都刪除了printf語句,程序運行了,然后添加之后,就出錯了,那說明還是printf的錯,之后debug停在了HardFault_Handler的死循環,查看了Call Stack,有串口的任務,那我大致了解是串口任務沖突了。

具體的方法可以參考以下鏈接:

http://news.eeworld.com.cn/mcu/article_2017110835733.html

https://blog.csdn.net/u013184273/article/details/84440177


免責聲明!

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



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