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!
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.
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
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?
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.