GD32F103CB:SRAM 20K(0x5000)
這篇文章主要想講清楚幾個事情:
1、啟動文件Stack_Size、Heap_Size的大小設置有啥影響;
2、FreeRTOS的內存:FreeRTOSConfig.h文件configTOTAL_HEAP_SIZE;
問題2,好解釋,先來說它
FreeRTOS任務里面的內存的開銷都是從ucHeap里面進行,實際上它就是個全局變量,它存在ZI-data里面(ZI-data介紹文章):未初始化或者初始化為0的變量空間。如圖:ZI-data=15836里面有10k是ucHeap。
查看map文件,搜索ucHeap可以看大它的存儲地址
先講結論:Heap_Size在我的代碼中不起作用,Stack_Size則最終決定棧頂的地址。
先看啟動文件關于棧Stack_Size、堆Heap_Size的設置
程序需要的SRAM分配完后,地址落在0x200030b8
啟動文件:Stack_Size 設置0x1000:棧頂=0x200030b8+0x1000
啟動文件:Stack_Size設置0x0500:棧頂=0x200030b8+0x0500
Heap_size設多少都沒反應;(應該是程序中沒用到例如malloc,編譯后,優化刪除了)
推出GD32的SRAM的分配流程:
(1)從0x2000000開始往上,一個一個變量分配地址;
(2)分配ucHeap從0x200008b8開始,因為它有10K(0x2800),所以到0x200030b8分配完;
(3)接下來是分配棧STACK,從0x200030b8開始,棧的大小啟動文件設定的0x1000,所以棧頂地址是0x200040b8;
總結:先按照程序的變量分配SRAM,分配完后,才根據stack設定的大小,確定棧頂地址initial_sp的大小。棧頂地址不能比SRAM最大地址大,因為GD32F103CB它有20K,對應0x5000地址。