Könnte dieser Ausdruck wegoptimiert werden?

OP #2918757
Lesenswert?

1
void spi_senden(void){
2
//mega32
3
#include <avr/io.h>
4
uint8_t dummy; // wird nie gelesen
5

6
SPDR = 15;
7
while(!spif); //Pseudocode: warten bis das SPI-Interruptflag durch die Hardware gesetzt wird
8
dummy = SPSR;
9
 dummy = SPDR;
10
// jetzt können weitere Daten gesendet werden.
11
 }

Sinn und Zweck: Mit den zwei Codezeilen wird das SPI-Interruptflag 
gelöscht.
#2918771
Lesenswert?

Rufus Τ. Firefly schrieb:
> Da die hier verwendeten Register als volatile deklariert sein sollten,
> sollte eigentlich das Konstrukt nicht wegoptimiert werden.

Zumindest werden die Register dann mit Sicherheit gelesen. Was mit dem 
gelesenen Ergebnis passiert, ist offen. Da aber Ergebnis und dummy eh 
nie verwendet werden, ist das eigentlich auch egal. Insofern könnte man 
an Stelle von

>dummy = SPSR;
>dummy = SPDR;

auch einfach

>SPSR;
>SPDR;

schreiben.

Oliver
Moderator #2918807
Lesenswert?

Oliver S. schrieb:
> auch einfach
>
>>SPSR;
>>SPDR;
>
> schreiben.

Genau so ist es richtig. Die Dummy-Variable würde der Compiler ohnehin
wegoptimieren, also kann man sie auch gleich weglassen. Man vermeidet
dadurch auch eine Warnung wegen "unused variable", und der Leser des
Codes muss nicht suchen, ob dummy vielleicht doch noch irgendwo anders
verwendet wird.
Persönliche Seite #2918872
Lesenswert?

Yalu X. schrieb:
> Oliver S. schrieb:
>> auch einfach
>>
>>>SPSR;
>>>SPDR;
>>
>> schreiben.
>
> Genau so ist es richtig. Die Dummy-Variable würde der Compiler ohnehin
> wegoptimieren, also kann man sie auch gleich weglassen. Man vermeidet
> dadurch auch eine Warnung wegen "unused variable", und der Leser des
> Codes muss nicht suchen, ob dummy vielleicht doch noch irgendwo anders
> verwendet wird.

Kann man dann auch so ausdrücken, daß die Register gelesen werden, deren 
Inhalt aber nicht verwendet werden.  D.h. die Register werden nur wegen 
der damit verbundenen Seiteneffekte (dem volatile in der Definition) 
gelesen:
1
(void) SPSR;
2
(void) SPDR;

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