使用PROGMEM将数据存储在Flash中-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7836|回复: 4

[拓展] 使用PROGMEM将数据存储在Flash中

[复制链接]
发表于 2021-2-2 17:30 | 显示全部楼层 |阅读模式
本文将编入《Arduino程序设计基础(第3版)》,转载请注明出处

[md]## 将数据存储在Flash中

通常程序在调用变量时,会在RAM中分配一段存储空间用于存储该变量,Arduino的RAM资源有限,如果没有合理利用,可能造成程序运行错误。
编译器在编译时也会预计RAM使用量,如若超出则会有如下提示:

> 项目使用了 11734 字节,占用了 (36%) 程序存储空间。最大为 32256 字节。
> 全局变量使用了2612字节,(127%)的动态内存,余留-564字节局部变量。最大为2048字节。

相对于RAM空间,Flash虽然读写速度较慢,但存储空间更大,当项目遇到RAM空间不足时,如果利用好更大的Flash空间,即可释放出相应的RAM空间。  

在本书LCD驱动章节,通过图片取模获得了一个较大的数组变量,示例中使用了`PROGMEM`定义了存储图片的变量,从而使该变量存储在Flash中。

关键字`PROGMEM`是一个变量修饰符,使用该修饰符可实现将变量存储在Flash空间内,而不占用RAM空间。  

使用方法如下:  
```
const 数据类型 变量名[] PROGMEM = {data0, data1, data3…};
```
需要注意的是,通常使用PROGMEM的变量,需要是全局变量。如果在局部变量中使用,需要添加static关键字,将变量定义为静态变量,方法如下:
```
const static 数据类型 变量名[] PROGMEM = {data0, data1, data3…};
```

### F() 宏函数

对于一些需要输出的长文本字符串,可以使用Arduino提供的`F()`宏函数,以达到和使用`PROGMEM`一样的效果。如:

```
Serial.print("Early to bed early to rise makes a man healthy wealthy and wise");
```
可修改为:
```
Serial.print(F("Early to bed early to rise makes a man healthy wealthy and wise"));
```
即可将变量存储到Flash中,以节省RAM空间。[/md]

发表于 2021-2-2 21:08 | 显示全部楼层
讲的真好,看很多例程都有F()函数,一直搞不明白,就想问这个F(),这下解惑搞明白了
发表于 2022-2-10 08:41 | 显示全部楼层
看起来还是得精打细算
发表于 2022-6-17 14:32 | 显示全部楼层
请教楼主:有没有什么方式可以把动态变量数据(大量,内存不够存)存储到Flash中?

点评

不加const 就行了,flash寿命有限(写1万次)且写数据相较于RAM慢很多,你要当动态变量,很可能过一段时间就坏了。。。  详情 回复 发表于 2022-9-4 03:16
 楼主| 发表于 2022-9-4 03:16 | 显示全部楼层
jiangguoxin 发表于 2022-6-17 14:32
请教楼主:有没有什么方式可以把动态变量数据(大量,内存不够存)存储到Flash中? ...

不加const 就行了,flash寿命有限(写1万次)且写数据相较于RAM慢很多,你要当动态变量,很可能过一段时间就坏了。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 03:53 , Processed in 0.155681 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表