Come posso proteggere la scheda SD da interruzioni di corrente impreviste?


18

Sto lavorando su un dispositivo che utilizza la libreria Microchip MDDFS per archiviare i dati su una scheda SD. Il logger registrerà i dati alla velocità massima di 1 voce (56 byte) ogni minuto. Il problema è che il dispositivo potrebbe perdere energia in qualsiasi momento, potenzialmente nel mezzo di una sequenza di scrittura. Mi chiedo quale sia il modo migliore per proteggere i miei dati dalla corruzione. Ho scoperto che se il file è aperto quando viene persa l'alimentazione, tutti i dati scritti nel file dopo l'ultima chiusura del file vengono persi. Non so se lo stesso vale se si perde potenza nel mezzo della sequenza di scrittura.

Poiché la procedura di scrittura non si verifica molto frequentemente, potrei aprire il file, scrivere i dati e quindi chiudere il file, ogni volta che i dati vengono registrati. Questo approccio danneggerebbe la scheda SD nel tempo?

Un altro approccio potrebbe essere quello di mantenere il file aperto ma dopo ogni 10 o 50 scritture potrei chiudere il file e quindi riaprirlo.

Potrei anche bufferizzare i dati in memoria, quindi svuotare i dati di tanto in tanto forse dopo un kbyte o giù di lì.

L'ultima idea che ho avuto è stata, nel mio circuito, di aggiungere un grande condensatore in grado di fornire energia alla mia scheda pic / sd abbastanza a lungo dopo che l'alimentazione è stata disconnessa per chiudere rapidamente il file. Il problema con questo approccio è che il tempo necessario per chiudere il file e / o salvare i dati è molto incoerente. Da quanto ho capito, questa volta può dipendere molto dalla posizione corrente in una pagina flash in cui si trova il file.

Comunque, cosa suggerireste ragazzi?


2
Se si passasse al flash NAND non elaborato con un file system minimo, è possibile eseguire il drill-through di molti dei livelli di astrazione che attualmente ostacolano la capacità di eseguire piccole scritture e probabilmente acquisire la possibilità di eseguire scritture di blocchi parziali immediatamente quando i dati diventano disponibili. Avresti anche una protezione contro un utente finale che sostituisce una scheda con diversi dettagli delle prestazioni (forse anche un mercato grigio marginale) lungo la strada.
Chris Stratton,

Risposte:


16

Alcune cose possono accadere quando si scrivono dati in un file. Descriverò la sequenza che deve avvenire affinché i dati siano sicuri, non necessariamente le chiamate in libreria.

Durante la scrittura e l'aggiunta alla fine del file (modalità di scrittura normale), leggi l'ultimo blocco del file in memoria, lo modifichi con i tuoi dati di scrittura e quindi riscrivi l'intero blocco sulla scheda SD . Se il blocco è pieno, è necessario trovare un nuovo blocco nella File Allocation Table (FAT). Dopo aver trovato un nuovo blocco, il FAT deve essere aggiornato, che è un ciclo di lettura-modifica-scrittura. Se abbiamo finito con il file, allora abbiamo bisogno di aggiornare gli attributi del file (come la lunghezza del file) nella directory principale, che provoca un altro ciclo di lettura-modifica-scrittura.

Ridurre al minimo il tempo di scrittura

  • Assicurati che il file contenga già i tuoi dati quando scrivi un settore. Se si inizia con un file di grandi dimensioni e si sovrascrivono i dati anziché aggiungerli, i dati saranno al sicuro non appena terminata la scrittura del settore della scheda SD. In questo modo è possibile eliminare da uno a due cicli di lettura-modifica-scrittura. Il mio codice di avvio scriverà 0 in un file con incrementi di settore fino a quando la scheda SD è piena, quindi riavvolgere all'inizio del file.

  • Impostare le dimensioni delle voci di dati in modo tale che un numero intero di voci si adatti a un settore. Vorrei aumentare le voci a 64 byte. Sebbene sia meno efficiente, ti impedirà di dover leggere, modificare e scrivere due settori.

  • Crea una variante della funzione FSwrite che ti consente di scrivere interi settori. Se si mantiene l'intero settore in SRAM, il ciclo passa da "lettura-modifica-scrittura" a "modifica-scrittura"

Mantieni i tuoi PIC e SD accesi il più a lungo possibile

  • I grandi condensatori sono buoni. 470uF dovrebbe darti energia più che sufficiente per completare un ciclo di scrittura.

  • Assicurati che la tua fonte di alimentazione non aspiri l'alimentazione dal condensatore di riserva! Aggiungi un diodo se necessario.

Sai quando sei senza potere

  • Un grande tappo di alimentazione ti darà 10ms o più per avvolgere le cose con una scheda SD, ma non sfidare la fortuna. Usa un pin sul tuo microcontrollore per vedere se la tua fonte di energia è ancora buona e non iniziare a scrivere se la tua fonte è morta.

Grazie per le informazioni. Molto utile. Vedrò cosa posso farci ...
PICyourBrain

Quanto pensi che ci vorrebbe per scrivere tutti gli zeri su una scheda da 4 GB? Sembra molto tempo. Inoltre, hai qualche esempio di codice che potresti condividere per modificare la funzione fswrite per consentire intere scritture a interi settori?
PICyourBrain

