Forum: Mikrocontroller und Digitale Elektronik USART über DMA -> Daten verwerfen


von Jan K. (jan_k)


Lesenswert?

Hallo Leute,

ich habe meine UART auf einem STM32F100 auf DMA umgestellt und habe 
folgendes Problem:

Ich habe einen Puffer, der 16 Bytes aufnehmen kann und 4 Zeilen "tief" 
ist. Ich kann also max 4 Datensätze puffern, die dann abgearbeitet 
werden.
Kommt ein fünfter Satz rein, ohne dass Platz ist möchte ich, dass der 
aktuelle Datensatz (nicht der älteste à la Ringpuffer) verworfen wird. 
Die Frage: Wie mache ich das? Ich kann in der DMA ISR natürlich 
abfragen, ob der Puffer voll ist. Ist das der Fall, möchte ich, dass die 
Daten nicht mehr kopiert werden. Zum Beispiel indem ich den DMA 
ausschalte. Aber natürlich tritt dann ein Overrun an der UART auf, was 
ich nicht möchte, da zur Fehleranalyse der Overrun Interrupt der UART 
aktiviert ist.

Gibt es sowas, wie ein "schwarzes Loch", /dev/null, was auch immer, 
möglichst ohne Speicher zu verschwenden? Natürlich kann ich den circular 
Mode des DMA anmachen und irgendwo in den Speicher schreiben (natürlich 
in eine vorher definierte Variable), aber da brauche ich eben Speicher..

Danke + schöne Grüße!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Bei vollem "DMA-Puffer" auf UART-ISR umschalten und jedes empfangene 
Zeichen "von Hand" wegwerfen?

Oder vielleicht bei so geringem Datenmengen gleich ganz auf DMA-Betrieb 
verzichten?

von (prx) A. K. (prx)


Lesenswert?

Jan K. schrieb:
> Gibt es sowas, wie ein "schwarzes Loch", /dev/null, was auch immer,
> möglichst ohne Speicher zu verschwenden?

Das DMA auf nicht-inkrementierend umstellen, wenn der DMA-Counter 
abgelaufen ist. Ein einziges Byte als Mülleimer geht ja wohl noch.

von Jan K. (jan_k)


Lesenswert?

Danke für eure Antworten!

Rufus Τ. Firefly schrieb:
> Bei vollem "DMA-Puffer" auf UART-ISR umschalten und jedes empfangene
> Zeichen "von Hand" wegwerfen?
>
> Oder vielleicht bei so geringem Datenmengen gleich ganz auf DMA-Betrieb
> verzichten?

Wollte den DMA ausprobieren, und wenn man schon CPU Zeit sparen kann, 
was spricht dagegen (vorausgesetzt es funktioniert natürlich ;))
Im Moment verwerfe ich die Bytes, wenn der ORE Interrupt kommt, was ja 
in dem Fall das selbe ist, wie der RXNE Interrupt.

A. K. schrieb:
> Das DMA auf nicht-inkrementierend umstellen, wenn der DMA-Counter
> abgelaufen ist. Ein einziges Byte als Mülleimer geht ja wohl noch.

Ja klar, das geht :) Aber ich dachte eventuell gibt es da schon was 
eingebautes.

Ich denke, ich werde die Daten weiterhin in der UART ISR verwerfen, 
danke für eure Meinungen :)

von Oje (Gast)


Lesenswert?

Ich denk da ist schon was am System falsch wenn man Daten verwerfen 
muss...

von Jan K. (jan_k)


Lesenswert?

Okay, aber was würdest du sonst machen, wenn der Eingangspuffer voll 
ist, die Befehle aber noch nicht verarbeitet wurden? (Dieser Fall sollte 
eh nie auftreten, aber es hieß ich solle mir um den Fehlerfall Gedanken 
machen ;))
Ich kann natürlich auch im Kreis schreiben, aber dann werden unter 
Umständen noch nicht bearbeitete Befehle überschrieben, das kann auch 
nicht die Lösung sein

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.