Forum: Mikrocontroller und Digitale Elektronik while bedingung wegobtimiert


von lucian (Gast)


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

von holger (Gast)


Lesenswert?

Mach sys.wait_timer volatile

von Ralph B. (ralph-b)


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.

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.