¿Cuál es la vida real de EEPROM?


21

ATMEL dice que la vida útil de una celda EEPROM es de aproximadamente 100,000 ciclos de escritura / celda. ¿Es así como funciona la EEPROM en la naturaleza?

Si no cambio el valor de una celda, ¿esto enfatiza la vida útil? Por ejemplo, si escribo el valor 0xFFa la misma celda y otra vez, es esto diferente a la escritura 0x00, 0xFF, 0x00etc.

Respuestas:


19

Como usted dice, la EEPROM interna tiene una vida útil de 100,000 ciclos de escritura. Esto no es una suposición: una proporción muy significativa de ATmega328 alcanzará este número sin problemas. He probado tres procesadores antes, y todos alcanzaron 150,000 ciclos sin problemas.

Es importante tener en cuenta el modo de falla de EEPROM. La mayoría de los proyectos de "destructor EEPROM" leen / escriben repetidamente hasta que los datos no se escriben en absoluto. Antes de este punto, la EEPROM seguirá dañada. Esto se manifestaría si los datos no se retienen durante un período razonable. No es prudente confiar en nada más que 100,000 ciclos de escritura por este motivo.

EEPROM es diferente a la RAM en un ATmega. Escribir en él no es simple ni rápido, pero está envuelto en una biblioteca amigable de Arduino , ocultando esta complejidad al usuario.

El primer nivel de indirección es la biblioteca EEPROM , que es trivialmente simple], simplemente llamando a otras dos funciones para lectura y escritura. Esto llama eeprom_write_byte, que se encuentra aquí .

Esta función utiliza el ensamblaje en línea, por lo que es posible que no se entienda fácilmente. Sin embargo, hay un comentario que se entiende fácilmente:

Establecer modo de programación: borrar y escribir

Esto sugiere una de las complejidades de lidiar con EEPROM: para escribirle, primero debe borrarlo. Esto significa que si llama a EEPROM.write (), realizará un ciclo de escritura independientemente del valor que esté escribiendo.

Esto significa que escribir repetidamente 0xFF probablemente tendrá el mismo efecto que escribir 0xFF, 0x00,0xFF, 0x00, etc.

Hay formas de evitar esto: puede intentar llamar a EEPROM.read () antes de EEPROM.write () para ver si el valor ya es el mismo, pero esto lleva más tiempo.

Existen otras técnicas para evitar el desgaste excesivo de EEPROM, pero su uso depende de su aplicación.


3
Nivelación de desgaste para EEPROM: electronics.stackexchange.com/questions/60342/…
jippie

9

Una vez realicé un experimento en una EEPROM externa con 1 millón de ciclos nominales máximos. Tomó alrededor de 6 millones de ciclos para corromperse en gran medida, y antes de eso había progresado con cantidades esporádicas de corrupción.

Cuando dice que no cambia el valor, supongo que está escribiendo los mismos datos en una dirección varias veces. Esto casi seguramente estresará la vida, aunque probablemente no estresará las células circundantes.


2

http://hackaday.com/2011/05/16/destroying-an-arduinos-eeprom/

El Arduino fue enchufado a una verruga de la pared y se sentó "detrás de un sofá durante un par de meses". La EEPROM vio su primer error de escritura después de 47 días y 1.230.163 ciclos. Este es un orden de magnitud mejor que la especificación en la hoja de datos de atmel, pero similar a los resultados de experimentos similares.


Esto parece demasiado alto. Había oído hablar de 150k a 200k antes, pero nunca esto: o
asheeshr

55
El problema es que esto no detecta todos los modos de falla. Cuando la EEPROM se daña, lo que sucede es que el tiempo que retendrá los datos disminuirá gradualmente. Con 100.000 ciclos, Atmel garantiza 20 años de retención de datos. Más allá de esto, la retención de datos se reduce. Cuando se alcanzan los 1.2m ciclos, y ve un error, este es un error inmediato. a 1.230.160 ciclos, puede que no haya habido un error inmediato, pero los datos podrían haberse retenido durante días.
Cybergibbons

0

La solución mágica: si no desea codificar lo que dijo Cybergibbons sobre leer antes de escribir, es la función EEPROM.update (). Hace exactamente eso:

EEPROM.update (dirección, valor);

solo escribirá y enfatizará la memoria si el valor es diferente del que ya está almacenado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.