Ho il seguente codice nel mio programma di microcontrollore:
// Wait for ADC conversion to complete
while ( ( ADCSRA && _BS( ADSC ) ) == _BS( ADSC ) ) {}
Dove ADCSRA è un registro che cambierà il suo valore una volta completata una conversione analogica e dove voglio aspettare che un po 'sia chiaro. Questo bit indica la conversione completata.
Guardando il codice assembly risultante, l'intero ciclo viene sostituito da una singola istruzione:
in r24, 0x06 ; ADCSRA
Il registro viene letto, ma il suo valore non è nemmeno testato !?
Come devo modificare il mio codice C ++ per indicare al compilatore di continuare a ricontrollare il registro, senza inutili ritardi nel programma?
Uso la toolchain avr-gcc.
EDIT: ho modificato il codice come segue (Thnx: lhballoti):
while ( ( ADCSRA & _BS( ADSC ) ) == _BS( ADSC ) ) {}
Che ha cambiato il codice assembly in:
38: 36 99 sbic 0x06, 6 ; 6
3a: fe cf rjmp .-4 ; 0x38 <__CCP__+0x4>
Che risolve apperentemente il problema.
Controllare questa pagina per il programma completo e il codice risultante smontato.
ADCSRA
non è volatile, anche il secondo caso non è soggetto alla stessa ottimizzazione?