Cómo aumentar la velocidad de escritura de la tarjeta SD en arduino

12

Estoy creando un sistema de registro de datos que registra datos en la tarjeta SD a una alta velocidad de aproximadamente 20000-30000 bytes por segundo. Pero la biblioteca SD en arduino actualmente escribe datos a aproximadamente 4500-5000 bytes por segundo, lo cual es demasiado lento.

He leído este truco para mejorar la velocidad de escritura , pero me pregunto si es posible un enfoque más directo, tal vez ajustando los ajustes de SPIS .

Ashish Ranjan
fuente
1
Puede probar la biblioteca SdFat , es mucho más eficiente que la biblioteca SD predeterminada.
Majenko
Es posible que también desee asegurarse de que su tarjeta SD sea de buena calidad, aunque 5000 bytes parecen demasiado bajos para cualquier tipo de tarjeta SD.
Len

Respuestas:

11

OKAY. Entonces, probé la lib SDFat. Esta biblioteca es definitivamente mejor que la biblioteca SD predeterminada que viene con adruino. Pero no es así como resolví mi problema de baja velocidad de datos.

Seguí las instrucciones del autor de la biblioteca SDFat de esta publicación .

De acuerdo con fat16lib , para aumentar la velocidad de datos necesitamos usar flush () sabiamente. Queremos escribir () los datos en cada ciclo, pero solo necesitamos vaciar () una vez cada 100 ciclos más o menos, dependiendo de la cantidad de datos que se escriben en cada ciclo. Además, asegúrese de mantener la bandera en SD.open () como 'O_WRITE | O_CREAT 'en lugar de' FILE_WRITE '.

Esto seguro aumentó la velocidad en un gran factor. ¡Pero necesitaba más!

El almacenamiento de los datos en binario ( consulte este blog ) mejoró aún más el rendimiento.

¡Mi velocidad actual es de aproximadamente 100-120 KBps (eso es kilobytes) con una tarjeta SD de clase 4!

Finalmente, quiero agradecerles por su ayuda.

Ashish Ranjan
fuente
4

Muchos factores decidirían si puede alcanzar esta velocidad deseada. Solo algunos de estos.


1. Su software

La Biblioteca SdFat es más rápida que la Biblioteca SD estándar del IDE Arduino. También tiene una función de compatibilidad fácil de usar con la biblioteca SD estándar. Pruébalo.

2. Su hardware

Debe usar una tarjeta SD de clase alta. Como quizás sepa, las tarjetas SD se clasifican en clases de rendimiento. La mayoría de las personas en Internet recomiendan una tarjeta SD SanDisk.

William Roy
fuente
Probaré esto en unos días y les haré saber los resultados. Gracias.
Ashish Ranjan
4

¡Evita que el apretón de manos consiga un búfer!

Utilice SD.write (buf, tamaño);

Hola a todos, estoy trabajando en un proyecto con el mismo problema. Estaba siguiendo los mismos pasos tuyos y obtuve exactamente los mismos números. Lo acabo de arreglar. El problema es el apretón de manos cuando llamas al SD.write().

En lugar:

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

Hacer:

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

En mi proyecto, el primero obtuve 4100 bytes, y el segundo usando un buffer con 128 (buf [128]) obtuve 145408 bytes en mi proyecto. Suficientemente bueno.

Pinipa
fuente
1
No sé a qué te refieres con apretón de manos, porque AFAIK SD utiliza un búfer (512 kB) internamente de todos modos. Pero también observé que escribir bytes individuales con File.write es extremadamente lento y el compilador no parece ser capaz de optimizarlo (después de todo, solo está copiando un byte al búfer interno y verificando si el búfer está lleno y la transmisión SPI debería comienzo). El uso de mi propio buffer fuera y File.write (buffer, tamaño) trajo una mejora extrema del rendimiento también en mi aplicación.
Oliver