keil5编译超大字库类文件时遇到的Error: L6406E类错误
- 问题描述
- 解决及原因
今天在上嵌入式课程的时候遇到了一个新问题,特此写一篇博客记录一下。
问题描述
今天往stm32f407的工程里面加入了u8g2这个12864点阵液晶的驱动库的时候,compile编译的时候没有问题,但是link的时候出现了错误,报了Error: L6406E: No space in execution regions with .ANY selector matching
这个错误,经过老师点拨,终于明白,并且学习到了新知识
解决及原因
这个是因为u8g2作为一个驱动库,包含了一些超级大的字库文件,其中有个文件大小足足有25M,但是实际上我们只用了字库中一部分字体而已,如果整个文件进行编译链接就是内存空间的极大浪费。
整个工程编译之后的数据量远远超过了芯片的内置flash大小,所以程序放不进芯片flash了,因此我们需要做的是对代码进行高级优化。对keil5设置进行如下更改:
调整keil5里面的这个选项之后,编译器就会对代码进行优化,未优化的时候编译器会把整个文件进行编译链接并且放到芯片的flash中,而经过高级优化之后,编译器会自动识别在这个文件中用到的东西才会进行编译,没有用到的部分就不会进行编译了。去掉那些没有用到的数据之后再进行编译链接的话数据量就会小很多。
最终编译结果(problem solved):
Level0-3的优化等级逐渐提高,但是随着优化等级提高了,程序的可调试性逐渐变差,所以大家谨慎选择哦。
以后大家遇到这种类似的超大型文件的时候也可以尝试通过这个编译选项进行调整哦~
一键三连,这次一定~