1. 程式人生 > >STM32棧和堆使用不同RAM的實現方法

STM32棧和堆使用不同RAM的實現方法

最近在除錯將開源資料壓縮演算法zlib移植到STM32的工程中. 由於zlib要佔用大量的動態記憶體(預設設定下需要至少280kB左右的記憶體), STM32內部的48kB 的SRAM遠遠不夠用, 因此必須將動態記憶體分配使用的記憶體堆(HEAP)設定在外部的擴充套件RAM中去.

我在使用的STM32中用了一個別人寫的已經燒好的IAP Bootloader, Bootloader中會檢查使用者程式的向量表首地址(即__initial_sp), 如果發現這個地址的值不在內部ram中, 就認定沒有合法的使用者程式, 而進入死迴圈狀態拒絕跳轉. 另外, 從抗干擾性和穩定性角度出發, 我也的確希望棧放在內部ram中. 這就要求: 將stack分配到內部ram, 而將heap分配到外部ram中

這個問題直接上網找是找不到的, 我實驗了很多方法, 找到了一種最簡單的解決方案:

  • 將stm32f10x_vector.s中關於heap的設定都提出來, 形成一個新的.s檔案, 命名為custom_heap.s, 內容如下:
Heap_Size        EQU     0x000A000  ;

                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem         SPACE   Heap_Size
__heap_limit
                 EXPORT  __heap_base
                 EXPORT
__heap_limit END
  • 將這個新的custom_heap.s加到工程中, 同時將stm32f10x_vector.s中提出去的關於heap的設定部分都註釋掉.

  • 右鍵點選custom_heap.s, 選擇option, “Zero Initialized Data” 選擇外部Ram, 如下:

這裡寫圖片描述

  • 重新build即可. 新的map檔案中可以看出現在stack和heap使用的是不同的ram了.

這裡寫圖片描述