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