1. 程式人生 > >stm32 堆溢出

stm32 堆溢出

程序 bass 由於 eap 否則 規模 原因 類型 art

STM32 堆溢出

遇到的問題

最近在給舊項目添加了段代碼,程序經常到某個狀態就突然崩潰了,也不一定是在運行新代碼的時候崩潰。檢查了幾遍代碼,數組越界訪問,除數為0,內存泄露等常見的問題都不存在。

原因

最後發現,問題出在程序中用mallc動態分配內存,卻沒對是否成功分配做檢查。程序中,因為堆空間不足,分配內存不成功,malloc返回NULL。後面的代碼對NULL地址進行寫操作,引起了程序崩潰。

後續的一些概念整理

  1. STM32系列單片機在startup_stm32fxx.s文件中,定義了Heap_Size 和 Stack_Size.常見的大小分別是0x200(512 bytes),0x400(1024 bytes),大小可以修改,但是要考慮程序的規模和單片機IRAM的大小。

  2. 堆和棧在IRAM中分配。堆和棧在IRAM中的絕對地址不是固定的,IRAM 中section 排列順序:.data , .bass, HEAP , STACK。

  3. 不同的程序,由於定義的函數和變量不一樣,.data 和 .bass 兩個section 的大小不一樣,導致HEAP和STACK的絕對地址不一樣。

  4. 為了節省IRAM的空間,可以將不需要改變的數組聲明為const類型。const類型變量會存放在代碼區(flash 區域),否則存放在IRAM。

stm32 堆溢出