Forum: Mikrocontroller und Digitale Elektronik System friert beim Schreiben auf SD-Karte ein


von Jens W. (jensw)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe ein Problem und da bräuchte ich ein bisschen Hilfe.

Hintergrund:
Ich will GRBL mit einem FPGA beschleunigen. Dazu habe ich ein Board 
gebaut, wo der µC, SD Karte, USB und ein Spartan-6 drauf sind. Das ist 
im Moment mein eigenes Bastelboard, mit dem ich alles mache. Das ganze 
ich Hobby.
Für den Anfang habe ich GRBL auf den µC portiert (XMega128) und hab auf 
6 Achsen erweitert. Das funktionierte einwandfrei. Damit das FPGA 
überhaupt später was machen kann müssen die Daten rüber kommen. Dazu ist 
das FPGA wie ein externes SRAM an den EBI angebunden. Ich habe alles 
geändert, dass alle Werte, die die Stepper ISR braucht, im externen SRAM 
liegen. Das funktioniert auch einwandfrei.
Dann habe ich mit dem FPGA angefangen zu entwickeln und da wäre es 
schön, wenn ich in der Simulation die Step-Segmente zur Verfügung hätte. 
Also wollte ich die in der ISR, immer wenn ein neues Segment geladen 
wird, auf SD Karte schreiben.
Die Karte funktioniert, die verwende ich auf für die Config für das 
FPGA.
Allerdings scheint es ein Problem zu geben, wenn ich während der ISR auf 
SD Karte schreiben will. Da friert das System ein.
Ich vermute dass das RAM vom µC nicht reicht und er Stack überläuft.
Das Board kann man ausschließen, das habe ich für andere Sachen schon 
verwendet. Das funktioniert tadellos und auch zusammen mit dem FPGA, da 
gibt es kein Thema, das mit dem hier beschriebenen zu tun hat.
Vor allem, im Moment ist das FPGA noch nicht mit im Spiel.

Den Code habe ich euch angehängt.
Ich gehe so vor:
Immer wenn ein neues Segment vom Stapel genommen wird, halte ich die 
Timer an, damit ich Zeit zum Schreiben habe. Dann wandel ich alle Werte 
in Strings, damit ich später leichter die Werte übernehmen kann.
Das funktioniert alles, bis auf die Funktion ffwrites(); Sobald die 
eincodiert ist bleibt das System stehen. Nicht immer zur gleichen Zeit, 
was für mich den Anschein hat, dass da ein Problem mit dem Stack ist.

Meine Frage:
Wie kann ich jetzt erstmal genauer debuggen wo das Problem genau ist? Da 
stehe ich ein wenig auf dem Schlauch. Wie bekomme ich raus, ob das RAM 
zu klein ist.
Der Ressourcen-Verbrauch wird beim Compilieren mit 74% angezeigt).

Ich hoffe ihr könnt mir da mit auf die Sprünge helfen!

Danke euch!
Grüße, Jens

von Roland E. (roland0815)


Lesenswert?

SD-Karte ist nicht echtzeitfähig.

I/O daher nicht in einer ISR. Außerdem machen die Karten alle x KByte 
eine Pause zum internen bearbeiten. Cache einplanen.

von Jens W. (jensw)


Lesenswert?

Hallo Roland,

danke für den Hinweis.
In Echtzeit muss das nicht sein, da ich während des Schreibens ja die 
Timer der ISR anhalte. Das macht nichts, wenn es da eine Pause gibt.

Was bedeutet die I/O ist nicht in der ISR? Bezieht sich das auf die 
Pins, dass die Zugriffe gar nicht gehen, oder meinst du die Zeit, die da 
benötigt wird.

Zum Cache:
Wie kann ich den planen? Gibt es da eine Faustformel oder kann ich den 
Wert bestimmen?

Grüße, Jens

von Falk B. (falk)


Lesenswert?

Jens W. schrieb:
> Also wollte ich die in der ISR, immer wenn ein neues Segment geladen
> wird, auf SD Karte schreiben.

Warum willst au die SD-Karte SCHREIBEN?

> Die Karte funktioniert, die verwende ich auf für die Config für das
> FPGA.
> Allerdings scheint es ein Problem zu geben, wenn ich während der ISR auf
> SD Karte schreiben will. Da friert das System ein.
> Ich vermute dass das RAM vom µC nicht reicht und er Stack überläuft.

Kann sein. Es kann aber auch sein, daß dein SD-Zugriff einen 
Timer-Interrrupt für diverse Timeouts braucht. Wenn du den Zugriff aus 
der ISR heraus machst, läuft der Timer-Interrupt nicht! (Beim AVR).

> Immer wenn ein neues Segment vom Stapel genommen wird, halte ich die
> Timer an, damit ich Zeit zum Schreiben habe. Dann wandel ich alle Werte
> in Strings, damit ich später leichter die Werte übernehmen kann.

Und das alles in einer ISR? OMG!

> Das funktioniert alles, bis auf die Funktion ffwrites(); Sobald die
> eincodiert ist bleibt das System stehen. Nicht immer zur gleichen Zeit,
> was für mich den Anschein hat, dass da ein Problem mit dem Stack ist.

