¿Puedo escribir en la memoria Flash usando PROGMEM?

11

En la documentación de Arduino, cito:

http://playground.arduino.cc/Learning/Memory Nota: la memoria Flash (PROGMEM) solo se puede completar en el momento de grabación del programa. No puede cambiar los valores en el flash después de que el programa haya comenzado a ejecutarse.

Y en la descripción de PROGMEM:

http://arduino.cc/en/Reference/PROGMEM Almacene datos en la memoria flash (programa) en lugar de SRAM. Hay una descripción de los diversos tipos de memoria disponibles en una placa Arduino.

La palabra clave PROGMEM es un modificador variable, debe usarse solo con los tipos de datos definidos en pgmspace.h. Le dice al compilador que "ponga esta información en la memoria flash", en lugar de en la SRAM, donde normalmente iría.

Entonces, ¿podemos o no podemos? ¿O no es lo mismo?

zzarbi
fuente
Si bien puede escribir en la memoria del programa (flash) en tiempo de ejecución (a menos que esté bloqueado), el proceso es un poco más complicado y no se puede lograr con la directiva PROGMEM, que básicamente solo controla el proceso de asignación. Si quieres ver cómo se puede hacer, mira la fuente del gestor de arranque.
Chris Stratton
Los bloques de escritura de página no hacen que la escritura en flash no sea práctica. De hecho, es algo que esperaba.
Anothercg Gmail el

Respuestas:

9

La respuesta corta es no: los datos de PROGMEM son de solo lectura.

Limitaciones de la memoria flash
Lo primero que hay que entender es que la memoria Flash (donde vive el espacio del programa) está diseñada para almacenamiento fijo a largo plazo. Leerlo es muy rápido y preciso. Sin embargo, en términos generales, no puede modificarlo byte a byte (por ejemplo, cambiar una variable específica). Por lo general, debe borrarlo y volver a escribirlo en bloques grandes. Eso lo hace completamente poco práctico para la manipulación en tiempo de ejecución, ya que tendría que almacenar mucha información redundante en otro lugar mientras realiza el ciclo de borrado y escritura.

Lo que PROGMEM hace realmente
Cualquier dato literal especificado en su código (como cadenas y números) siempre reside en el espacio del programa al principio (es decir, en Flash). Sin embargo, cuando su boceto realmente quiere usar esos datos en tiempo de ejecución, normalmente tiene que asignar algo de espacio en SRAM y copiarlo. Eso significa que terminas con dos copias: el original fijo en Flash y la copia temporal en SRAM.

Cuando usa el modificador PROGMEM, le está diciendo que no haga esa segunda copia en SRAM. En cambio, su boceto simplemente accederá al original en Flash. Eso es muy útil si solo tiene que leer los datos, ya que evita las operaciones de asignación y copia.

Sin embargo, copiarlo a SRAM es esencial si desea modificar los datos. Además de las limitaciones de Flash que mencioné anteriormente, también es una cuestión de seguridad de código.

Si puede modificar los datos almacenados en el espacio del programa, entonces, lógicamente, también podría modificar el código almacenado en el espacio del programa. Eso significaría que un simple error (o en teoría un ataque malicioso) podría dar como resultado que su boceto se reescriba parcial o totalmente en tiempo de ejecución. Esto podría tener resultados muy impredecibles, que van desde simplemente dejar de trabajar, hasta dañar / destruir cualquier equipo conectado.

Más información
Puede obtener más información sobre las cosas de PROGMEM de bajo nivel desde aquí:

Una versión anterior del mismo tutorial de PROGMEM está disponible aquí:

Peter Bloomfield
fuente