使用 PROGMEM 有何影响?

电器工程 Arduino 固件 记忆
2022-01-21 01:59:43

对于大量文本变量,我发现有必要使用PROGMEM将它们存储在闪存中。在 Arduino 上将大变量存储在 Flash(使用 PROGMEM)、SRAM 和 EEPROM 中的积极和消极后果是什么?

3个回答

这是 AtMega328 上的 FLASH、EEPROM 和 SRAM 的快速比较,AtMega328 是当前许多 Arduino 板(不包括 Due、Leonardo、旧 Arduino 和一些其他兼容板)中的微控制器。

  • 闪存:10,000 次写入/擦除周期。访问速度很快,但比 SRAM 慢。代码通过PROGMEM.
  • EEPROM:100,000 次写入/擦除周期。访问速度很慢,以毫秒为单位。存取程序比较复杂。
  • SRAM:无限的写/擦除周期。访问速度非常快,2 个时钟周期。通过代码直接访问。

因此,使用 PROGMEM 的关键假设负面后果是10,000 次写入周期限制。使用 EEPROM 的主要负面后果是读取/写入/复制数据的代码的复杂性。SRAM,只是容量非常有限

主要含义是您不能修改存储在 PROGMEM 中的信息。您还将受到(非常小的)性能影响,因为字符串需要一次复制 1 个字节。

FLASH 的磨损不是(主要)问题,因为为了对您的程序进行更改,无论如何您都必须重新编程 FLASH。

在 IDE 1.x 中引入了 F() 宏。这使得将字符串保存在 PROGMEM 中变得更容易。

例如,不要使用: Serial.print("Hello World!");

您现在可以使用:

Serial.print(F("Hello World!");

请注意, F() 不是函数,它只是一个宏,因此它的使用受到一定限制。

PROGMEM 最适合用于不可变数据。如果您要保持快速变化的变量,我会将其存储在 SRAM 中。另一方面,如果您想要一些不会经常获取的不可变文本变量(例如要显示的内容),PROGMEM 是一个好主意。

关于 EEPROM - 尝试将其保存为持久性的东西。IIRC 通过 SRAM/PROGMEM 从 EEPROM 获取数据的速度较慢。通常我(和其他人)在使用之前将数据从 EEPROM 复制到 SRAM(甚至官方示例也是这样做的)。