当前位置:首页 > 实用技巧 >

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

来源:原点资讯(www.yd166.com)时间:2024-01-18 04:38:12作者:YD166手机阅读>>

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

栏目热文

串行内存变量定义(内存变量的命名规则是什么)

串行内存变量定义(内存变量的命名规则是什么)

什么?阿圆你又拿什么奇葩东西来忽悠我们!哈哈,阿圆今天本来是在认真调试代码,调试到外部SDRAM时搞了好久,郁闷之间忽悠...

2024-01-18 05:13:23查看全文 >>

ram芯片的地址范围怎样算

ram芯片的地址范围怎样算

中央处理器(CPU):刚跟大家讲过,需要提醒的是MCS-51的CPU能处理8位二进制数或代码。CPU是单片机的主要核心部...

2024-01-18 04:58:04查看全文 >>

如何区分堆栈寻址和内存块寻址(内存的存储容量和寻址范围的计算)

如何区分堆栈寻址和内存块寻址(内存的存储容量和寻址范围的计算)

什么叫寻址方式?寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM的寻址方式ARM处理器具有8种...

2024-01-18 05:06:15查看全文 >>

怎么求ram芯片的寻址范围(dram芯片的最小引脚数目怎么算)

怎么求ram芯片的寻址范围(dram芯片的最小引脚数目怎么算)

执行任何一条指令都需要使用操作数。寻址方式就是根据指令中给出地址寻找操作数地址的方式。根据指令操作的需要,计算机有多种寻...

2024-01-18 04:55:25查看全文 >>

寻址为16k*8的ram需要几根地址线(16根地址线的寻址范围)

寻址为16k*8的ram需要几根地址线(16根地址线的寻址范围)

IPv6在网络地址空间、服务质量、安全性、路由汇聚等方面比起IPv4有了很大改善,但其推广过程举步维艰,笔者认为目前制约...

2024-01-18 04:37:33查看全文 >>

奶茶太浓怎么处理(奶茶茶味太重怎么处理)

奶茶太浓怎么处理(奶茶茶味太重怎么处理)

近几年有此一说,认为牛奶加入茶中,牛奶中干酪素的蛋白质会破坏儿茶酚,降低保健功效。这是因为茶叶中含有鞣酸和草酸,前者会阻...

2024-01-18 04:52:41查看全文 >>

奶茶的脏污怎么洗(奶茶渍清洗妙招)

奶茶的脏污怎么洗(奶茶渍清洗妙招)

前几天,我在吃葡萄时,无意中发现了一个非常有趣的现象——很多人在清洗葡萄时,只用盐水洗,却不知道还有一个更好的方法。难道...

2024-01-18 04:57:45查看全文 >>

奶茶可以煮沸灭菌吗(奶茶能用开水烫吗)

奶茶可以煮沸灭菌吗(奶茶能用开水烫吗)

今日#竹筒奶茶发霉#登上微博热搜引发很多爱喝奶茶的网友关注有网友近日曝光浙江一处古镇景点奶茶店背后巷子里员工正在清洗霉变...

2024-01-18 04:53:33查看全文 >>

奶茶水质怎么处理(奶茶沉淀分层怎么办)

奶茶水质怎么处理(奶茶沉淀分层怎么办)

如果你的奶茶店开在了河南省,现在开始要注意用水风险了。近日,河南人大常委会审议了《河南省食品生产加工小作坊食品小经营店和...

2024-01-18 05:06:54查看全文 >>

奶茶用冷水泡了怎么办(奶茶用凉水没泡开怎么办)

奶茶用冷水泡了怎么办(奶茶用凉水没泡开怎么办)

现在街上形形色色的奶茶店可以说到处都是、所谓的品牌也的多数不清、年轻人的喜爱、而且价钱还不便宜、比自己在家里用新鲜水果捣...

2024-01-18 04:49:46查看全文 >>

文档排行