Forum: Mikrocontroller und Digitale Elektronik FatFs DMA Support


von Leo (Gast)


Lesenswert?

Hi Leute,

ich möchte gerne Daten mit meinem uC von einer SD Karte lesen.
Dafür habe ich mir ein kleines Projekt mit FatFs erstellt.
Im Beispielprojekt habe ich die SPI Routinen auf meinen uC angepasst.
Mittlerweile kann ich Dateien von der SD Karte lesen.
Allerdings blockieren die Funktionen immer beim lesen und schreiben des 
SPI.
Dann habe ich die SPI Routinen so umgestellt, dass die Daten mit DMA 
gelesen und geschrieben werden. Allerdings wird nach dem DMA Aufruf 
immer noch blockiert.
Nun würde ich gerne nach dem Aufruf der DMA ein Flag setzen und dieses 
im Hauptprogramm gelegentlich pollen um Rechenzeit zu bekommen.
Also einen Lesevorgang einer Datei starten, was anderes machen und 
sobald die DMA mir sagt dass sie fertig ist weiter lesen ...

Die write und read Routinen werden in der ff.c quer Beet aufgrufen und 
ich glaube der Code ist nicht für eine Art Multi Tasking ausgelegt.

Stimmt das ?

von Jim M. (turboj)


Lesenswert?

Leo schrieb:
> Die write und read Routinen werden in der ff.c quer Beet aufgrufen und
> ich glaube der Code ist nicht für eine Art Multi Tasking ausgelegt.
>
> Stimmt das ?

Ja, stimmt. Diesen Code für Multitasking umzubauen wird nicht einfach.

von Leo (Gast)


Lesenswert?

Ok, glaube ich habe Dich verstanden.
Ich muss überall wo aktuell das SPI blockiert eine Funktion aufrufen die 
die anderen Tasks überprüft und ggf. abarbeitet.

Manchmal sieht man den Wald nicht mehr :)

von Falk B. (falk)


Lesenswert?

@ Leo (Gast)

>Ich muss überall wo aktuell das SPI blockiert eine Funktion aufrufen die
>die anderen Tasks überprüft und ggf. abarbeitet.

Viel zu kompliziert. Nutzt die Funktionen von FATfs, um immer nur kleine 
Operationen zu machen und diese dann mit anderen Funktionen zu 
verschachteln. Damit musst du nicht in den Innereien von FATfs was 
ändern, denn das wird ZIEMLICH aufwändig!

Wenn deine anderen SPI-Slaves ultimativ wichtig sind und zeitkritisch 
Daten brauchen, hängs sie an einen anderen SPI-Port (soweit vorhanden) 
oder mach es per Soft-SPI.

von Falk B. (falk)


Lesenswert?

@Leo (Gast)

>ich glaube der Code ist nicht für eine Art Multi Tasking ausgelegt.

Doch, aber nur für kooperatives.

Minimiere die Aktionen pro FATfs-Aufruf (mehrfach kurze Datenblöcke 
lesen/schreiben anstatt einmal einen großen Block).

von Leo (Gast)


Lesenswert?

Falk B. schrieb:
> denn das wird ZIEMLICH aufwändig!
das muss ich doch nur im LowLevel Treiber machen also sehr überschaubar.

Falk B. schrieb:
> Minimiere die Aktionen pro FATfs-Aufruf (mehrfach kurze Datenblöcke
> lesen/schreiben anstatt einmal einen großen Block).
Das wäre eine Möglichkeit aber das ist dann doch nicht sehr performant, 
oder ?
Ich dachte es wäre sinnvoller größere Blöcke über DMA zu lesen

von Falk B. (falk)


Lesenswert?

@Leo (Gast)

>> denn das wird ZIEMLICH aufwändig!
>das muss ich doch nur im LowLevel Treiber machen also sehr überschaubar.

Wenn du meinst.

>> Minimiere die Aktionen pro FATfs-Aufruf (mehrfach kurze Datenblöcke
>> lesen/schreiben anstatt einmal einen großen Block).
>Das wäre eine Möglichkeit aber das ist dann doch nicht sehr performant,
>oder ?

Nein, das wäre nicht performant.

>Ich dachte es wäre sinnvoller größere Blöcke über DMA zu lesen

