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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.