Mientras que el bucle está optimizado

Tengo el siguiente código en mi programa de microcontrolador:

// 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 que la conversión se completó.

Mirando el código ensamblador resultante, todo el ciclo se reemplaza por una sola instrucción:

in      r24, 0x06       ; ADCSRA

¿¡El registro se lee, pero su valor ni siquiera se prueba!?

¿Cómo tengo que cambiar mi código C++ para indicarle al compilador que siga revisando el registro, sin retrasar innecesariamente el programa?

Yo uso la cadena de herramientas avr-gcc.

EDITAR: cambié el código de la siguiente manera (Thnx: lhballoti):

while ( ( ADCSRA & _BS( ADSC ) ) == _BS( ADSC ) ) {}

Lo 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 aparentemente resuelve el problema.

Consulte esta página para ver el programa completo y su código resultante desensamblado.

¿No querrás usar un AND bit a bit?
por lo general, declararía que los registros son volátiles, y luego los bucles donde no modifique las cosas no se optimizarán ... pero eso debería hacerse por usted en los archivos de inclusión.
Aunque detecté el error de inmediato, tengo problemas para entender por qué el compilador optimizó el ciclo en el primer caso. Si ADCSRAno es volátil, ¿el segundo caso no está también sujeto a la misma optimización?
No debe editar su pregunta con la respuesta, sino aceptar la respuesta de alguien o escribir su propia respuesta y aceptarla.
@Kellenjb: Jippie lo agregó antes de que fuera una respuesta. lhballoti primero lo dio como comentario.
@Kellenjb no fue una respuesta al momento de escribir, simplemente un comentario. Además, no puedo hacer ningún formato en los comentarios, lo que hace que el comentario sea muy pobre para leer. Es por eso que elegí actualizar la pregunta.

Respuestas (1)

Debería usar un AND bit a bit. La expresión en el primer whilebucle se evalúa como cero, lo que hace que el compilador elimine el bucle por completo.