while bedingung wegobtimiert

Gast #781278
Lesenswert?
• ▲
▼
ich komme langsam zum verzweifeln mit dem optimierungen -Os bei winavr 
gcc mit AVRSTUDIO.

folgende while schleife mit TIMEOUT funktion wartet auf das BIT in PINC 
und der sys.wait_timer wird innerhalb einer interrupt routine 
heruntergezählt.

sys.wait_timer = 4;

while (((!(PINC & 0b00000100)) && (sys.wait_timer > 0) ));
while ((PINC & 0b00000100));


winavr gcc optimiert einfach den term (sys.wait_timer > 0) weg, damit 
bleibt die schleife hängen.

kann das einer erklären, wie kann man das umgehen?

142:          sys.wait_timer = 4;
+000006E1:   E084        LDI     R24,0x04         Load immediate
+000006E2:   E090        LDI     R25,0x00         Load immediate
+000006E3:   939003B2    STS     0x03B2,R25       Store direct to data 
space
+000006E5:   938003B1    STS     0x03B1,R24       Store direct to data 
space
144:          while (((!(PINC & 0b00000100)) && (sys.wait_timer > 0) ));
+000006E7:   9B32        SBIS    0x06,2           Skip if bit in I/O 
register set
+000006E8:   CFFE        RJMP    PC-0x0001        Relative jump
145:              while ((PINC & 0b00000100));
+000006E9:   9932        SBIC    0x06,2           Skip if bit in I/O 
register cleared
+000006EA:   CFFE        RJMP    PC-0x0001        Relative jump
+000006EB:   9508        RET                      Subroutine return
#781398
Lesenswert?
• ▲
▼
bei 142: setzt du den sys.wait_timer = 4 und willst ihn 4 
Assemblerzeilen später auf >0 abfragen. Da zwischen den beiden punkten 
keine Änderung eintritt, ist die Bedingung immer erfüllt.

Ohne Volatile hält der Compiler diesen Wert im Register und optimiert 
die Bedingung weg.

Durch Volatile muss der Compiler den Wert der Variablen sys.wait_timer 
für den Vergleich neu einlesen und kann dadurch den Vergleich nicht 
wegoptimieren.

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.