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地址。