Forum: Mikrocontroller und Digitale Elektronik SD-Karte mit Dateisystem und DMA


von Guest12345 (Gast)


Lesenswert?

Hallo,

ich habe eine grundsätzliche Frage zur Verwendung eines Dateisystems:
Auf meinem µC läuft momentan die EFSL. Damit kann ich (nach einigen 
Anpassungen) momentan Dateien auf FAT32 lesen und schreiben (SD und 
SDHC).
Ziel ist es einige Daten mitzuloggen.

Der Ablauf sollte folgendermaßen sein:
- µC startet: neue Datei wird angelegt
- Timestamp in Datei schreiben
- Alle 100ms wird eine neue Messung/Datensatz geschrieben

Soweit kein Problem, ABER:

Ich möchte das ganze jetzt, um den Prozessor zu entlasten, mit DMA 
realisieren.
Wie sieht die Kommunikation auf SPI-Ebene aus, wenn die neue Datei schon 
angelegt wurde?
Kann ich dann die Daten mit dem DMA einfach "roh" zur SD-Karte schieben 
(dass eine ASCII-Umwandlung notwendig ist, ist klar) oder ist bei den 
Datensätzen ein Overhead aufgrund des Filesystems notwendig?

von Coder (Gast)


Lesenswert?

Mit dem DMA kannst Du autonom Daten senden und enmpfangen. Du musst die 
daten aufbereit bereitstellen für das senden, und selber verarbeiten 
beim empfangen. Wenn es das ist was du möchtest, lautet die antwort ja.

von Felix G. (felixg)


Lesenswert?

Hallo,
ich verwende für das Empfangen von Daten ebenfalls den DMA-Controller. 
Anschließend speichere ich die Daten direkt in der SD-Karte (benutze 
FAT16). Die ASCII-Umwandlung kommt dann hinterher am Rechner.

Grüße

von Jim M. (turboj)


Lesenswert?

Guest12345 schrieb:
> Wie sieht die Kommunikation auf SPI-Ebene aus, wenn die neue Datei schon
> angelegt wurde?

Bei EFSL muss die SPI Kommunikation im Source Code dabei sein. Use the 
Source, Luke!

Die Struktur ist beim Schreiben aber für DMA eher ungünstig, da man nach 
dem Kommando auf ein einzelnes Byte von der Karte warten muss, bevor man 
die Daten schreiben kann.

von Sascha W. (sascha-w)


Lesenswert?

Guest12345 schrieb:
> Hallo,
> Ich möchte das ganze jetzt, um den Prozessor zu entlasten, mit DMA
> realisieren.
Das bedeutet jedoch, das du den Zugriff ganz schön umbauen musst.
In deinem jetzigen Programm schreibt/liest die Funktion jeweils Blöcke 
zu 512Byte (wenn der Burstmodus unterstützt wird evl. auch mehr).

LESEN ohne DMA
* die Daten stehen sofort nach Rückkehr aus der Leseroutine zur weiteren 
Verwendung in der Anwendung zur Verfügung
LESEN mit DMA
* lesen wird "beauftragt" und Leseroutine kehrt zur Anwendung zurück, 
irgendwann kommt ein Event und dann stehen die Daten im RAM bereit.

SCHREIBEN ohne DMA
* Daten die die Anwendung im Schreibpuffer bereitstellt werden mit 
Aufruf der Schreibroutine auf die Karte geschieben, nach Rückkerhr aus 
eben dieser ist der Schreibvorgang abgeschlossen und die Anwendung kann 
den nächsten Datenblock vorbereiten
SCHREIBEN mit DMA
* mit dem Aufruf der Schreibroutine wird die DMA gestartet und die 
Schreibroutine kehrt zur Anwendung zurück. Nach Abschluss des 
DMA-Transfers kommt wieder ein Event mit dem due der Anwendung sagen 
kannst das sie den nächsten Block vorbereiten kann.