Nein. Siehe oben.
>
> Meine Frage:
> Wie kann ich jetzt erstmal genauer debuggen wo das Problem genau ist? Da
> stehe ich ein wenig auf dem Schlauch. Wie bekomme ich raus, ob das RAM
> zu klein ist.

Pack die Schreibzugriffe außerhalb der ISR in die Hauptschleife.

> Der Ressourcen-Verbrauch wird beim Compilieren mit 74% angezeigt).

Soso. Es gibt ja auch nur eine Resource . . .

von Falk B. (falk)


Lesenswert?

Jens W. schrieb:
> Zum Cache:
> Wie kann ich den planen? Gibt es da eine Faustformel oder kann ich den
> Wert bestimmen?

Beitrag "Re: Geschwindigkeitsfrage AVR auf SD"

Bei meinen SD-Katen Basteien damals habe ich beim Schreiben Wartezeiten 
von bis zu 500ms gemessen! D.h. dein Datenpuffer aka FIFO muss für 
diese Zeit die Daten aus der ISR zwischenspeichern können, um 
Datenverlust zu vermeiden.

von Roland E. (roland0815)


Lesenswert?

Jens W. schrieb:
> Hallo Roland,
> ....
> Was bedeutet die I/O ist nicht in der ISR? Bezieht sich das auf die
> Pins, dass die Zugriffe gar nicht gehen, oder meinst du die Zeit, die da
> benötigt wird.
>

Ich gehe davon aus, dass du FAT auf der Karte nutzt. Es ist prinzipiell 
so, dass zum schreiben auf einen Datenträger mit Dateisystem gelesen 
werden muss. Das Dateisystem ist dabei egal.

Lesen nach schreiben kann bei SD mal ne halbe Sekunde dauern, bis die 
Daten anstehen. Zusätzlich zu den zu übermittelnden Steuer- und 
Adressdaten. Blockwechsel dauern auch, das merkst du daran, dass die 
Karte beim kontinuierlich schreiben plötzlich ne Pause macht und keine 
Daten annimmt.
Daher den Schreibprozess nicht in eine ISR, das friert dir den Rest der 
Hütte für die Zeit komplett ein.

Die I/O Register nutzen, aber in einen Zweig der main() packen, wenn 
kein OS verwendet wird. Bei einem OS einen niedrig priorisierten task 
aufsrtzen, der jederzeit schlafen kann.

: Bearbeitet durch User
von Jens W. (jensw)


Lesenswert?

Hallo zusammen,

vielen Dank für die Anregungen.
Natürlich weiß ich, dass man in der ISR nicht warten soll. Aber das 
Schreiben in die main() zu legen wird nicht so einfach funktionieren.
Ich schreibe in der ISR, da hier die Segmente geladen werden. Es gibt 
aber nach dem Laden eines neuen Segments nicht automatisch einen 
Rücksprung in die main.
Da komme ich nur so oft vorbei, wie es die Schrittgeschwindigkeit 
zulässt.

Die ISR für die Schrittmotoren läuft bei GRBL nebenläufig und komplett 
abhängig von den Timern (also die Schrittgeschwindigkeit). In den Pausen 
dazwischen werden neue Segmente berechnet und dem Puffer übergeben, aus 
der sich die ISR bedient.
Mir ist noch nicht klar, wie ich das so gestallten kann, dass ich keine 
Segmente verliere. Ich kann in der ISR ein Flag setzen "schreibe daten", 
aber wann ich in der main da wieder vorbei komme ist nicht 
sichergestellt. Das kann auch zwei Segmente später sein. Die 
main-Schleife ist ja nicht leer, sondern da passiert das ganze Protokoll 
Handling zum PC, dass neuer G-Code geladen wird.

Oder habe ich euch da falsch verstanden?

Grüße

von Falk B. (falk)


Lesenswert?

Jens W. schrieb:
> Hallo zusammen,
>
> vielen Dank für die Anregungen.
> Natürlich weiß ich, dass man in der ISR nicht warten soll. Aber das
> Schreiben in die main() zu legen wird nicht so einfach funktionieren.

Doch. Wenn man weiß, wie sowas geht. Das Stichwort fiel ja schon. 
FIFO.

> Ich schreibe in der ISR, da hier die Segmente geladen werden. Es gibt
> aber nach dem Laden eines neuen Segments nicht automatisch einen
> Rücksprung in die main.

Den gibt es in einer ISR nie ;-)

> Mir ist noch nicht klar, wie ich das so gestallten kann, dass ich keine
> Segmente verliere.

Ganz einfach. Du schreibst die binären Daten in einen FIFO. Das geht 
sehr schnell. In der Hauptschleife wird zyklisch geprüft, ob Daten im 
FIFO liegen. Wenn ja, werden die gelesen und meinetwegen auch in ASCII 
gewandelt und auf SD-Karte geschrieben. Das kann "beliebig" langsam 
erfolgen, solange der FIFO ausreichend groß ist.

von Jens W. (jensw)


Lesenswert?

Ok, das mit dem FIFO leuchtet ein. Das versuche ich mal.

Danke euch!

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.