USART über DMA -> Daten verwerfen

OP #2747891
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!
OP #2748000
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 :)
OP #2748107
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren