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 .


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.


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.