Forum: Mikrocontroller und Digitale Elektronik FatFS Lib - Was ist schneller? Zwei files oder file-seek?


von Bla (Gast)


Lesenswert?

Hallo Leute,

ich habe mal eine prinzipielle Frage zu FatFS und SD-Karten.
Ich hätte hier eine Applikation, in der ich zwei Datenströme parallel 
aus der SD-Karte lesen muss (einmal Bild- und Audiodaten), die simultan 
präsentiert werden müssen.

Eine SD-Karte ist ja in 512-Byte Sektoren typischerweise organisiert und 
das ist auch die default Lesegrößte in den tieferen Layern von FatFS.

Jetzt wollte ich mal fragen, was ist die performanteste Variante aus 
zwei Dateien zu lesen?

- Ich habe zwei getrennte Dateien für Bilder und Audio daten und lese 
dann einfach sequentiell aus beiden Files von Anfang bis Ende.

- Ich mische Bild und Audiodaten in eine Datei (z.B. Bilddaten am Anfang 
und Audio am Ende) und springe mit der Seek Funktion ständig hin- und 
her (mit anschließenden reads)?

- Ich mache das gleiche wie bei Punkt zwei, nur dass die Audio-Daten am 
Ende z.B. 512 Byte-Aligned in der Datei habe?


Zugrundeliegender uC sollte erstmal egal sein (ist noch nicht sicher 
welcher), aber mit Sicherheit einer, der ein natives 4-Bit SDIO 
Interface hat.

Danke euch!

von c-hater (Gast)


Lesenswert?

Bla schrieb:

> Ich hätte hier eine Applikation, in der ich zwei Datenströme parallel
> aus der SD-Karte lesen muss (einmal Bild- und Audiodaten), die simultan
> präsentiert werden müssen.

Dann solltest du dafür ein Format verwenden, was dafür gedacht ist. Es 
gibt unzählige Containerformate für AV-Daten. Such' dir eins aus. AVI 
z.B. ist sehr schön einfach gestrickt.

> Jetzt wollte ich mal fragen, was ist die performanteste Variante aus
> zwei Dateien zu lesen?

Am performantesten ist es, genau das NICHT zu tun. U.a. deswegen gibt 
es diese Containerformate.

von Falk B. (falk)


Lesenswert?

Bla schrieb:
> Jetzt wollte ich mal fragen, was ist die performanteste Variante aus
> zwei Dateien zu lesen?
>
> - Ich habe zwei getrennte Dateien für Bilder und Audio daten und lese
> dann einfach sequentiell aus beiden Files von Anfang bis Ende.
>
> - Ich mische Bild und Audiodaten in eine Datei (z.B. Bilddaten am Anfang
> und Audio am Ende) und springe mit der Seek Funktion ständig hin- und
> her (mit anschließenden reads)?

http://elm-chan.org/fsw/ff/doc/config.html#fs_tiny

Wenn man das auf 0 läßt, hat jede Datei einen FF_MAX_SS Byte Puffer. 
Damit ist es egal, wieviele Dateien offen sind, der Zugriff ist gleich 
schnell.

http://elm-chan.org/fsw/ff/doc/sfile.html

von my2ct (Gast)


Lesenswert?

Bla schrieb:
> Danke euch!

> Was ist schneller? Zwei files oder file-seek?

Ist das nicht völlig egal, solange es schneller geht, als für die 
Präsentation erforderlich?

von Michael B. (laberkopp)


Lesenswert?

Bla schrieb:
> was ist die performanteste Variante aus zwei Dateien zu lesen?

Da ein seek üblicherweise den buffer löscht, ist ein ständiges hin und 
her schlechter, als aus 2 Dateien parallel zu lesen, denn dort hat man 2 
buffer. Die klassische Dateiverwaltung in C kann nicht mit mehreren 
buffern umgehen. Was das Betriebssystem kann, liegt wiederum an ihm.

Wenn man allerdings das buffering selbst übernimmt und immer nur 
komplette Blöcke liest, kann seek genau so effizient sein, bei 
gleichzeitig gespartem Hauptspeicher und Dateihandles und weniger 
gepufferten Verzeichniseinträgen.

Besonders effizient wird es natürlich, wenn Bild und Ton so 
verschachtelt in der Datei zusammenkopiert werden, dass sie rein 
sequentiell gelesen werden kann (ein Block in den Tonausgabe-buffet, die 
nächsten enthalten Bilddaten, usw), ist das natürlich noch besser.

von Monk (roehrmond)


Lesenswert?

Bedenke, dass die Blocke auf der SD Karte sehr viel größer als 512 Bytes 
sein können. Wenn du dauern hin und her springst werden die Blöcke nur 
teilweise ausgelesen und damit für die Performance nützliche Puffer in 
der SD Karte verworfen.

von J. S. (jojos)


Lesenswert?

Die clib ist langsam, die würde ich sowieso nicht verwenden. Im FatFS 
kann man auch größere Buffer anlegen, dann wird lesen per DMA noch 
effizienter.
Die STM32H7 haben ein sehr schnelles SDMMC Interface, für die 
Daten/Kommandos gibt es Statemachines in Hardware. Damit bekommt man 
Lesegeschwindigkeiten >20 MByte/s hin. Da wird die SD Karte sicher nicht 
das Nadelöhr sein.

von Axel S. (a-za-z0-9)


Lesenswert?

Bla schrieb:
> Jetzt wollte ich mal fragen, was ist die performanteste Variante aus
> zwei Dateien zu lesen?

Kommt drauf an, was (und wenn wie) deine FAT Library implementiert.

Nach Gefühl würde ich sagen, daß sequentielles Lesen aus 2 Files 
schneller sein müßte, weil der Aufwand für fseek() entfällt. Und der 
kann für FAT recht groß sein.

Andererseits sind FAT Libraries für µC oft eingeschränkt, was die Anzahl 
gleichzeitig geöffneter Files (wegen der dazugehörigen Buffer) angeht. 
Also hilft nur, Dokumentation zu lesen und notfalls auszuprobieren.

Aber wie schon anderweitig gesagt wurde: das ist ziemlich unnötig, wenn 
man einfach ein Containerformat verwendet, das Audio und Video 
verschachtelt speichert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.