FreeRTOS移植问题-空间不够

 一、出现问题

想要将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的运行内存才能运行。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值