Receive Buffer leeren

OP #4385452
Lesenswert?
• ▲
▼
Guten Abend,

ich will einen Receive Buffer leeren (ist ein Xmega wo die USART im SPI 
Mode per DMA befüllt wird). Das ist im Prinzip kein Problem, aktuell 
mache ich das so:
1
while (MY_USART.STATUS & USART_RXCIF_bm) { dma_down_buf.msg_data[0] = MY_USART.DATA; }

Ich lese in dma_down_buf.msg_data[0] ein (das ist der DMA Buffer aus dem 
gesendet wurde). Das ist optisch aber etwas verwirrend, eigentlich muss 
ja nur der DATA Buffer leer gelesen werden. Der Inhalt interessiert 
nicht und kann in den "Müll". Frage ist, wie kann ich das in eine lokale 
TEMP Variable einlesen, ohne das der GCC das wegoptimiert, weil es ja 
nicht verendet wird?

Danke schon einmal im Voraus für etwas C Hilfe.

LG Willi
#4385479
Lesenswert?
• ▲
▼
Toralf W. schrieb:
> Ich lese in dma_down_buf.msg_data[0] ein (das ist der DMA Buffer aus dem
> gesendet wurde). Das ist optisch aber etwas verwirrend, eigentlich muss
> ja nur der DATA Buffer leer gelesen werden. Der Inhalt interessiert
> nicht und kann in den "Müll". Frage ist, wie kann ich das in eine lokale
> TEMP Variable einlesen, ohne das der GCC das wegoptimiert, weil es ja
> nicht verendet wird?

Sofern der Buffer volatile ist (was er vermutlich ja eh sein muss), darf 
der Compiler Zugriffe darauf nicht wegoptimieren. Da brauchst du nicht 
mal eine Variable, in die das kopiert werden müsste. Es reicht schon ein 
lapidares:
1
    MY_USART.DATA;

Ggf noch mit einem (void) garniert, um zu zeigen, daß du den Wert mit 
Absicht verwirfst.
1
    (void) MY_USART.DATA;
Gast #4385512
Lesenswert?
• ▲
▼
Das müsste eigentlich mit lesbaren Hardwareregistern immer gehen. Denn 
sie müssen korrekterweise auch immer volatile deklariert sein. (Es mag 
dabei gewisse sinnvolle Ausnahmen geben, aber für ein UART-Register 
gelten die sicher nicht).

Aber ob das wegoptimiert wird, siehst Du spätestens im Assemblerlistung.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.