MDK-5 Keil uVision5 链接时提示空间不够(Error: L6406E)

在项目开发中添加了新的库后导致BUILD工程时提示:Error: L6406E:No space in execution regions with .ANY selector…

解决方法一:

以更精简短小的C库替代标准库,减小代码大小,打开Project->Options for Target ''xxx"->Target,将Use MicroLIB前面的复选框勾上。如下图:
MDK-5 Keil uVision5 链接时提示空间不够(Error: L6406E)_第1张图片
修改后的确可以在编译时通过,生成了hex文件,但实际下载hex文件后,导致不能运行,应该是微库替换了标准库后引起的。

方法二:修改优化级别

选择更高的优化等级,让编译器自动减小代码大小。打开Project->Options for Target ''xxx"->C/C+±>Optimization 其中有O0~O3三个优化级别,可以选择O3
MDK-5 Keil uVision5 链接时提示空间不够(Error: L6406E)_第2张图片修改后还是无法通过编译。

方法三:检查项目代码

检查代码中关于内存的定义,在malloc.h 文件中找到了关于内存池mem1大小的定义,减少其值的大小,修改后顺利通过编译

#define MEM1_MAX_SIZE 	64*1024

只能在原有的基础上稍微减少MEM1_MAX_SIZE的大小,否则在项目中使用到MEM1内存池的时候,会导致malloc不到足够的内存。

如果修改MEM1_MAX_SIZE会引发其它的问题话,建议分析项目.map文件,重点看Image compnet sizes信息,着重查找一些ZI Data 比较大的.o文件,找到这个.c文件,将其中定义的大容量的全局变量数组减小。
在这里插入图片描述
关于arm可执行文件中包含的3部分:RO段、RW段和zI段
RO size 是程序中的指令和常量(readonly) ,其中包括用const定义的常量
RO size = (Code + RO Data)
RW Data 是程序中的已初始化变量(read/write)
ZI data 是程序中的零初始化的变量(zero)
RW size = (RW Data + ZI DATA)
注意RO SIZE 和 RO Data , RW SIZE 和 RW Data之间的区别。

Total ROM Size (Code + RO Data + RW Data)是指所写的程序占用的ROM的字节总数,也就是说程序所下载到ROM flash 中的大小。为什么Rom中还要存RW,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,而RW是程序中的已初始化的变量,所以每次这些固定的值就是存储在Rom中的,为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

你可能感兴趣的:(STM32开发)