3.3. Temporizadores virtuales¶
La página Temporización cubrió las marcas de tiempo y los bucles no bloqueantes impulsados por time.ticks_diff(). Un temporizador virtual es la cara opuesta: el software le pide al entorno de ejecución que llame a una función según una planificación, y el entorno invoca la función de retorno (callback) sin que el script tenga que comprobar el reloj él mismo.
3.3.1. La clase machine.Timer¶
machine.Timer construye un temporizador virtual. El comportamiento entre puertos requiere el id especial -1; todo lo demás – período, modo, callback – se establece mediante argumentos con nombre:
from machine import Timer
def tick(t):
print("tick")
tim = Timer(-1)
tim.init(period=100, callback=tick) # 10 Hz
La función de retorno (callback) se invoca como cualquier llamada de función ordinaria – puede asignar objetos, usar print() y llamar a otro código de biblioteca sin ninguna restricción especial.
3.3.2. Periódico y de un solo disparo¶
Hay dos modos disponibles:
Timer.PERIODIC(el valor por defecto). La función de retorno se dispara cadaperiodmilisegundos, indefinidamente, hasta que se llama adeinit()o se reinicializa el temporizador.Timer.ONE_SHOT. La función de retorno se dispara una vez,periodmilisegundos después deinit(), y el temporizador entonces se detiene.
Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)
deinit() detiene un temporizador periódico y cancela cualquier función de retorno pendiente:
tim.deinit()
3.3.3. Cuándo recurrir a un temporizador¶
Los temporizadores virtuales y el patrón de sondeo con ticks_diff() de Temporización resuelven el mismo problema desde direcciones opuestas. Un bucle de sondeo comprueba el reloj en cada iteración y actúa cuando ha pasado suficiente tiempo; un temporizador le pide al entorno de ejecución que despierte al script cuando ha pasado suficiente tiempo.
Sondeo
ticks_diff. Todo se queda en un solo lugar – el bucle es dueño de la temporización, sin funciones de retorno adicionales que rastrear. Lo mejor para trabajo corto y bien definido que une varias tareas dirigidas por el tiempo.Temporizador virtual. Saca la planificación del cuerpo del bucle. Lo mejor cuando la tarea periódica es independiente del flujo principal (un LED de latido, una muestra periódica de un sensor) y permite que el bucle principal dedique su tiempo a otro trabajo.
Ambos enfoques usan el mismo reloj subyacente y ofrecen la misma precisión en períodos de un milisegundo o más. Ninguno es apropiado para la conmutación precisa de pines ni para la generación de formas de onda por debajo del milisegundo – la latencia de la función de retorno es del orden del tick del planificador, no de nanosegundos.