Error: L6406E: No space in execution regions with .ANY selector matching

问题描述

1  

今天往stm32f407的工程里面加入了u8g2这个12864点阵液晶的驱动库的时候,compile编译的时候没有问题,但是链接link的时候出现了错误,报了Error: L6406E: No space in execution regions with .ANY selector matching这个错误,经过老师点拨,终于明白,并且学习到了新知识  


解决及原因

这个是因为u8g2作为一个驱动库,包含了一些超级大字库文件,其中有个文件大小足足有25M但是实际上我们只用了字库中一部分字体而已,如果整个文件进行编译链接就是内存空间的极大浪费。

2  

整个工程编译之后的数据量远远超过了芯片的内置flash大小,所以程序放不进芯片flash了,因此我们需要做的是对代码进行高级优化。对keil5设置进行如下更改:  3   4  

调整keil5里面的这个选项之后,编译器就会对代码进行优化未优化的时候编译器会把整个文件进行编译链接并且放到芯片的flash中,而经过高级优化之后,编译器会自动识别在这个文件中用到的东西才会进行编译,没有用到的部分就不会进行编译了。去掉那些没有用到的数据之后再进行编译链接的话数据量就会小很多。  


最终编译结果(problem solved)

5  

Level0-3的优化等级逐渐提高,但是随着优化等级提高了,程序的可调试性逐渐变差,所以大家谨慎选择哦。 以后大家遇到这种类似的超大型文件的时候也可以尝试通过这个编译选项进行调整哦~  


初始化相同优先级线程后第一次调度的机制

现象

首先在sample在初始化函数里面创建线程1和线程2这2个线程,初始化为相同的优先级 (注意,这里是先创建的线程1,再创建的线程2)   6  

然后进入调试模式,在线程1和线程2的函数入口打断点

  7   8  

结果发现每次debug调用这个sample的时候,总是会停在线程1的入口断点那里  

原因

固有观念来看,2个相同优先级的线程在刚开始的时候应该是等概随机调用的。然而 实际上,线程1初始化完成之后就进入就绪队列了,但是线程2可能都没初始化完成,所以在就绪队列里面肯定是线程1排在线程2的前面,因此进入线程调度之后肯定是先线程1先运行。  


                                               (づ ̄3 ̄)づ╭❤~一键三连,这次一定(๑•̀ㅂ•́)و✧ 

QQ图片20210126200222