STM32F103C8T6移植FreeRTOS后编译失败,内存不够解决办法

STM32F103C8T6移植FreeRTOS后编译失败

使用STM32F103C8T6移植FreeRTOS的时候,编译会失败,但是在Stm32F103VET6工程上编译没问题,编译之后报以下错误

.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f10x_md.o(STACK).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.bss).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching queue.o(.bss).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.data).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching timers.o(.bss).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.data).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching system_stm32f10x.o(.data).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_rcc.o(.data).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching usart.o(.bss).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching timers.o(.data).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching port.o(.data).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching main.o(.data).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching delay.o(.data).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching task_user.o(.data).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching stdout.o(.data).
.\Objects\Table_lamp.axf: Error: L6406E: No space in execution regions with .ANY selector matching usart.o(.data).
.\Objects\Table_lamp.axf: Error: L6407E: Sections of aggregate size 0x810 bytes could not fit into .ANY selector(s).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 17 error messages.
“.\Objects\Table_lamp.axf” - 17 Error(s), 0 Warning(s).
Target not created.

这个是由于stm32f103c8t6的内存不足导致的,c8t6只有64k(实际上有128k,配置为128k一般也不会出问题),而vet6有512k,因此直接用vet6上 的FreeRTOS移植过来会导致内存不足的情况。
解决办法:
修改FreeRTOSConfig.h内的

#define configTOTAL_HEAP_SIZE					((size_t)(20*1024))

#define configTOTAL_HEAP_SIZE					((size_t)(10*1024))

也就是修改FreeRTOS系统所有总的堆大小,之后编译便会通过。
在网上还看到过修改程序优化等级的,不建议大家使用,首先把程序优化等级调节到最大。也就是Level 3(-O3),那么程序出奇葩问题的可能性也就最大,其次这样真正来说也节约不了多大内存,大家如果想在日后少死掉点脑细胞,建议还是设置优化等级为Level 0(-O0)!

你可能感兴趣的:(嵌入式开发,嵌入式,stm32,linux,程序人生,经验分享)