Forum: Compiler & IDEs Receive Buffer leeren


von Toralf W. (willi)


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

von Rolf M. (rmagnus)


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;

von Toralf W. (willi)


Lesenswert?

Guten Abend Rolf,

den Buffer hatte ich ja nur genommen, damit er es nicht wegoptimiert.
Aber wenn ein:
1
(void) MY_USART.DATA;
zum lesen ausreicht, dann ist das so gelöst.
Danke.

von Klaus (Gast)


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.

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.