3.3. Timer virtuali#
La pagina Temporizzazione ha trattato i timestamp e i cicli non bloccanti guidati da time.ticks_diff(). Un timer virtuale è il rovescio della medaglia: il software chiede al runtime di chiamare una funzione secondo una pianificazione, e il runtime invoca il callback senza che lo script debba controllare da solo l’orologio.
3.3.1. La classe machine.Timer#
machine.Timer costruisce un timer virtuale. Il comportamento valido su tutte le porte richiede l’id speciale -1; tutto il resto – periodo, modalità, callback – viene impostato tramite argomenti keyword:
from machine import Timer
def tick(t):
print("tick")
tim = Timer(-1)
tim.init(period=100, callback=tick) # 10 Hz
Il callback viene invocato come qualsiasi normale chiamata di funzione – può allocare oggetti, usare print() e chiamare altro codice di libreria senza restrizioni particolari.
3.3.2. Periodico e a colpo singolo#
Sono disponibili due modalità:
Timer.PERIODIC(l’impostazione predefinita). Il callback si attiva ogniperiodmillisecondi, all’infinito, finché non viene chiamatodeinit()o il timer non viene reinizializzato.Timer.ONE_SHOT. Il callback si attiva una sola volta,periodmillisecondi dopoinit(), e il timer si ferma.
Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)
deinit() ferma un timer periodico e annulla qualsiasi callback in sospeso:
tim.deinit()
3.3.3. Quando ricorrere a un timer#
I timer virtuali e il pattern di polling con ticks_diff() visto in Temporizzazione risolvono lo stesso problema da direzioni opposte. Un ciclo con polling controlla l’orologio a ogni iterazione e agisce quando è trascorso abbastanza tempo; un timer chiede al runtime di risvegliare lo script quando è trascorso abbastanza tempo.
Polling con
ticks_diff. Tutto resta in un unico posto – il ciclo possiede la temporizzazione, nessun callback aggiuntivo da tenere sotto controllo. Ideale per lavori brevi e ben definiti che mettono insieme diversi compiti guidati dal tempo.Timer virtuale. Sposta la pianificazione fuori dal corpo del ciclo. Ideale quando il compito periodico è indipendente dal flusso principale (un LED di heartbeat, un campionamento periodico di un sensore) e consente al ciclo principale di dedicare il proprio tempo ad altri lavori.
Entrambi gli approcci usano lo stesso orologio sottostante e offrono la stessa precisione a periodi di un millisecondo o più. Nessuno dei due è adatto per la commutazione precisa dei pin o per la generazione di forme d’onda sotto il millisecondo – la latenza del callback è dell’ordine del tick dello scheduler, non dei nanosecondi.