Tengo el siguiente código en mi programa de microcontroladores:
// Wait for ADC conversion to complete
while ( ( ADCSRA && _BS( ADSC ) ) == _BS( ADSC ) ) {}
Donde ADCSRA es un registro que cambiará su valor una vez que se complete una conversión analógica y donde quiero esperar un poco para que quede claro. Este bit indica la conversión completada.
Mirando el código de ensamblaje resultante, todo el bucle se reemplaza por una sola instrucción:
in r24, 0x06 ; ADCSRA
¡Se lee el registro, pero su valor ni siquiera se ha probado !?
¿Cómo debo cambiar mi código C ++ para indicar al compilador que vuelva a verificar el registro, sin demorar innecesariamente el programa?
Uso la cadena de herramientas avr-gcc.
EDITAR: Cambié el código de la siguiente manera (Thnx: lhballoti):
while ( ( ADCSRA & _BS( ADSC ) ) == _BS( ADSC ) ) {}
Que cambió el código de ensamblaje a:
38: 36 99 sbic 0x06, 6 ; 6
3a: fe cf rjmp .-4 ; 0x38 <__CCP__+0x4>
Lo que soluciona aparentemente el problema.
Consulte esta página para ver el programa completo y su código resultante desensamblado.