Vraag:
Hoe de schrijfsnelheid van de SD-kaart in Arduino te verhogen
Ashish Ranjan
2016-08-21 00:18:51 UTC
view on stackexchange narkive permalink

Ik creëer een dataloggersysteem dat gegevens op een SD-kaart registreert met een hoge snelheid van ongeveer 20.000-30000 bytes per seconde. Maar de SD-bibliotheek in Arduino schrijft momenteel gegevens met ongeveer 4500-5000 bytes per seconde, wat te langzaam is.

Ik heb deze hack gelezen om de schrijfsnelheid te verbeteren, maar ik vraag me af of een meer directe benadering mogelijk is, misschien door de SPIS-instellingen aan te passen.

U kunt de [SdFat] (https://github.com/greiman/SdFat) bibliotheek proberen - deze is veel efficiënter dan de standaard SD-bibliotheek.
Je kunt er ook voor zorgen dat je SD-kaart van goede kwaliteit is, hoewel 5000 bytes te laag lijkt voor welke SD-kaart dan ook.
Drie antwoorden:
Ashish Ranjan
2016-09-03 12:01:54 UTC
view on stackexchange narkive permalink

OK. Dus ik heb de SDFat-lib geprobeerd. Deze bibliotheek is absoluut beter dan de standaard SD-bibliotheek die bij adruino wordt geleverd, maar zo heb ik mijn probleem van lage gegevenssnelheid niet opgelost.

Ik volgde de instructies van de auteur van de SDFat-bibliotheek van dit bericht .

Volgens fat16lib moeten we flush gebruiken om de gegevenssnelheid te verhogen () wijselijk. We zouden de gegevens in elke cyclus willen schrijven (), maar we hoeven maar één keer per 100 cycli te spoelen (), afhankelijk van hoeveel gegevens er in elke cyclus worden geschreven. Zorg er ook voor dat u de vlag in SD.open () behoudt als 'O_WRITE | O_CREAT 'in plaats van' FILE_WRITE '.

Dit verhoogde de snelheid zeker met een grote factor. Maar ik had meer nodig!

Het opslaan van de gegevens in binair bestand ( bekijk deze blog) verbeterde de prestaties nog meer.

Mijn huidige snelheid is ongeveer 100- 120 KBps (dat zijn kilobytes) met een klasse 4 SD-kaart!

Tot slot wil ik jullie bedanken voor jullie hulp.

William Roy
2016-08-23 01:53:29 UTC
view on stackexchange narkive permalink

Er zijn veel factoren die bepalen of u deze gewenste snelheid kunt bereiken. Slechts enkele hiervan.


1. Uw software

De SdFat -bibliotheek is sneller dan de standaard SD-bibliotheek van de Arduino IDE. Het heeft ook een gebruiksvriendelijke compatibiliteitsfunctie met de standaard SD-bibliotheek. Probeer het uit.

2. Uw hardware

U moet een eersteklas SD-kaart gebruiken. Zoals u wellicht weet, worden SD-kaarten gesorteerd in prestatieklassen. De meeste mensen op internet bevelen een SanDisk SD-kaart aan.

Ik zal dit over een paar dagen proberen en je de resultaten laten weten. Bedankt.
Pinipa
2017-02-20 05:08:51 UTC
view on stackexchange narkive permalink

Voorkom dat de handdruk een buffer krijgt!

GebruikSD.write(buf,size);

Hallo allemaal, ik werk in een project met hetzelfde probleem. Ik volgde dezelfde stappen als die van jou en kreeg exact dezelfde nummers. Ik heb het net opgelost. Het probleem is de handshake wanneer je de SD.write().

aanroept In plaats daarvan:

  // voor elke lus gaat het een handshakewhile (<yourCondition>) {SD.write (<yourValue>);}  

Do:

  char buf [length]; while (yourCondition) { buf [index] = yourValue;} SD.write (buf, index); // slechts één handdruk  

In mijn project kreeg ik de eerste 4100 bytes , en de tweede met een buffer met 128 (buf [128]) Ik heb 145408 bytes in mijn project. Goed genoeg.

Ik weet niet wat je bedoelt met handdruk, want AFAIK SD gebruikt toch intern een (512 kB) buffer. Maar ik merkte ook op dat het schrijven van individuele bytes met File.write extreem traag is en dat de compiler het niet lijkt te kunnen optimaliseren (het kopieert tenslotte slechts één byte naar de interne bufffer en controleert of de buffer vol is en SPI-verzending zou moeten begin). Het gebruik van mijn eigen buffer buiten en File.write (buffer, grootte) bracht ook extreme prestatieverbetering in mijn applicatie.


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...