¿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 utilizando PROGMEM . ¿Cuáles son las consecuencias positivas y negativas de almacenar grandes variables en Flash (usando PROGMEM) vs SRAM vs EEPROM en el Arduino?

    
pregunta

3 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 a Due, Leonardo, Arduinos más antiguos y algunas otras tablas compatibles).

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

Por lo tanto, la principal consecuencia negativa hipotética de usar PROGMEM es el límite del 10,000 ciclos de escritura . La consecuencia negativa clave de utilizar EEPROM es la complejidad del código para leer / escribir / copiar datos. SRAM, es muy limitado en capacidad .

    
respondido por el Anindo Ghosh
2

La principal implicación es que no puede modificar la información almacenada en PROGMEM. También recibirás un impacto 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 hacer cambios en su programa, tendría que reprogramar el FLASH de todos modos.

Con la introducción de IDE 1.x se incluyó la macro F (). Esto hace que sea más fácil mantener cadenas en PROGMEM.

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

Ahora puedes usar:

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

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

    
respondido por el baldengineer
1

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

Respecto a EEPROM: intente guardar esto para cosas persistentes. IIRC es más lento recuperar 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.

    
respondido por el Manishearth

Lea otras preguntas en las etiquetas