Qual é a vida útil real da EEPROM?

21

O ATMEL diz que a vida útil de uma célula EEPROM é de cerca de 100.000 ciclos / célula de gravação. É assim que a EEPROM se desempenha na natureza?

Se eu não alterar o valor de uma célula, isso estressa a vida toda? Por exemplo, se eu escrever o valor 0xFFpara o mesmo celular novo e de novo, isso é diferente de escrever 0x00, 0xFF, 0x00etc.

Marlon Abeykoon
fonte

Respostas:

19

Conforme você declara, a EEPROM interna tem uma vida útil de 100.000 ciclos de gravação. Isso não é um palpite - uma proporção muito significativa do ATmega328 alcançará esse número sem problemas. Eu testei três processadores antes e todos atingiram 150.000 ciclos sem problemas.

É importante observar o modo de falha da EEPROM. A maioria dos projetos de "destruidor de EEPROM" repetidamente lê / grava até que os dados não sejam gravados. Antes deste ponto, a EEPROM ainda estará danificada. Isso se manifestaria se os dados não fossem retidos por um período razoável. Não é aconselhável contar com mais de 100.000 ciclos de gravação por esse motivo.

A EEPROM é diferente da RAM em um ATmega. Escrever para ele não é simples ou rápido, mas está envolvido em uma biblioteca amigável do Arduino , ocultando essa complexidade do usuário.

O primeiro nível de indireção é a biblioteca EEPROM , que é trivialmente simples], apenas chamando duas outras funções para leitura e gravação. Isso chama eeprom_write_byte, encontrado aqui .

Essa função usa montagem embutida, portanto, pode não ser facilmente entendida. Há um comentário que é facilmente compreendido:

Definir o modo de programação: apagar e escrever

Isso sugere uma das complexidades de lidar com a EEPROM - para escrever para ela, você precisa primeiro apagá-la. Isso significa que, se você chamar EEPROM.write (), ele executará um ciclo de gravação, independentemente do valor que estiver gravando.

Isso significa que escrever repetidamente 0xFF provavelmente terá o mesmo efeito que escrever 0xFF, 0x00,0xFF, 0x00 etc.

Existem maneiras de contornar isso - você pode tentar chamar EEPROM.read () antes de EEPROM.write () para ver se o valor já é o mesmo, mas isso leva mais tempo.

Existem outras técnicas para evitar desgaste excessivo da EEPROM, mas o uso delas depende da sua aplicação.

Cybergibbons
fonte
3
Nivelamento de desgaste para EEPROM: electronics.stackexchange.com/questions/60342/…
jippie
9

Certa vez, fiz um experimento em uma EEPROM externa com 1 milhão de ciclos nominais máximos. Demorou cerca de 6 milhões de ciclos para se tornar majoritariamente corrompido e antes disso havia progredido com quantidades esporádicas de corrupção.

Quando você diz que não altera o valor, suponho que você esteja gravando os mesmos dados em um endereço várias vezes. Isso quase certamente estressaria a vida, embora provavelmente não estressasse as células circundantes.

O médico
fonte
2

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

O Arduino foi conectado a uma verruga e sentado "atrás de um sofá por alguns meses". A EEPROM viu seu primeiro erro de gravação após 47 dias e 1.230.163 ciclos. Essa é uma ordem de grandeza melhor que a especificada na folha de dados da atmel, mas semelhante aos resultados de experiências semelhantes.

80HD
fonte
Isso parece muito alto. Eu já tinha ouvido falar de 150k a 200k antes, mas nunca isso: o
asheeshr
5
O problema é que isso não detecta todos os modos de falha. Quando a EEPROM fica danificada, o tempo que ele retém os dados diminui gradualmente. Em 100.000 ciclos, a Atmel garante 20 anos de retenção de dados. Além disso, a retenção de dados diminui. Quando os ciclos de 1,2 m são atingidos e você vê um erro, este é um erro imediato. em 1.230.160 ciclos, pode não ter havido um erro imediato, mas os dados podem ter sido retidos apenas por dias.
Cybergibbons
0

A solução mágica - se você não quiser codificar o que o Cybergibbons disse sobre a leitura antes de escrever, é a função EEPROM.update (). Faz exatamente isso:

EEPROM.update (endereço, valor);

só gravará e estressará a memória se o valor for diferente daquele já armazenado.

Jorge
fonte