¿Cuáles son las implicaciones de usar PROGMEM?

12

Con grandes cantidades de variables de texto, he encontrado que es necesario almacenarlas en la memoria Flash usando PROGMEM . ¿Cuáles son las consecuencias positivas y negativas de almacenar grandes variables en Flash (usando PROGMEM) vs SRAM vs EEPROM en el Arduino?


fuente

Respuestas:

10

Aquí hay una comparación rápida de FLASH, EEPROM y SRAM en el AtMega328, el microcontrolador en muchas de las placas Arduino actuales (excluyendo Due, Leonardo, Arduinos antiguos y algunas otras placas compatibles).

  • FLASH: 10,000 ciclos de escritura / borrado. El acceso es rápido, pero más lento que SRAM. Código de accesos a través de PROGMEM.
  • EEPROM: 100,000 ciclos de escritura / borrado. El acceso es muy lento, en milisegundos. Procedimiento de acceso relativamente complejo.
  • SRAM: ciclos de escritura / borrado ilimitados. El acceso es muy rápido, 2 ciclos de reloj. Acceso directo por código.

Entonces, la consecuencia negativa hipotética clave del uso de PROGMEM es el límite del ciclo de escritura de 10,000 . La consecuencia negativa clave del uso de EEPROM es la complejidad del código para leer / escribir / copiar datos. SRAM, tiene una capacidad muy limitada .

Anindo Ghosh
fuente
¿Dónde obtiene la información sobre el acceso EEPROM? Desde un poco de mirar alrededor , parece que la EEPROM lee toma algo así como ciclos de reloj ~ 5. Escribir es lento, pero no leer.
Connor Wolf
OP quiere almacenar muchas cosas.
Anindo Ghosh
Sí, pero ¿es eso escribir una vez, leer muchas o lo contrario? Las "variables de texto" son probablemente algo que se especifica en el momento de la compilación, se graba en el dispositivo y nunca cambia después de eso (por ejemplo, texto del menú o sommat).
Connor Wolf
Leí la tienda en la pregunta como "almacenar en tiempo de compilación / carga". Si una variable está destinada a ser utilizada lectura / escritura en tiempo de ejecución, definitivamente no debe almacenarse en FLASH. ¿No existe la restricción adicional de que FLASH no se puede modificar sin borrar primero toda la página?
microtherion
... variables de texto no constantes de cadena.
Anindo Ghosh
2

La implicación principal es que no puede modificar la información almacenada en PROGMEM. También recibirá un golpe de rendimiento (muy pequeño) ya que la cadena debe copiarse 1 byte a la vez.

El desgaste del FLASH no es una preocupación (principal) ya que para realizar cambios en su programa, de todos modos, tendría que reprogramar el FLASH.

Con la introducción IDE 1.x se incluyó la macro F (). Esto facilita mantener cadenas en PROGMEM.

Por ejemplo, en lugar de usar: Serial.print ("Hello World!");

Ahora puedes usar:

Serial.print (F ("¡Hola, mundo!");

Tenga en cuenta que F () no es una función, es solo una macro, por lo que su uso es algo limitado.

Baldengineer
fuente
1

PROGMEM se utiliza mejor para datos inmutables. Si va a seguir cambiando rápidamente las variables, simplemente lo almacenaría en la SRAM. Por otro lado, si desea tener algunas variables de texto inmutables (por ejemplo, cosas para mostrar) que no se recuperarán con demasiada frecuencia, PROGMEM es una gran idea.

Con respecto a EEPROM, intente guardar esto para cosas persistentes. IIRC es más lento para obtener datos de EEPROM sobre SRAM / PROGMEM. Por lo general, yo (y otros) copio datos de EEPROM a SRAM (incluso el ejemplo oficial hace esto) antes de usarlo.

Manishearth
fuente