使用PROGMEM有什么含义?


12

对于大量的文本变量,我发现有必要使用PROGMEM将它们存储在闪存中。在Arduino上将大变量存储在Flash中(使用PROGMEM),SRAM和EEPROM有什么正面和负面影响?

Answers:


10

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

  • 闪存:10,000个写入/擦除周期。访问速度快,但比SRAM慢。通过进行代码访问PROGMEM
  • EEPROM:100,000个写入/擦除周期。访问时间(以毫秒为单位)。相对复杂的访问过程。
  • SRAM:无限的写/擦除周期。访问速度非常快,需要2个时钟周期。通过代码直接访问。

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


您从哪里获得有关EEPROM访问的信息?从一点 ,看起来EEPROM 读取大约需要5个时钟周期。写作很慢,但没有阅读。
康纳·沃尔夫

OP希望存储很多东西。
Anindo Ghosh 2014年

是的,但是那是一次写入,多次读取还是相反?“文本变量”很可能是在编译时指定的,已刻录到设备中,之后再也没有更改(例如,菜单文本或Sommat)。
康纳·沃尔夫

我将问题中的存储读取为“在编译/上传时存储”。如果要在运行时以读写方式使用变量,则绝对不应将其存储在FLASH中。是否没有附加的限制,即如果不先擦除整个页面就不能修改FLASH?
microtherion 2014年

...文本变量 不是字符串常量。
Anindo Ghosh 2014年

2

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

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

在IDE 1.x引入中,包含了F()宏。这样可以更轻松地将字符串保留在PROGMEM中。

例如,而不是使用:Serial.print(“ Hello World!”);

您现在可以使用:

Serial.print(F(“ Hello World!”);

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


1

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

关于EEPROM-尝试将其保存以备不时之需。IIRC通过SRAM / PROGMEM从EEPROM读取数据的速度较慢。通常,我(和其他人)在使用数据之前先将数据从EEPROM复制到SRAM(即使是官方示例也是如此)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.