Das ist es. Dann darf es aber keine gemeinsame Resource für den 
DMA-Kanal und die anderen Dinge geben, sprich, deine SD-Karte darf sind 
nicht mit anderen ICs das SPI teilen.
Siehe oben. Nimm getrennte SPI-Module. Ich würde es so machen, dann kann 
man SEHR performant ohne Handstände arbeiten. Hab ich mal mit einem 
DMX512 Rekorder gemacht.
Wobei sich dort der UART nicht mit dem SPI in die Quere gekommen ist.

Außerdem kann dir das trotz aller Programmiertricks die Petersilie 
verhageln. Denn SD-Karten genehmigen sich beim Schreiben bisweilen 
Pausen von 100-300ms, schlechte Karten sogar mehr. Dann kann deine 
"Zwischendurch mal was anderes mit SPI machen"-Funktion lange warten.

von Leo (Gast)


Lesenswert?

Ok, ich glaube ich habe mich falsch ausgedrückt.

Die SD Karte hängt alleine an einem SPI.
Weitere Teilnehmer hängen an einem anderen SPI Port und UARTs etc.
Und genau diese andere Peripherie möchte ich eben auch zwischendurch 
bedienen. Deswegen dachte ich mir ich lese z.B. größere Blöcke von der 
SD Karte über DMA und prüfe zwischendurch ob neue Daten über UART 
eingetroffen sind, bearbeite diese etc.

von Falk B. (falk)


Lesenswert?

@Leo (Gast)

>Die SD Karte hängt alleine an einem SPI.

Sag das doch gleich ;-)

>Weitere Teilnehmer hängen an einem anderen SPI Port und UARTs etc.
>Und genau diese andere Peripherie möchte ich eben auch zwischendurch
>bedienen.

Dann mach das per Timer-Interrupt.

> Deswegen dachte ich mir ich lese z.B. größere Blöcke von der
>SD Karte über DMA und prüfe zwischendurch ob neue Daten über UART
>eingetroffen sind, bearbeite diese etc.

Nein.

Was für einen uC hast du überhaupt? Bei meinen Test vor einigen Jahren 
zeigte sich, daß auch bei kleinen Blockgrößen ohne DMA noch ganz 
passable Datenraten erreichbar sind. Der Flaschenhals liegt eher beim 
SPI und seiner Taktrate als beim DMA.

Beitrag "Re: Geschwindigkeitsfrage AVR auf SD"

von Jim M. (turboj)


Lesenswert?

Falk B. schrieb:
> Minimiere die Aktionen pro FATfs-Aufruf (mehrfach kurze Datenblöcke
> lesen/schreiben anstatt einmal einen großen Block).

Weniger als 512 Byte kann man nicht am Stück lesen oder schreiben. Wenn 
man versucht weniger als einen 512 Byte Block zu schreiben, wird der 
erstmal zeitaufwändig vorher gelesen!

von Falk B. (falk)


Lesenswert?

@Jim Meba (turboj)

>> Minimiere die Aktionen pro FATfs-Aufruf (mehrfach kurze Datenblöcke
>> lesen/schreiben anstatt einmal einen großen Block).

>Weniger als 512 Byte kann man nicht am Stück lesen oder schreiben. Wenn
>man versucht weniger als einen 512 Byte Block zu schreiben, wird der
>erstmal zeitaufwändig vorher gelesen!

Stimmt doch gar nicht. FATfs puffert das intelligent.

von Jim M. (turboj)


Lesenswert?

Falk B. schrieb:
>>> Minimiere die Aktionen pro FATfs-Aufruf (mehrfach kurze Datenblöcke
>>> lesen/schreiben anstatt einmal einen großen Block).
>
>>Weniger als 512 Byte kann man nicht am Stück lesen oder schreiben. Wenn
>>man versucht weniger als einen 512 Byte Block zu schreiben, wird der
>>erstmal zeitaufwändig vorher gelesen!
>
> Stimmt doch gar nicht. FATfs puffert das intelligent.

Stimmt doch - nur wenn man am Ende des Files schreibt (append) dann 
liesst er keine alten Daten ein IMHO. Das war mir so bisher gar nicht 
aufgefallen.

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.