Mientras el bucle está optimizado

8

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.

    
pregunta jippie

1 respuesta

11

Deberías estar utilizando un bit a AND. La expresión en el primer bucle while se evalúa en cero, lo que hace que el compilador elimine el bucle por completo.

    
respondido por el lhballoti

Lea otras preguntas en las etiquetas