Jak zwiększyć prędkość zapisu na karcie SD w Arduino

12

Tworzę system rejestrujący dane, który rejestruje dane na karcie SD z dużą prędkością około 20000-30000 bajtów na sekundę. Ale biblioteka SD w arduino obecnie zapisuje dane z szybkością około 4500-5000 bajtów na sekundę, co jest zbyt wolne.

Czytałem ten siekać, aby poprawić prędkość zapisu , ale zastanawiam się, czy bardziej bezpośrednie podejście jest możliwe, być może poprzez regulację SPISettings .

Ashish Ranjan
źródło
1
Możesz wypróbować bibliotekę SdFat - jest ona znacznie wydajniejsza niż domyślna biblioteka SD.
Majenko
Możesz także upewnić się, że twoja karta SD jest dobrej jakości, chociaż 5000 bajtów wydaje się zbyt niska dla jakiejkolwiek karty SD.
Len

Odpowiedzi:

11

DOBRZE. Wypróbowałem lib SDFat. Ta biblioteka jest zdecydowanie lepsza niż domyślna biblioteka SD dostarczana z adruino. Ale nie tak rozwiązałem mój problem niskiej prędkości transmisji danych.

Postępowałem zgodnie z instrukcjami autora biblioteki SDFat z tego postu .

Według fat16lib , aby zwiększyć szybkość transmisji danych, musimy mądrze używać flush (). Chcielibyśmy zapisywać () dane w każdym cyklu, ale musimy tylko opróżniać () raz na około 100 cykli, w zależności od ilości danych zapisywanych w każdym cyklu. Pamiętaj też, aby zachować flagę w SD.open () jako „O_WRITE | O_CREAT ”zamiast„ FILE_WRITE ”.

To z pewnością zwiększyło prędkość o wielki czynnik. Ale potrzebowałem więcej!

Przechowywanie danych w formacie binarnym ( sprawdź tego bloga ) jeszcze bardziej poprawiło wydajność.

Moja obecna prędkość wynosi około 100-120 KBps (to kilogram bajtów) z kartą SD klasy 4!

Na koniec chcę wam podziękować za pomoc.

Ashish Ranjan
źródło
4

Wiele czynników decyduje o tym, czy osiągniesz pożądaną prędkość. Tylko niektóre z nich.


1. Twoje oprogramowanie

SdFat Biblioteka jest szybsze niż standardowe biblioteki SD Arduino IDE. Posiada również łatwą w użyciu funkcję zgodności ze standardową biblioteką SD. Wypróbuj to.

2. Twój sprzęt

Powinieneś używać wysokiej jakości karty SD. Jak zapewne wiesz, karty SD są podzielone na klasy wydajności. Większość ludzi w Internecie zaleca kartę SD SanDisk.

William Roy
źródło
Spróbuję tego za kilka dni i dam znać o wynikach. Dzięki.
Ashish Ranjan
4

Unikaj uzgadniania bufora!

Użyj SD.write (buf, rozmiar);

Cześć wszystkim, pracuję nad projektem z tym samym problemem. Podążałem tymi samymi krokami i dostałem dokładnie te same liczby. Właśnie to naprawiłem. Problemem jest uścisk dłoni podczas połączenia SD.write().

Zamiast:

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

Robić:

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

W moim projekcie pierwszy otrzymałem 4100 bajtów, a drugi przy użyciu bufora z 128 (buf [128]) mam 145408 bajtów w moim projekcie. Wystarczająco dobry.

Pinipa
źródło
1
Nie wiem, co rozumiesz przez uścisk dłoni, ponieważ AFAIK SD i tak używa bufora (512 kB) wewnętrznie. Ale zauważyłem również, że pisanie pojedynczych bajtów za pomocą File.write jest bardzo wolne i kompilator nie wydaje się być w stanie go zoptymalizować (w końcu po prostu kopiuje jeden bajt do bufora wewnętrznego i sprawdza, czy bufor jest pełny i transmisja SPI powinna początek). Używanie własnego bufora na zewnątrz i File.write (bufor, rozmiar) przyniosło ekstremalną poprawę wydajności również w mojej aplikacji.
oliver