STM32棧和堆使用不同RAM的實現方法
阿新 • • 發佈:2019-02-17
最近在除錯將開源資料壓縮演算法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了.