Ottimizzare scrittura (e vita) sd card

Ciao a tutti,

come da titolo vorrei discutere (e trovare possibilmente una soluzione) su quello che potrebbe essere il metodo migliore per ottimizzare il codice di scrittura su sd, i requisiti dovrebbero essere questi:

  • salvaguardare la vita della scheda sd (a proposito quanti sono i cicli di vita di ogni cella? e quante sono le celle?)
  • non appesantire troppo il codice
  • non rischiare di perdere troppi dati in caso di 'incauto' spegnimento
  • non rischiare di bruciare la sd se spengo arduino mentre scrive (succede?)

La funzione di arduino è di datalogger, scrive una stringa da 60-70 caratteri (considerate una NMEA più o meno) a 1-2hz.
L'ultimo giorno di lavoro (non è quotidiano) ha fatto 10'000 salvataggi a 1hz di due stringhe suddette.
Ho intenzione di inserire un pulsante (con led di stato) che avvii e fermi il salvataggio.

Cosa mi consigliate e/o quali sono i valori che devo considerare?

(a proposito quanti sono i cicli di vita di ogni cella? e quante sono le celle?)

Se giá di questo non Ti sei informato allora come pensi di poter affrontare il resto del progetto?

Il numero di celle, e la vita dipende dalla tipologia di produzione e sono informazioni che solo il produttore sa dirti.
Esiste la tecnologia di celle multilivello ( che memorizzano un valore analogico e possono memorizzare cosí 2-3 bit per ogni cella) poi c'é il controller che gestisce la scrittura. Anche lui puó avere implementato un allogaritmo di ottimizazione si scrittura e di sostituzione di celle daneggiate.

A secondo della organizzazione della EEPROM della schedina SD non puó essere scritta/cancellata una singola cella ma un blocco. Il blocco varia da SD a SD.

Ciao Uwe

Generalmente i cicli di scrittura sono almeno 10000 per la stessa cella di memoria.

Questo vuol dire che puoi riscrivere la medesima locazione fisica almeno 10000 volte.

Un data logger come il tuo memorizza occasionalmente 60 byte x 10.000 al giorno cioè occupa 600.000 byte ma in posizioni diverse.

Una SD da 1 GB perciò durerebbe 1666 giorni prima di riscrivere sulle medesime posizioni di memoria: ci vorrebbero 16.660.000 giorni per cominciare a deteriorarsi!

In realtà il settore della FAT (File Allocation Table) è quello che potrebbe essere a rischio, in quanto viene aggiornato ad ogni chiusura del file.

Quindi è opportuno chiudere il file solo quando strettamente indispensabile. Potresti, ad esempio, chiuderlo ogni 100 memorizzazioni in modo da riscrivere le locazioni FAT solo 100 volte in un giorno.

Discorso diverso per la salvaguardia dei dati: una mancanza di tensione nel momento in cui viene aggiornata la FAT purtroppo rischia di perdere tutto il contenuto del file, ma, come per l'hard disk del PC, esistono dei programmi per il recupero dei dati di file danneggiati.

Siccome, come ti ha spiegato Uwe, le celle di una Flash sono organizzate in pagine, non conviene mai scrivere pochi dati perché scriverai la stessa pagina per diverse volte. Ti conviene tenere in un buffer i dati e scriverli solo ogni tot.
Alternativamente, potresti pensare ad una EEPROM esterna (ce ne sono con tagli da qualche decina di byte fino a diverse centinaia di KB): scrivi i dati lì dentro, visto che le EEPROM sono indirizzabili per cella, e poi riversi i dati sulla Flash solo periodicamente e/o quando la EEPROM è satura.

Al posto di usare un EEPROM esterno come Buffer Cache puoi usare anche una memoria in tecnologia FRAM della RAMTRON.
Ha il vantaggio della scrittura veloce e di un quasi illimitato numero di scritture senza avere pagine (blocchi di celle). I svantaggi sono che sono trvabili solo in formato smd e che costano di piú dei EEPROM.
Ciao Uwe

uwefed:

(a proposito quanti sono i cicli di vita di ogni cella? e quante sono le celle?)

Se giá di questo non Ti sei informato allora come pensi di poter affrontare il resto del progetto?

Ciao Uwe

In realtà (e dal seguito del tuo post capisco perché) ho trovato moltissimo numeri e non sapevo di quale fidarmi! ora che ho capito il perché ne capirò di più!

Intanto grazie dei consigli a tutti!!!