Receive Buffer leeren

#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

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