STM32 嵌入式操作系統的進入 HardFault_Handler分析


STM32在使用中,因為一般沒有其他異常拋出,所以拋出異常一般都是HardFault_Handler.

導致產生該現象的原因有一下幾點:

(1)數組越界操作;

(2)內存溢出,訪問越界;

(3)堆棧溢出,程序跑飛;

(4)中斷處理錯誤;

一,數組越界

毋庸置疑,程序中使用了靜態數組,而在動態傳參時數組賦值溢出。或者動態分配內存太小,導致程序異常。

二,內存溢出

重點檢查RAM區域,程序編譯后執行的RAM數據量大小為多少是否可能越界。一般不要設置到極致的情況,程序中的一些動態數組傳參時會導致異常。

image

計算 RW-data+ZI-data 為需要存儲在RAM區域的變量等。

檢查程序編譯后的.MAP文件。

對應手冊,或者編譯器查找到對應RAM存儲空間區域。找到該區域分析,並對應。

image

例入 此芯片的RAM區域為0X20000000的48K的存儲空間,檢查這些變量,特別是全局變量的分配。

RAM區域內存分配不足時,檢查某些變量是否可以申請為存在代碼區域。

本設計中可以看到,由於申請了幾個大的靜態數組,RAM區域已經使用到了b790 離 C000的48K 內存已十分接近。

在這種問題下,尤其需要注意:

使用Printf,vsprintf,sprintf 格式化數據導致的內存問題,這些函數使用的內存空間較大,猜測是由於,該函數采用的拷貝數組的形式轉換,內存耗費劇烈。

使用操作系統的若為 設置鈎子函數拋出異常,則也會產生該問題。配置操作系統所用空間,包含消息量,消息隊列,郵箱,任務堆棧等。

三,堆棧溢出

這在使用操作中問題尤其嚴重,在操作系統中,任務的變量均分配放置在任務所申請的堆棧空間中,例如FreeRTOS的

xTaskCreate

task. h

 

創建新的任務並添加到任務隊列中,准備運行

 

Parameters:
pvTaskCode     指向任務的入口函數. 任務必須執行並且永不返回 (即:無限循環).
pcName     描述任務的名字。主要便於調試。最大長度由configMAX_TASK_NAME_LEN.定義
usStackDepth     指定任務堆棧的大小 ,堆棧能保護變量的數目- 不是字節數. 例如,如果堆棧為16位寬度,usStackDepth定義為 100, 200 字節,這些將分配給堆棧。堆棧嵌套深度(堆棧寬度)不能超多最大值——包含了size_t類型的變量
pvParameters     指針用於作為一個參數傳向創建的任務
uxPriority     任務運行時的優先級( 0 : 優先級最低)
pvCreatedTask     用於傳遞一個處理——引用創建的任務
返回:
pdPASS 是如果任務成功創建並且添加到就緒列中,另外錯誤代碼在projdefs. H文件定義

所創建的任務需要指定堆棧大小,那么堆棧申請不足,則會出現異常,針對該問題可啟動系統的鈎子函數HOOK函數,拋出該異常。

四,中斷處理異常

程序中開啟了某些中斷,例如USART,TIMER,RTC等。

但在程序執行中,滿足中斷條件,但並未能查找到該部分對應的中斷服務函數,則會拋出該異常。


免責聲明!

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



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