Flash y EEPROM

14

La hoja de datos de Atmega16 dice que tiene

a) 16 Kbytes de memoria de programa Flash autoprogramable en el sistema yb) 512 Bytes EEPROM.

¿Puede un microcontoller tener dos ROM separadas que se pueden programar a través de la tecnología EEPROM y la tecnología Flash?

¿O es incorrecta mi inferencia (como se indicó anteriormente) de la hoja de datos?

Sé que nuestro programa está almacenado en la memoria flash, ¿por qué alguien necesitará EEPROM? ¿De qué sirve si tenemos memoria flash para el programa?

También, ¿alguien puede explicar cuál es el término "auto-programable en el sistema"?

Lo que sé: la tecnología Flash puede escribir el programa en bloques de datos, mientras que EEPROM puede escribir datos byte a byte.

Jasser
fuente

Respuestas:

21

Hoy en día, la memoria Flash se usa para guardar el código del programa, y ​​la EEPROM (memoria de solo lectura borrable eléctricamente) se usa para guardar datos persistentes. Hace unos 30 años, antes de que apareciera Flash, las EEPROM se usaban para contener el código del programa.

En realidad, ROM (memoria de solo lectura) vino primero, luego PROM (ROM programable, solo una vez), EPROM (PROM borrable con luz UV), EEPROM y finalmente Flash. Las ROM todavía se usan para aplicaciones de muy alto volumen y bajo costo (por ejemplo, tarjetas de felicitación parlantes).

La diferencia importante con los microcontroladores actuales es que generalmente no se puede ejecutar código desde EEPROM, y es incómodo que los programas almacenen datos en flash. (Los datos se almacenan en flash cuando, por ejemplo, utiliza la palabra clave "const" en una declaración de datos, o define una cadena, pero el compilador y el vinculador se encargan de ocultarlos).

El área EEPROM se puede usar para mantener la configuración u otros datos que desea que estén disponibles en los reinicios, incluso si el microcontrolador ha perdido energía y luego se vuelve a encender. Funcionalmente, puede pensar en la EEPROM como un disco duro muy pequeño o una tarjeta SD.

En los microcontroladores sin EEPROM, es posible almacenar datos persistentes en la memoria flash, pero esto se vuelve difícil ya que los microcontroladores realmente no fueron diseñados para esto, y debe encontrar un lugar especial que no interfiera con el código del programa, y ​​dejar esto a un lado con el enlazador Además, como se menciona a continuación, generalmente puede actualizar la EEPROM muchas veces más que el flash.

Si programa los datos en flash, esto no significa que puede acceder a los datos como variables en su programa C, porque no hay forma de decirle al compilador dónde están estas variables en su código (es decir, no puede vincular una constante variable a esta área de flash.) Entonces, leerlos debe hacerse a través del conjunto especial de registros que se utilizan para escribirlos. Tenga en cuenta que esta restricción se aplica a los datos en EEPROM también, por lo que no tiene ninguna ventaja a este respecto.

Para programar flash o EEPROM, primero se debe borrar un bloque de memoria. Entonces se programa. Para flash, la escritura generalmente también se realiza un bloque a la vez. Para EEPROM, se puede hacer por bloques o un byte a la vez, dependiendo del microcontrolador.

Tanto para flash como para EEPROM, hay un número máximo de veces que puede actualizarlas antes de agotar la memoria. Este número se proporciona en la hoja de datos como un valor mínimo garantizado. Por lo general, es mucho más alto para EEPROM que para memoria flash. Para flash, he visto números tan bajos como 1000. Para EEPROM, he visto números tan altos como 1,000,000.

Una ventaja de las EEPROM sobre el flash es que puede borrarlas muchas veces más de lo que puede borrar el flash.

"Autoprogramable en el sistema" simplemente significa que el microcontrolador puede actualizar su propio flash mientras se ejecuta. La característica generalmente se usa para actualizar el código en el campo. El truco es que debe dejar algo de código en el sistema mientras se actualiza el programa principal, llamado cargador de arranque. Este esquema se utiliza en el sistema Arduino para programar el chip.

tcrosley
fuente
Gracias por su respuesta señor. Entonces, para ingresar datos dentro de EEPROM, ¿necesitaré un programador EEPROM como en un programador USBASP para volcar el programa dentro de la memoria flash? Estoy en lo cierto señor.
Jasser
1
@Jasser No, no necesitas un programador externo. Accederá a la EEPROM desde su programa. Habrá un conjunto de registros dentro de ATmega que, al escribirles, le permitirá actualizar la EEPROM. También necesitará usar estos registros para leer la EEPROM, ya que no se mostrará en el mapa de direcciones normal. La información sobre cómo borrar, escribir y leer la EEPROM estará en la hoja de datos del chip.
tcrosley
Como podemos escribir o leer desde la EEPROM dentro del microcontrolador, el microcontrolador debería tener un circuito para almacenar datos dentro de la EEPROM y eso debería ser similar al programador EEPROM. Esto nuevamente me lleva a otra pregunta que, dado que EEPROM se puede escribir aproximadamente 100,000 veces después de eso, es posible que no podamos almacenar datos dentro de EEPROM a través de los registros. ¿Son significativas estas afirmaciones? @tcrosley
Jasser
1
@Jasser Correcto, hay un límite en la cantidad de veces que puede actualizar la EEPROM. Esto suele ser mucho más alto (a veces un orden de magnitud más) que la cantidad de veces que puede actualizar el flash. Debería haber mencionado eso en mi respuesta, y lo actualizaré. El número que citó es un mínimo garantizado por el fabricante del chip; Hice algunas pruebas una vez con un chip que se especificó para 100,000 escrituras, y superó las 500,000 antes de que se detectaran errores.
tcrosley
1
@Jasser Sí, es un poco más difícil configurar los datos en flash. Además, como se discutió en mi actualización de mi respuesta, puede borrar y reprogramar la EEPROM muchas veces más (generalmente 10x) que el flash.
tcrosley
4

Agregaré más información a la excelente respuesta de @tcrosley.

El ATmega16 implementa una arquitectura de Harvard , es decir, una topología del sistema donde la memoria de datos se separa de la memoria del programa. Citando el párrafo relevante de la hoja de datos de Atmega16 (página 8):

Para maximizar el rendimiento y el paralelismo, el AVR utiliza una arquitectura de Harvard, con memorias y buses separados para el programa y los datos. Las instrucciones en la memoria del programa se ejecutan con una canalización de un solo nivel. Mientras se ejecuta una instrucción, la siguiente instrucción se obtiene previamente de la memoria del programa. Este concepto permite ejecutar instrucciones en cada ciclo de reloj. La memoria del programa es memoria flash reprogramable en el sistema.

La arquitectura de Harvard tiene la ventaja de no tener contención de bus entre los ciclos de obtención de instrucciones y los ciclos de acceso a datos, ya que los datos y las instrucciones no comparten el mismo bus, como en la arquitectura de PC convencional.

Por lo tanto, la memoria flash se usa como memoria de programa, mientras que la memoria de datos se divide entre SRAM (para datos transitorios, como la pila de llamadas de función y el montón, si está programando en C, por ejemplo) y la EEPROM (para almacenamiento permanente) .

Lorenzo Donati apoya a Monica
fuente