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

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.