Come aumentare la velocità di scrittura della scheda SD in arduino


12

Sto creando un sistema di registrazione dei dati che registra i dati nella scheda SD ad una velocità elevata di circa 20000-30000 byte al secondo. Ma la libreria SD in arduino attualmente scrive dati a circa 4500-5000 byte al secondo, il che è troppo lento.

Ho letto questo trucco per migliorare la velocità di scrittura , ma mi chiedo se sia possibile un approccio più diretto, magari regolando le impostazioni SPIS .


1
Potresti provare la libreria SdFat - è molto più efficiente della libreria SD predefinita.
Majenko

Potresti anche assicurarti che la tua scheda SD sia di buona qualità, anche se 5000 byte sembrano troppo bassi per qualsiasi tipo di scheda SD.
Len,

Risposte:


11

OK. Quindi, ho provato la libreria SDFat. Questa libreria è decisamente migliore della libreria SD predefinita fornita con adruino. Ma non è così che ho risolto il mio problema di bassa velocità dei dati.

Ho seguito le istruzioni dell'autore della libreria SDFat da questo post .

Secondo fat16lib , per aumentare la velocità dei dati dobbiamo usare saggiamente flush (). Vorremmo scrivere () i dati in ogni ciclo, ma abbiamo bisogno di svuotare () una volta ogni 100 cicli circa, a seconda della quantità di dati scritti in ciascun ciclo. Inoltre, assicurarsi di mantenere il flag in SD.open () come 'O_WRITE | O_CREAT 'invece di' FILE_WRITE '.

Ciò ha sicuramente aumentato la velocità di un grande fattore. Ma avevo bisogno di più!

La memorizzazione dei dati in binario ( consulta questo blog ) ha migliorato ulteriormente le prestazioni.

La mia velocità attuale è di circa 100-120 KBps (ovvero chilogrammi byte) con una scheda SD di classe 4!

Infine, voglio ringraziarvi ragazzi per il vostro aiuto.


4

Molti fattori potrebbero decidere se è possibile raggiungere questa velocità desiderata. Solo alcuni di questi.


1. Il tuo software

La libreria SdFat è più veloce della libreria SD standard dell'IDE di Arduino. Ha anche una funzione di compatibilità facile da usare con la libreria SD standard. Provalo.

2. Il tuo hardware

È necessario utilizzare una scheda SD di alta classe. Come forse sapete, le schede SD sono ordinate in classi di prestazioni. La maggior parte delle persone su Internet consiglia una scheda SD SanDisk.


Lo proverò tra qualche giorno e ti farò sapere i risultati. Grazie.
Ashish Ranjan,

4

Evita che la stretta di mano ottenga un buffer!

Usa SD.write (buf, size);

Ciao a tutti, sto lavorando a un progetto con lo stesso problema. Stavo seguendo i tuoi stessi passi e ho ottenuto esattamente gli stessi numeri. L'ho appena risolto. Il problema è la stretta di mano quando si chiama il SD.write().

Anziché:

//for each loop, it is going to make a handshake
while(<yourCondition>){
    SD.write(<yourValue>);
}

Fare:

char buf[length];
while(yourCondition){
    buf[index] = yourValue;
}
SD.write(buf,index);//only one handshake

Nel mio progetto il primo ho ottenuto 4100 byte e il secondo usando un buffer con 128 (buf [128]) ho ottenuto 145408 byte nel mio progetto. Abbastanza buono.


1
Non so cosa intendi per stretta di mano, perché AFAIK SD utilizza comunque un buffer (512 kB) internamente. Ma ho anche osservato che scrivere singoli byte con File.write è estremamente lento e il compilatore non sembra essere in grado di ottimizzarlo (dopo tutto è solo copiare un byte nel buffer interno e controllare se il buffer è pieno e la trasmissione SPI dovrebbe inizio). L'uso del mio buffer esterno e File.write (buffer, dimensione) ha portato un miglioramento estremo delle prestazioni anche nella mia applicazione.
Oliver,
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.