keil查看程序运行时间_Keil编译报错 No space in execution regions ,3个方法搞定

在用Keil进行嵌入式软件开发的过程中,有时候编译会出现这么一个错误:Error: L6406E: No space in execution regions with .ANY selector matching。这个错误是怎么产生的呢?

出现这个错误的原因就是我们选的这款MCU的ROM或者RAM的空间不够用了。这时候有两种思路:第一种就是重新选择ROM和RAM更大型号的MCU,优先选择PINTOPIN的的,这样硬件不需要改动,工作量最小;另一种思路就是对现有的代码进行裁剪和优化。

需要特别提醒的是,选择更大ROM和RAM型号的单片机,并不仅仅是在KEIL软件中的DEVICE中选择更大的空间的芯片型号,而是你的电路板上实物的单片机也要进行更换,否则即使你在KEILL中编译通过了,但还是不能将编译生成的固件下载到原来的单片机里边。

对现有代码进行裁剪和优化的方法也很多。我们可以首先对KEIL软件自身的C语言库改成选择使用C语言微库:

8fc437650b7a7e1495943f2908e02f9e.png

选择是否使用C语言微库

选择更高的优化等级,编译器会根据我们选择的优化等级进行优化,随着优化等级的升高,也更容易在运行中出现意想不到的错误。所以优化等级要在功能可靠的前提下进行选择,尽量不要高等级优化。

906719f37be1ac6aa446a006d8f23558.png

选择编译器编译优化等级

其中Level 0的优化等级最低,Level3的优化等级最高,随着优化等级的增加,调试信息就会越来越少,你会发现仿真调试的时候很多地方不能再打断点,或者断点打在了其他位置的相同代码处。

最后就是对我们自身的代码进行优化。在优化之前我们最好先弄清楚到底是RAM不够用还是ROM不够用造成了。怎么看呢?可以从我们编译生成的map文件中或编译后Command窗口查看,以51单片机为例,如下图所示:

e4066153c1f0101e8d1fe63ad7c68384.png

编译生成的各部分所占空间大小

其中data,edata+hdata都是存放在RAM区,静态变量const和代码code存放在ROM区。所以大家也就知道RAM和ROM当前有多少数据了,是否超过了我们选择的MCU的容量的大小。

如果是STM32的话,那么信息是这种形式:

Program Size: Code=13520 RO-data=12716 RW-data=512 ZI-data=31776

其中Code 和RO-data存放在ROM,RW-data和ZI-data存放在RAM。但是所占用的ROM空间的大小是Code,RO-data,RW-data之和,因为RW-data在上电之初会从ROM读取到RAM。占用的RAM大小是RW-data和ZI-data之和。

有的朋友说,我前面两种方法都试过了,结果还是不行。那就要手动对我们代码进行优化了,如果是ROM问题,那就只能精简代码;如果是RAM问题,可以将一些全局变量,尤其是全局数组变量,看能否换成局部变量使用,使用后这些变量会及时释放掉。也可以将一部分初始化后不再改写的变量用const进行修饰,这样这部分变量就会存储在ROM区,从而节省一部分RAM空间供我们程序运行使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值