Error: L6406E: No space in execution regions with .ANY selector matching lcd.o(.text).片外SRAM编译报错

RT-Thread移植u8g2出现No space in execution regions的分析以及初始化相同优先级线程后第一次调度的机制

better_coder

发布时间 2021.03.09阅读数 659评论数 0

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先运行。  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值