前言: 打算学习一下Free-RTOS,手里有一块STM32F103C8T6的板子,就想着先拿来练手,移植上去先学起来,并且打算在CSDN上记录一下一路遇到的坑,萌新第一次写博客,如果有什么意见或者有不对的地方欢迎大家留言。
我是先去图书馆借了本“FreeRTOS源码详解与应用开发”跟着教程一步一步移植好后,编译发现一大堆错误
..\Output\ESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.bss).
..\Output\ESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.bss).
..\Output\ESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching bsp_usart.o(.bss).
..\Output\ESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.data).
....还有好多
..\Output\ESP32Server_FreeRTOS.axf: Error: L6407E: Sections of aggregate size 0x1087c bytes could not fit into .ANY selector(s).
上网一查是因为芯片的空间不足,网上的解决方法写有很多
1.勾选Use MicroLIB
在option -> 选择Target -> 勾选Use MicroLIB
实际操作一下发现确实有用,但是好像收效甚微,勾选后重新编译,内存确实占用的少了一点,但是还是通过不了编译呀
这个时候我又跟着进行了第二步操作
..\Output\ESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.bss).
..\Output\ESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.bss).
..\Output\ESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching bsp_usart.o(.bss).
..\Output\ESP32Server_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.data).
....
..\Output\ESP32Server_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)) /* 系统总堆栈大小 */
通过编译,问题解决。