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!
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?
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.
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 :)
Ich denk da ist schon was am System falsch wenn man Daten verwerfen muss...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.