单片机学习小组
直播中

康桃花

7年用户 904经验值
私信 关注

如何解决STM32F103C8T6移植Free-RTOS中内存不足的问题?

如何解决STM32F103C8T6移植Free-RTOS中内存不足的问题?

回帖(1)

李丽彩

2022-1-27 09:34:56
打算学习一下Free-RTOS,手里有一块STM32F103C8T6的板子,就想着先拿来练手,移植上去先学起来,并且打算在CSDN上记录一下一路遇到的坑,萌新第一次写博客,如果有什么意见或者有不对的地方欢迎大家留言。


我是先去图书馆借了本“FreeRTOS源码详解与应用开发”跟着教程一步一步移植好后,编译发现一大堆错误


..OutputESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.bss).
..OutputESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.bss).
..OutputESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching bsp_usart.o(.bss).
..OutputESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.data).
....还有好多
..OutputESP32Server_FreeRTOS.axf: Error: L6407E: Sections of aggregate size 0x1087c bytes could not fit into .ANY selector(s).


上网一查是因为芯片的空间不足,网上的解决方法写有很多
1.勾选Use MicroLIB


在option -> 选择Target -> 勾选Use MicroLIB


实际操作一下发现确实有用,但是好像收效甚微,勾选后重新编译,内存确实占用的少了一点,但是还是通过不了编译呀
这个时候我又跟着进行了第二步操作


..OutputESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.bss).
..OutputESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.bss).
..OutputESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching bsp_usart.o(.bss).
..OutputESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.data).
....
..OutputESP32Server_FreeRTOS.axf: Error: L6407E: Sections of aggregate size 0x1061c bytes could not fit into .ANY selector(s).


2.更改Optimization 为 Level 3(-O3)


在option-> 选择C/C++ -> 更改Optimization 为 Level 3(-O3)


网上给出的解释是这是一个优化等级,不同优化等级,占用代码量和运行速度是不一样的
(-O3)运行最快,代码量最少,但是最容易出问题
但是实际操作后发现好像没有用处。


3.更改configTOTAL_HEAP_SIZE的大小


在FreeRTOSConfig.h文件夹下 更改configTOTAL_HEAP_SIZE的大小


这个也是目前最暴力,最有效的方式,因为跟着书移植这些也都没有改动,但是书里面是基于F4移植的,这里给操作系统开辟的内存很大,而C8T6的资源很少所以造成了出现内存不足的情况,我在这里将configTOTAL_HEAP_SIZE配置为10k


#define configTOTAL_HEAP_SIZE                ((size_t)(10 * 1024))        /* 系统总堆栈大小        */


通过编译,问题解决。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分