3.3. Minuteurs virtuels

La page Temporisation a couvert les horodatages et les boucles non bloquantes pilotées par time.ticks_diff(). Un minuteur virtuel est l’envers de la médaille : le logiciel demande au runtime d’appeler une fonction selon un calendrier, et le runtime invoque la fonction de rappel sans que le script ait à vérifier l’horloge lui-même.

3.3.1. La classe machine.Timer

machine.Timer construit un minuteur virtuel. Le comportement multiplateforme requiert l’id spécial -1 ; tout le reste – période, mode, fonction de rappel – est défini par des arguments nommés :

from machine import Timer

def tick(t):
    print("tick")

tim = Timer(-1)
tim.init(period=100, callback=tick)   # 10 Hz

La fonction de rappel est invoquée comme n’importe quel appel de fonction ordinaire – elle peut allouer des objets, appeler print() et appeler d’autre code de bibliothèque sans aucune restriction particulière.

3.3.2. Périodique et à un coup

Deux modes sont disponibles :

  • Timer.PERIODIC (le mode par défaut). La fonction de rappel se déclenche toutes les period millisecondes, indéfiniment, jusqu’à ce que deinit() soit appelée ou que le minuteur soit réinitialisé.

  • Timer.ONE_SHOT. La fonction de rappel se déclenche une seule fois, period millisecondes après init(), puis le minuteur s’arrête.

Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)

deinit() arrête un minuteur périodique et annule toute fonction de rappel en attente :

tim.deinit()

3.3.3. Quand recourir à un minuteur

Les minuteurs virtuels et le motif d’interrogation ticks_diff() de Temporisation résolvent le même problème de directions opposées. Une boucle d’interrogation vérifie l’horloge à chaque itération et agit lorsque suffisamment de temps s’est écoulé ; un minuteur demande au runtime de réveiller le script lorsque suffisamment de temps s’est écoulé.

  • Interrogation ticks_diff. Tout reste au même endroit – la boucle maîtrise la temporisation, aucune fonction de rappel supplémentaire à suivre. Idéal pour un travail court et bien défini qui relie plusieurs tâches pilotées par le temps.

  • Minuteur virtuel. Déplace le calendrier hors du corps de la boucle. Idéal lorsque la tâche périodique est indépendante du flux principal (une LED de battement de cœur, un échantillonnage périodique de capteur) et laisse la boucle principale consacrer son temps à d’autres travaux.

Les deux approches utilisent la même horloge sous-jacente et offrent la même précision pour des périodes d’une milliseconde ou plus. Aucune n’est appropriée pour un basculement précis de broche ou une génération de forme d’onde inférieure à la milliseconde – la latence de la fonction de rappel est de l’ordre du tick de l’ordonnanceur, et non de la nanoseconde.