Gast
#781278
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