Inoltre, se scrivi tutti gli zero nel file. Come tenere traccia di dove si trova la fine dei dati effettivi? Hai appena letto tutti i dati all'inizio e trovi la stringa di zeri?
PICyourBrain

1
Se stai usando FAT16, credo che tu abbia un limite di 2 GB. Credo che la scheda SD / MMC abbia una funzione "cancella blocchi", che non sembra essere implementata nella libreria MDDFS. Ho usato una libreria di codici proprietaria per il mio progetto di scheda SD, quindi non posso condividere esempi di codice. Per trovare gli ultimi dati, dovresti leggere fino a quando non hai trovato tutti gli 0 in un set di dati. Se il tuo record di dati può essere tutto 0, ti consiglio di aggiungere alcuni dati diversi da zero o un delimitatore di qualche tipo.
W5VO,

6

Un problema non ancora menzionato con le schede SD (o MMC, CompactFlash, ecc.) È che mentre una scheda SD può apparire all'host come una semplice raccolta di settori a 512 byte che possono essere letti e scritti in ordine arbitrario, i dispositivi flash generalmente memorizzare pagine a 528 byte in gruppi che sono 32 KB se non più grandi ciascuno e le uniche operazioni supportate sono scrivere su una pagina altrimenti vuota o cancellare un intero gruppo. Per far fronte a questa limitazione, il controller su una scheda SD manterrà una tabella che consentirà a qualsiasi settore logico di essere mappato su qualsiasi pagina fisica. Quando viene effettuata una richiesta per scrivere un settore, il controller troverà una pagina vuota da qualche parte nel chip e aggiornerà la mappatura con il nuovo indirizzo del settore in questione. Se le pagine bianche diventano scarse, o in altre occasioni,

Il significato di questo è che l'atto di scrivere in un particolare settore logico può richiedere la mescolanza dei dati da molti settori logici. Se qualcosa va storto in questo processo, potrebbe causare la corruzione di qualsiasi settore arbitrario, non solo il settore che è stato chiesto alla carta di scrivere. Un buon controller per schede SD dovrebbe essere progettato per eseguire le operazioni di shuffle dei dati in modo tale che se si perde energia durante un shuffle dei dati, sarà in grado di capire quali parti dell'operazione sono state completate e quali no, e di conseguenza essere in grado di completare correttamente l'operazione. Sfortunatamente, non ho idea di come si possa dire se la scheda SD da $ 5 presa in un negozio di sconto sarà utile a questo proposito.

A dire il vero, anche se una scheda SD è assolutamente perfetta dal punto di vista del garantire che ogni operazione di scrittura che è stata segnalata come completata sia, in effetti, sopravviverà a un'interruzione di corrente (cioè assicurando che la scrittura sia o meno tutta avrebbe causato è completo, abbastanza ha completato che la scheda finirà l'operazione quando viene ripristinata l'alimentazione) ciò non significa che il sistema operativo host non avrà problemi se esegue alcuni, ma non tutti i dati scritti che intende. Tuttavia, è importante tenere presente che se la scheda SD non è in grado di sostenere la sua "conclusione", non è possibile eseguire alcuna operazione sul software lato host per impedire la perdita di dati a causa di un'interruzione dell'alimentazione.


Questo è un commento molto perspicace.
Fred Basset,

5

Vorrei anche suggerire di utilizzare una sorta di checksum per verificare che i dati sulla SD siano corretti ogni volta che devono essere letti.


3

Forse questo supercondensatore di Sparkfun risolverebbe il problema.


2
Conserverebbe la memoria del PIC, ma ha una corrente nominale massima di 10uA. Non credo che potresti scrivere su una scheda SD con troppa corrente.
W5VO,

1
Il concetto è buono però. Una rapida ricerca ha rilevato che il condensatore dell'Illinois ( illinoiscapacitor.com ) ha un supercondensatore fino a 8 F e in grado di supportare correnti fino a 4 A. L'aggiunta di uno di questi, o una batteria, darebbe al micro la possibilità di finire una scrittura e spegnere le cose bene se la fonte di alimentazione principale non funzionasse.
The Photon,

3

Poiché la procedura di scrittura non si verifica molto frequentemente, potrei aprire il file, scrivere i dati e quindi chiudere il file, ogni volta che i dati vengono registrati. Questo approccio danneggerebbe la scheda SD nel tempo?

Come per qualsiasi problema di ingegneria, dovrai affrontare i compromessi qui.

È fondamentale che nessun dato venga perso affatto? Quindi farei quanto sopra. Avresti fatto più danni perdendo i dati che rovinando una carta. Potresti voler fare uno stress test, per sorta, per determinare quante volte potresti eseguire quell'operazione prima che la scheda si danneggi. Se stai bene con il tempo impiegato prima che la carta diventi inutilizzabile, e sembra essere un periodo di tempo accettabile prima di cambiare la carta, andrei con quella rotta.


1

Se si desidera solo archiviare i dati, non è necessario un file system. l'operazione di scrittura verrà eseguita direttamente sull'SPI selezionando l'indirizzo di blocco. così facendo minimizzi i tempi di scrittura e rischi di corruzione dei dati.

Anche in caso di perdita di potenza e sfortuna, perderai solo una voce (che forse è accettabile su alcuni sistemi).

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.