Forum: Mikrocontroller und Digitale Elektronik [STM32] Fat-FS während DMA auf I2S läuft Probleme


von Mampf F. (mampf) Benutzerseite


Lesenswert?

Guten Morgen,

FAT-FS funktioniert bei mir recht gut eigentlich ... Sobald aber I2S per 
DMA abgespielt wird, hängt sich das (irgendwann) das FAT-FS-Zeugs auf 
...

Sämtliche Interrupts, die mit SDIO zu tun haben, hab ich deaktiviert.

Im Prinzip geht es um das Nachladen von MP3-Chunks ... Ich hab zwar 
relativ viel RAM (32MB), aber MP3s von zB Hörbüchern sind oft sehr groß 
und die initial-Ladezeit ist damit auch sehr hoch. Oder auch der Wechsel 
von einem MP3 zum nächsten ...

Ich weiß leider nicht mal genau, an welcher Stelle der Controller im 
FAT-FS hängt, weil der Stacktrace in diesen Fällen nur die Stelle in der 
main-Funktion anzeigt :/

Ob FAT-FS mir meinen RAM irgendwie kaputt schreibt und sich deshalb der 
Controller aufhängt? Hmm ... k.A.

Kennt jemand solche Probleme?

Viele Grüße,
Mampf

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Ahja was für ein Dreck ...

die Interrupts disablen löst das Problem :/
1
__asm volatile("CPSID i");
2
res = f_read(&MyFile, &filebuf[left], FILEBUFSIZE-left, (UINT*) &bytesread);
3
__asm volatile("CPSIE i");

Hat jemand eine Idee, wie sich der DMA-Interrupt mit SDIO+FATFS beißen 
kann? (SDIO läuft nicht im DMA-Modus).

Erstaunlicherweise fällt der I2S-DMA-Transfer nicht auf die Nase ... Das 
muss ich mir auch noch anschauen, weshalb das so ist ;-)

*edit*: Ahja, haben mehr Leute solche Probleme: 
Beitrag "FATFS FR_DISK_ERR mit fr_write"

von Dr. Sommer (Gast)


Lesenswert?

Was heißt denn "hängt sich auf" - geht der Controller einen Fault 
Handler, bleibt die f_read in einer Endlosschleife oder was?

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Dr. Sommer schrieb:
> Was heißt denn "hängt sich auf" - geht der Controller einen Fault
> Handler, bleibt die f_read in einer Endlosschleife oder was?

Mittlerweile weiß ich etwas mehr ...

Erst meldet FATFS ein FR_DISK_ERR und anschließend ein 
FR_INVALID_OBJECT.

Aber reproduzierbar, sobald die Interrupts aus sind, funktioniert es 
einwandfrei ...

Der zirkulare I2S-DMA-Buffer ist anscheinend so groß, dass das Lesen von 
SD-Karte abgeschlossen ist, bevor der Buffer leer ist.

Testweise auf 512 Worte verkleinert, da hört man es dann deutlich. Aber 
bei 64k Worte bleibt der völlig unbeeindruckt.

Also evtl eine Lösung, mit der man leben kann, auch wenn sie 
ultrahässlich ist.

von Dr. Sommer (Gast)


Lesenswert?

Mampf F. schrieb:
> Erst meldet FATFS ein FR_DISK_ERR und anschließend ein
> FR_INVALID_OBJECT.

Dann schau doch mal wo das herkommt? Setze an alle Stellen, wo FatFs das 
melden kann Breakpoints, und schaue wie es dazu kommt... Du wirst doch 
auch irgendwo eine Routine für den SDIO-Zugriff in FatFs eingebaut 
haben. Bricht diese denn mit einem Fehler ab? Wie kommt es zustande dass 
die abbricht?

Also ich habe schon SDIO mit DMA gleichzeitig zu ADC's mit DMA und 
anderen Interrupts ohne Probleme laufen lassen. Es sollte also gehen.

von Falk B. (falk)


Lesenswert?

@Mampf F. (mampf)

>Aber reproduzierbar, sobald die Interrupts aus sind, funktioniert es
>einwandfrei ...

>Also evtl eine Lösung, mit der man leben kann, auch wenn sie
>ultrahässlich ist.

Sowas ähnliches hatte ich auch mal mit einem ATXmega. Der Fehler lag in 
einem nicht korrekten Verhalten der FIFOs des UARTS im SPI-Mode. Dort 
hat sich was verschluckt, wenn Interrupts aktiv waren. Mit einer 
sauberen Handhabung der FIFOs ging es dann auch mit aktiven Interrupts.

