Función de retardo para un STM32L152

0

Quiero implementar una función de retardo muy simple con más o menos este aspecto:

void delay(float seconds){
 int i;
 for(i=0; i<seconds*5000000; i++);
}

Se basa solo en los ciclos de reloj (haciendo algunas pruebas asumí que 5000000 ciclos son de 1 segundo) pero no funciona en absoluto. En su lugar, espera para siempre, pero utilizando

void delay(float cycles){
 int i;
 for(i=0; i<cycles; i++);
}

simplemente funciona bien si, por ejemplo, quiero que el programa espere 2 segundos haciendo cycles=10000000 , ¿alguien sabe por qué?

    
pregunta Martín

1 respuesta

3

En su primer ejemplo, se evalúa la multiplicación del seconds float por 5000000 en cada iteración, para verificar la condición final. Lo cual es muy lento (y hace que parezca que dura para siempre).

cambiar a:

int i, max = (int)(seconds*5000000);
for(i=0; i<max; i++);

Esto evaluará seconds*5000000 solo una vez, antes del bucle.

Además, tenga cuidado de que si las optimizaciones están habilitadas, dependiendo del compilador, cualquiera de los códigos de ejemplo anteriores se pueda optimizar completamente (ya que no hay efectos secundarios que verá el compilador), y terminará sin retraso en absoluto. Para evitar que el compilador haga esto, puedes declarar i como volatile .

    
respondido por el dim

Lea otras preguntas en las etiquetas