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

奈何col 发表于 2021-2-2 17:30

使用PROGMEM将数据存储在Flash中

本文将编入《Arduino程序设计基础(第3版)》,转载请注明出处

## 将数据存储在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空间。

Highnose 发表于 2021-2-2 21:08

讲的真好,看很多例程都有F()函数,一直搞不明白,就想问这个F(),这下解惑搞明白了:victory:

逐日 发表于 2022-2-10 08:41

看起来还是得精打细算

jiangguoxin 发表于 2022-6-17 14:32

请教楼主:有没有什么方式可以把动态变量数据(大量,内存不够存)存储到Flash中?

奈何col 发表于 2022-9-4 03:16

jiangguoxin 发表于 2022-6-17 14:32
请教楼主:有没有什么方式可以把动态变量数据(大量,内存不够存)存储到Flash中? ...

不加const 就行了,flash寿命有限(写1万次)且写数据相较于RAM慢很多,你要当动态变量,很可能过一段时间就坏了。。。
页: [1]
查看完整版本: 使用PROGMEM将数据存储在Flash中