Beitrag "Re: Problem mit Micro-SD-Karte"

von Dr. Sommer (Gast)


Lesenswert?

PS: Hast du denn bei DMA alle nötigen Einschränkungen beachtet - z.B. 
dass ein Burst-Access keine 1kB Grenze überschreiten darf? Wie 
allokierst du die Puffer, bist du sicher dass kein Schreibzugriff in den 
falschen Bereich stattfindet?

von Tassilo H. (tassilo_h)


Lesenswert?

Wenn du das SDIO-Interface ohen DMA betreibst, wird das ganze aber recht 
zeitkritisch (die Daten für einen Transfer zur SD-Karte müssen 
kontinuierlich fließen). Evtl. dauert die DMA-Interruptroutine zu lange 
und daher der Fehler.
Ich erinnere mich daß selbst mit DMA die DMA-Prioritäten und 
Transferweiten sinnvoll gesetzt sein müssen, sonst kann die SDIO-FIFO 
bei hoher Buslast leerlaufen.

Mit DMA auf SDIO gibt es noch andere Fallstricke: 1k-Blockgrenze für 
einen DMA-Burst, d.h. effektiv will man den Sektorpuffer 16-Bye-alignen; 
FatFS reicht bei Zugriffen >=512 bytes die Daten direkt durch, d.h. das 
braucht eine Sonderbehandlung, wenn man das CCM nutzt und Daten ggf. 
dahin sollen; beim STM32F4xx gibt es auch noch ein DMA-Erratum wenn man 
mit demselben DMA-Controller AHB und APB-Peripherals benutzen will.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Dr. Sommer schrieb:
> Dann schau doch mal wo das herkommt? Setze an alle Stellen, wo FatFs das
> melden kann Breakpoints, und schaue wie es dazu kommt...

Die SD-Karte meldet, dass sie beschäftigt ist ... Aber wie es genau dazu 
kommt, entzieht sich mir (noch).

Dr. Sommer schrieb:
> Also ich habe schon SDIO mit DMA gleichzeitig zu ADC's mit DMA und
> anderen Interrupts ohne Probleme laufen lassen. Es sollte also gehen.

Evtl wäre das des Rätsels Lösung ... Scheint so, als würde der 
SD-Karten-Treiber im "Multiblock"-lese-Modus das FIFO vom SDIO-Interface 
pollen ... Könnte mir vorstellen, dass das kräftig in die Hose geht, 
wenn zu dem Zeitpunkt ein Interrupt auftritt ...

Ach, was für ein Mist ist das denn xD

FATFS scheint standardmäßig den DMA-Modus nicht zu benutzen ... Muss ich 
mal schauen, wie man das ändern kann.

Oder diesen kryptischen FAT-FS Mist gleich entsorgen und eine andere 
Library verwenden.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Tassilo H. schrieb:
> Wenn du das SDIO-Interface ohen DMA betreibst, wird das ganze aber recht
> zeitkritisch (die Daten für einen Transfer zur SD-Karte müssen
> kontinuierlich fließen). Evtl. dauert die DMA-Interruptroutine zu lange
> und daher der Fehler.

Ja stimmt ... Ich glaube du hast recht, das würde sich mit meinen 
Beobachtungen decken ... Dieser seltsame HAL-Treiber scheint das 
SDIO-FIFO zu pollen und da könnte mein DMA-Interrupt zu lange dauern.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Puuuuuh, hab jetzt den DMA-Transfer endlich hinbekommen ...

FATFS ist relativ einfach auf DMA umbaubar ... Allerdings muss man auf 
das DWORD-Alignment des Puffers aufpassen ...

Hab gesehen, gibt Sonderschnitz, bei dem im Falle eines unaligned 
Buffers in einen eigenen 32Bit-Aligned-Bereich Sektorweise geschrieben 
und dann umkopiert wird.

Den "Scratch"-Bereich haben sie auf dem Stack, was imho ein NoGo ist, 
wenn man nur wenig Stack hat ;-)

Pragmatischer fand ich es, immer in einen sauber ausgerichteten Puffer 
zu schreiben und alles in einem Rutsch dann umzukopieren ;-)

Scheint jetzt zu klappen und Interrupts muss ich auch nicht mehr 
ausschalten.

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.