stm32f103c8t6移植freeRTOS内存不足报错问题的解决办法
最近尝试手动为stm32f103c8t6移植FreeRTOS,出现了内存不足的报错
这是因为单片机内部存储空间有限,而程序所占用RAM空间太大,导致内部存储空间不足。
stm32f103c8t6的ROM大小为72KB,主要存储程序和只读常量;
而RAM大小为20KB主要存储RW-data(可读可写变量)和ZI-data(没有初始化的可读可写变量)。
1、修改FreeRTOSConfig.h文件配置项
将configTOTAL_HEAP_SIZE后面的参数改得尽量小,例如,将20改为0.5。
该配置项是设置堆的大小,也就是单独划出一部分空间用于系统动态内存分配,而这部分内存是在RAM上的。
修改后编译结果:
其中RW-data和ZI-data数值之和是RAM被占用的字节数,可以看出已占用180+3732=3912字节,也就是3912÷1024=3.82KB,RAM剩余空间大小为20-3.82=16.18kb。
我们需要将堆的大小设置的大一些,以便于后期系统调度任务的内存分配,但不能超过RAM的剩余存储空间。
例如,将configTOTAL_HEAP_SIZE后面的参数改为10,然后编译:
可以看出ZI-data变大了,但RW-data与ZI-data之和并没有超过20KB,也就不存在内存不够用的问题了。
2、将一些比较大的数组常量前面加const修饰
在使用单片机驱动OLED时,我们经常会定义一些比较大的数组,用来作为字库、图片库等,由于这些数组通常比较大,占用的空间也比较大,就会产生内存不足的问题。
在没有const修饰时,这些数据会存储在RAM中——总共只有20KB,这些数组就能占好几KB,也就是RW-data的数值会很大。
在这些数组前面用const前面加上const,就变成了只读常量,会被存储在ROM中——有72KB,不怕空间不够~