ram存储局部静态变量,静态ram内容可以永久保存吗

首页 > 实用技巧 > 作者:YD1662024-01-18 04:38:12

在用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语言微库:

ram存储局部静态变量,静态ram内容可以永久保存吗(1)

选择是否使用C语言微库

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

ram存储局部静态变量,静态ram内容可以永久保存吗(2)

选择编译器编译优化等级

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

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

ram存储局部静态变量,静态ram内容可以永久保存吗(3)

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

其中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空间供我们程序运行使用。

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.