关于stm32移植FreeRTOS后编译出现内存不足的原因

今天在学习移植freeRTOS的时候,出现了一大堆内存不足的错误:
linking…
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.bss).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f10x_hd.o(STACK).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.bss).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f10x_hd.o(HEAP).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching usart.o(.bss).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching libspace.o(.bss).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching queue.o(.bss).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.data).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching timers.o(.bss).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.data).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching system_stm32f10x.o(.data).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_rcc.o(.data).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching timers.o(.data).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching main.o(.data).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching port.o(.data).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching usart.o(.data).
…\OBJ\TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching delay.o(.data).
…\OBJ\TEST.axf: Error: L6407E: Sections of aggregate size 0x5b28 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 18 error messages.
“…\OBJ\TEST.axf” - 18 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed: 00:00:02

移植的文件都是按照正点原子的软件源代码移植的,当时都惊了,一模一样的文件居然都能出现问题,因为我基本把整个FreeRTOS源代码看过了,所以知道是FreeRTOSconfig.h文件里面的最大内存空间设置问题,网上大家也说改一下就好了,但是我对于这个KEIL上的内存空间配置没有搞清楚,今天专门去各种百度,在此记录下来。
首先现说明造成编译出错的原因:
在FreeRTOSConfig.h文件里面的
/**************************************************************************************************************/
/
FreeRTOS与内存申请有关配置选项 /
/
*************************************************************************************************************/
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持动态内存申请
#define configTOTAL_HEAP_SIZE ((size_t)(20
1024)) //系统所有总的堆大小
这里的系统所有总的堆大小是20K,但是我的keil默认设置的只有0x2800,也就是10K。(这是因为我以前初学时候建立的工程,当时这里配置就没有配置正确,所以才导致了这一出问题)在这里插入图片描述
这就是造成内存不足的原因,我们需要将IRAM1里面的0x2800改大,至少应该是大于20K才行,那是不是随便改呢,那肯定是不是的了,要根据你芯片的RAM大小来设置,
在这里插入图片描述

正点原子的STM32F103ZET6的RAM是64K,FLASH512K,所以我们能在keil的IRAM1中配置的最大值就是0x10000,这里的IROM1也要改一下,改成0x80000。
在这里插入图片描述
配置好在编译就没撒问题了。

现在我们就是来弄懂这个IROM1,和IRAM1。
在正点原子的论坛里有人就提出问题,问了这3个地方到底是什么意思和作用?
在这里插入图片描述
在这里插入图片描述
这三处的意思和作用:
1,IROM1,前面是首地址,后面是大小,表示FLASH(代码存储区间)的起始地址和大小。
2,IRAM1,前面是首地址,后面是大小,表示RAM(变量存储区)的起始地址和大小。
3,RAM for Algorithm是用来在IRAM1区域划分一段空间,用来运行flash下载算法(可理解为一个程序),从而给MCU下载代码。但是这个空间只在下载代码的时候有用,下载完了代码以后,这段空间就可以被你的APP代码(你下载的代码)占用的,相当于释放了。

  • 17
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值