La mejor forma es usar el chip de temporizadores. Systick, RTC o periférica de los temporizadores. Estos tienen la ventaja de que el tiempo es preciso, determinista y puede ser adaptada fácilmente si velocidad de reloj de CPU se cambia. Opcionalmente, usted puede incluso dejar que la CPU de sueño y el uso de una señal de interrupción.
Sucio "ocupado-delay" bucles por otro lado, rara vez son precisas y vienen con diferentes problemas, tales como "acoplamiento" para un determinado conjunto de instrucciones de la CPU y el reloj.
Algunas cosas de la nota:
- Alternar un pin GPIO repetidamente, es una mala idea, puesto que esta corriente innecesariamente, y potencialmente también causa problemas de EMC si la patilla está conectada a las huellas.
- El uso de instrucciones NOP no podría funcionar. Muchas de las arquitecturas (como la Corteza M, si mal no recuerdo) son libres para saltar NOP sobre el nivel del CPU y en realidad no ejecutarlas.
Si desea insistir en la generación de un sucio ocupado-loop, entonces es suficiente sólo con volatile
califica el bucle de iteración. Por ejemplo:
void dirty_delay (void)
{
for(volatile uint32_t i=0; i<50000u; i++)
;
}
Esto está garantizado para generar diversos mierda de código. Por ejemplo ARM gcc -O3 -ffreestanding
le da:
dirty_delay:
mov r3, #0
sub sp, sp, #8
str r3, [sp, #4]
ldr r3, [sp, #4]
ldr r2, .L7
cmp r3, r2
bhi .L1
.L3:
ldr r3, [sp, #4]
add r3, r3, #1
str r3, [sp, #4]
ldr r3, [sp, #4]
cmp r3, r2
bls .L3
.L1:
add sp, sp, #8
bx lr
.L7:
.word 49999
Desde allí usted puede, en teoría, calcular la cantidad de garrapatas que cada instrucción tarda y cambiar el número mágico de 50000 en consecuencia. De la canalización, de la rama de predicción etc significa que el código se puede ejecutar más rápido que la suma de los ciclos de reloj, aunque. Ya que el compilador se decidió involucrar a la pila de almacenamiento de datos en caché podría también desempeñar un papel.
Mi punto aquí es que calcular con exactitud el tiempo que este código va a tomar realmente es difícil. Ensayo y error de benchmarking con un ámbito de aplicación es probablemente una de las más sensata idea de intentar cálculos teóricos.