一、出现问题
想要将FreeRTOS移植到STM32中,按照网上的教程将一系列.c文件添加到工程中,在it.c文件中注释了一些函数,但在主函数 中添加了xTaskCreate(Task1,"Task1",10,NULL,1,&xHandleTask1);之后,程序出现以下报错,提示各个段内的储存空间不足。
12条报错,11条提示没有足够的空间,最后一条显示选择空间不足。
需要0x4c1c byte的空间。
二、分析问题
芯片选用的是STM32F103C6T6,Flash为32k,SRAM为10k。
程序运行需要:代码段、BSS段、数据段、堆、栈,除了堆之外其他的均数据静态内存分配。
报错显示BSS段、数据段、堆和栈均溢出。
BSS段存储未初始化的全局变量,Data段存储初始化全局变量。
2.1 采取方法-删除全局变量
尝试性的删除了程序中的几个全局变量,但是并没有减少报错的数量。
2.2 采取方法-勾选use-MicroLIB
MicroLIB是一个优化后的标准C语言库,与标准C语言库相比,所占用的空间更少。
勾选之后,报错有效的减少了两个,分别是heap和bss的报错。
2.3 扩大内存区域的大小
根据提示大小需要扩展到0x49bc bytes的大小。
ROM区域大小为0x8000,转化为十进制为32768,也就是32k,RAM区域大小为0x2800,转化为十进制为10240,也就是10k.需要的空间为18k多。
因此重新分配空间,如下图所示,将ROM改成了22k,将RAM改成了20k.
报错消失。
根据以上信息,代码占用8480字节的空间,RO-data只占用了1824字节的空间,RW-data只占用了100字节的空间,而ZI-data占用了18780字节的空间。
Flash的空间要大于等于Code+RO-data+RW-data(共10.16k);
RAM的空间要大于等于WR-data+ZI-data(共18.44k)。
由于好奇,我又实验了以下,将ROM的空间由原来的22k,缩小到10k,看看程序能否编译成功。
结果成功报错,空间不足。
我又把ROM空间设置为11k,来验证以上的想法,结果成功编译。
以上解决方法来自于网站:MDK在链接时提示空间不够(No space in execution regions with .ANY selector... )的解决方案总结 - Red_Point - 博客园 (cnblogs.com)
三、烧入验证
芯片的ROM和RAM空间按道理是应该固定的,但是在编译层面更改这些内容,没有报错。单片机中的内存能否更改只有将程序烧录至单片机中,查看能否运行,才能验证。
程序烧录之后,在未注释任务开始创建函数时,程序无法运行,注释之后程序回复正常。
四、总结
刷新我认知的事情:
存在McroLIB库;
SRAM和ROM的空间可以更改,并且更改后可以烧录至单片机中;
FreeRTOS任务需要近20k的运行内存才能运行。