La frase citada no es una advertencia, es simplemente una declaración sobre cómo funcionan las cosas.
No hay nada intrínsecamente malo en usar millis()
o micros()
dentro de una rutina de interrupción escrita correctamente.
Por otro lado, hacer cualquier cosa dentro de una rutina de interrupción escrita incorrectamente es, por definición, incorrecto.
Una rutina de interrupción que lleva más de unos pocos microsegundos para hacer su trabajo, con toda probabilidad, está escrita incorrectamente.
En resumen: una rutina de interrupción escrita correctamente no causará ni encontrará problemas con millis()
o micros()
.
Editar: con respecto a "por qué micros ()" comienza a comportarse de manera errática "", como se explica en un " examen de la página web de la función de micros Arduino ", el micros()
código en un Uno común es funcionalmente equivalente a
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
Esto devuelve un largo sin signo de cuatro bytes compuesto por los tres bytes más bajos timer0_overflow_count
y un byte del registro de conteo del temporizador-0.
El controlador de interrupciones timer0_overflow_count
incrementa aproximadamente una vez por milisegundo TIMER0_OVF_vect
, como se explica en un examen de la página web de la función arduino millis .
Antes de que comience un controlador de interrupciones, el hardware AVR desactiva las interrupciones. Si (por ejemplo) un controlador de interrupciones se ejecutara durante cinco milisegundos con las interrupciones aún deshabilitadas, se perderían al menos cuatro desbordamientos del temporizador 0. [Las interrupciones escritas en código C en el sistema Arduino no son reentrantes (capaces de manejar correctamente ejecuciones superpuestas múltiples dentro del mismo controlador) pero se podría escribir un controlador de lenguaje ensamblador reentrante que vuelva a activar las interrupciones antes de que comience un proceso lento.]
En otras palabras, los desbordamientos del temporizador no se "acumulan"; cada vez que ocurre un desbordamiento antes de que se haya manejado la interrupción del desbordamiento anterior, el millis()
contador pierde un milisegundo y la discrepancia timer0_overflow_count
a su vez también se micros()
equivoca en un milisegundo.
Con respecto a "más corto que 500 μs" como límite de tiempo superior para el procesamiento de interrupción, "para evitar bloquear la interrupción del temporizador durante demasiado tiempo", podría subir a poco menos de 1024 μs (por ejemplo, 1020 μs) y millis()
seguiría funcionando, la mayoría de las veces hora. Sin embargo, considero un controlador de interrupciones que toma más de 5 μs como un perezoso, más de 10 μs como perezoso, más de 20 μs como un caracol.