Wenn du den Controller entlasten willst, darf deine Anwendung an der 
Stelle wo die DMA im Hintergrund läuft natürlich nicht einfach nur auf 
den Event warten, denn dann kann dein Controller ja währenddessen auch 
nichts anderes machen.

Sascha

von Phantomix X. (phantomix)


Lesenswert?

Genau an dieser Stelle wird das Thema interesant. Ich schlage ein RTOS 
vor, um Tasks wie "SPI schreiben" von Tasks die dann warten müssten 
getrennt werden. Der eigentliche File-Zugriff kann dann trotzdem 
blockend sein, die anderen (zeitkritischen) tasks laufen ja weiter...

Welche Strategien würdet ihr verfolgen, um das Problem zu lösen?

von Guest12345 (Gast)


Lesenswert?

Erstmal vielen Dank für die Antworten,

in dem Programm gibt es bereits Tasks, welche zyklisch in verschiedenen 
Rastern aufgerufen werden.

Dadurch, dass ich bei der Verwendung eines Dateisystems nicht so ganz 
durchblicke ist beine Frage eigentlich:
Nachdem eine Datei auf der SD-Karte angelegt wurde und ich schon mit dem 
Prozessor ein paar Zeichen in diese Text-Datei geschrieben habe: Kann 
ich anschließend Daten (unter Verwendung des DMAs) einfach im Rohformat 
inkl. Addresse wo sie gespeichert werden sollen (welche einfach 
inkrementiert wird) zur SD-Karte schicken? Oder muss ich wirklich die 
Funktion der EFSL verwenden?

Wenn ja:
Würdet ihr es für besser halten ohne Dateisystem zu arbeiten?
Denn die SD-Karte dieses Datenloggers wird sowiesoo nie ausgebaut. Um 
die Daten auf den Rechner zu kriegen, sende ich sie ohnehin über die 
RS232 (bzw. USB mit FTDI-Chip).

von Coder (Gast)


Lesenswert?

Vielleicht schaust du einfach mal in den Quellkode machst dir klar wie 
das Ganze abläuft und wo du mit dem DMA etwas machen kannst Dann hast du 
eine Chance herauszufinden, ob sich die Mühe lohnt, oder ob du es so 
belässt wie es ist. Es scheint ja zu funktionieren. Never change a 
running system...

Nur Du weisst wie dein Programm funktioniert.

von Sascha W. (sascha-w)


Lesenswert?

Guest12345 schrieb:
> Erstmal vielen Dank für die Antworten,
> durchblicke ist beine Frage eigentlich:
> Nachdem eine Datei auf der SD-Karte angelegt wurde und ich schon mit dem
> Prozessor ein paar Zeichen in diese Text-Datei geschrieben habe: Kann
> ich anschließend Daten (unter Verwendung des DMAs) einfach im Rohformat
> inkl. Addresse wo sie gespeichert werden sollen (welche einfach
> inkrementiert wird) zur SD-Karte schicken?
Mal auf die Schnelle ...
die Karte braucht vorm Schreiben ein Kommando, das du schreiben willst 
und wohin (Block). Dann musst du paar Dummydaten senden um im Ergebnis 
auf die schreibbereitschaft zu warten. Dann kannst du den eigentlichen 
Datenblock senden und zwar immer 512Byte. Wenn du also 20Byte schreibst, 
und dann später noch mal 50Byte, dann musst du erst mal den Block mit 
den 512Byte wieder lesen deine 50Byte einfügen und dann den Block mit 
512Byte schreiben. Das macht alles die Lib. Wenn du ohne Filesys. 
arbeiten willst ändert das daran auch nichts. Mit FS kommen halt noch 
zusätzliche Operationen wie Dateisystemeinträge und Clusterreservierung 
in der FAT hinzu.

> Oder muss ich wirklich die
> Funktion der EFSL verwenden?
besser schon

Sascha

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.