MCU: guardar datos directamente en flash. ¿Cuál es la ventaja?

Sé que en algunas MCU es posible guardar datos directamente en la memoria del programa (memoria flash). El compilador AVRGCC usa la tecla "PROGMEM", MPLAB C18 usa una similar con el mismo efecto. Sin embargo, ¿cuál es la ventaja de tener datos en la memoria del programa?

¿Quizás porque esas MCU tienen una arquitectura Harvard y, por lo tanto, leer datos de la memoria del programa es más rápido que leerlos de la memoria de datos? ¿Es "realmente mucho más rápido" que vale la pena usarlo?

¡Gracias!

Respuestas (3)

Estos microcontroladores tienen una memoria RAM muy limitada. Entonces, si desea una tabla de búsqueda, tiene sentido almacenar los datos grandes y constantes en la memoria flash del programa en lugar de la preciosa RAM.

Es importante tener en cuenta que SIEMPRE almacenará las constantes y el resto del programa en flash. Depende de usted si usted/adicionalmente/almacena los datos en RAM.

Tiene dos opciones para datos constantes en estos microcontroladores flash.

  1. Cargue desde flash cuando sea necesario (PROGMEM)
  2. Cargue desde flash a ram al iniciar el programa (no PROGMEM). El compilador de C hace esto por usted automáticamente si olvida usar PROGMEM porque los datos normalmente se leen/escriben en C.

Es mucho más lento cargar datos desde la memoria del programa en comparación con la carga desde la RAM, pero cuando solo tiene 128 bytes de RAM y los datos deben almacenarse en el flash de todos modos, vale la pena.

Los AVR también tienden a tener, digamos, 128 bytes de EEPROM y cualquier memoria flash que no necesite para su programa. Luego, el microcontrolador puede programar su propia memoria flash para guardar mediciones y configuraciones. La memoria flash es más abundante que la EEPROM pero, a diferencia de la EEPROM que generalmente parece ser reescribible 1 byte a la vez, la memoria flash debe borrarse y reescribirse en bloques.

Si una MCU no tiene un área EEPROM separada para guardar datos, entonces sí, puede guardar datos persistentes en un área de la memoria flash que no usa el código del programa. Esto solo es bueno para los datos que se actualizan con poca frecuencia (como los datos de configuración o las preferencias del usuario), ya que hay un límite en la cantidad de veces que puede reescribir el flash (generalmente un mínimo de 10,000 ciclos de borrado/escritura). La ventaja de guardar datos de esta manera es que no se perderán cuando la MCU se quede sin energía. Sin algún tipo de almacenamiento no volátil, necesitaría tener una memoria RAM respaldada por batería para guardar datos durante el corte de energía.

La segunda razón para permitir que un programa escriba en la memoria flash es que permite que los programas se actualicen de forma remota en el campo. Para hacer esto, necesita que una parte del programa sea residente todo el tiempo (la parte que escribirá el nuevo código en la parte actualizable de la memoria flash) y un medio para descargar el código actualizado (por ejemplo, Bluetooth, celular). , etc.). Desea asegurarse de que la parte del código que siempre reside esté libre de errores en la medida de lo posible, ya que es más difícil actualizarla.

La "segunda razón" generalmente se llama gestor de arranque.