Qual è la vita reale di EEPROM?


21

ATMEL afferma che la durata della cella di una cella EEPROM è di circa 100.000 cicli di scrittura / cella. È davvero così che la EEPROM si comporta allo stato brado?

Se non modifico il valore di una cella, ciò accentua la vita? Ad esempio, se scrivo il valore 0xFFripetutamente alla stessa cella, questo diverso alla scrittura 0x00, 0xFF, 0x00etc.

Risposte:


19

Come indicato, la EEPROM interna ha una durata di 100.000 cicli di scrittura. Questa non è un'ipotesi: una percentuale molto significativa di ATmega328 raggiungerà questo numero senza problemi. In precedenza ho testato tre processori e tutti hanno raggiunto 150.000 cicli senza problemi.

È importante notare la modalità di errore di EEPROM. La maggior parte dei progetti di "EEPROM destroyer" leggono / scrivono ripetutamente fino a quando i dati non vengono scritti affatto. Prima di questo punto, la EEPROM sarà comunque danneggiata. Ciò si manifesterebbe se i dati non fossero conservati per un periodo ragionevole. Non è saggio fare affidamento su qualcosa di più di 100.000 cicli di scrittura per questo motivo.

EEPROM è diversa dalla RAM su un ATmega. Scrivere su di esso non è semplice o veloce, ma è racchiuso in un'amichevole libreria di Arduino , che nasconde questa complessità all'utente.

Il primo livello di riferimento indiretto è la libreria EEPROM , che è banalmente semplice], che chiama solo altre due funzioni per leggere e scrivere. Questo chiama eeprom_write_byte, trovato qui .

Questa funzione utilizza l'assemblaggio in linea, quindi potrebbe non essere facilmente comprensibile. C'è un commento che è facilmente comprensibile però:

Imposta la modalità di programmazione: cancella e scrivi

Questo suggerisce una delle complessità della gestione della EEPROM: per scriverla, devi prima cancellarla. Ciò significa che se chiami EEPROM.write (), eseguirà un ciclo di scrittura indipendentemente dal valore che stai scrivendo.

Ciò significa che scrivere ripetutamente 0xFF avrà probabilmente lo stesso effetto della scrittura di 0xFF, 0x00,0xFF, 0x00 ecc.

Esistono modi per aggirare questo problema: puoi provare a chiamare EEPROM.read () prima di EEPROM.write () per vedere se il valore è già lo stesso, ma ciò richiede ulteriore tempo.

Esistono altre tecniche per evitare l'eccessiva usura della EEPROM, ma il loro utilizzo dipende dall'applicazione.


3
Indossa il livellamento per EEPROM: electronics.stackexchange.com/questions/60342/…
jippie,

9

Una volta ho eseguito un esperimento su una EEPROM esterna con 1 milione di cicli nominali massimi. Ci sono voluti circa 6 milioni di cicli per essere gravemente corrotto, e prima di allora aveva progredito con sporadiche quantità di corruzione.

Quando dici di non cambiare il valore, presumo che tu stia scrivendo gli stessi dati su un indirizzo più volte. Questo quasi certamente stresserebbe la vita, sebbene probabilmente non stresserebbe le cellule circostanti.


2

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

L'Arduino è stato collegato a una verruca a muro e si è seduto, "dietro un divano per un paio di mesi". La EEPROM ha visto il suo primo errore di scrittura dopo 47 giorni e 1.230.163 cicli. Questo è un ordine di grandezza migliore delle specifiche sul foglio dati Atmel, ma simile ai risultati di esperimenti simili.


Sembra troppo alto. Avevo sentito parlare di 150k a 200k prima, ma mai questo: o
asheeshr,

5
Il problema è che questo non rileva tutte le modalità di errore. Quando la EEPROM viene danneggiata, ciò che accade è il periodo di tempo in cui conserverà i dati diminuendo gradualmente. A 100.000 cicli, Atmel garantisce 20 anni di conservazione dei dati. Oltre a ciò, la conservazione dei dati si riduce. Quando vengono raggiunti cicli di 1,2 m e viene visualizzato un errore, si tratta di un errore immediato. a 1.230.160 cicli, potrebbe non essersi verificato un errore immediato, ma i dati potrebbero essere stati conservati solo per giorni.
Cybergibbons,

0

La soluzione magica - se non vuoi codificare ciò che Cybergibbons ha detto sulla lettura prima di scrivere, è la funzione EEPROM.update (). Fa esattamente questo:

EEPROM.update (indirizzo, valore);

scriverà e solleciterà la memoria solo se il valore è diverso da quello già memorizzato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.