3.3. Virtuální časovače¶
Stránka Časování se zabývala časovými razítky a neblokujícími smyčkami řízenými funkcí time.ticks_diff(). Virtuální časovač je opačnou stranou mince: software požádá běhové prostředí, aby volalo funkci podle plánu, a běhové prostředí vyvolá callback, aniž by skript musel hodiny kontrolovat sám.
3.3.1. Třída machine.Timer¶
machine.Timer konstruuje virtuální časovač. Chování napříč porty vyžaduje speciální id -1; vše ostatní – perioda, režim, callback – se nastavuje prostřednictvím pojmenovaných argumentů:
from machine import Timer
def tick(t):
print("tick")
tim = Timer(-1)
tim.init(period=100, callback=tick) # 10 Hz
Callback je vyvolán jako jakékoli běžné volání funkce – může alokovat objekty, volat print() a volat další knihovní kód bez jakýchkoli zvláštních omezení.
3.3.2. Periodický a jednorázový¶
K dispozici jsou dva režimy:
Timer.PERIODIC(výchozí). Callback se spustí každýchperiodmilisekund, donekonečna, dokud není zavolánadeinit()nebo dokud není časovač znovu inicializován.Timer.ONE_SHOT. Callback se spustí jednou,periodmilisekund poinit(), a časovač se poté zastaví.
Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)
deinit() zastaví periodický časovač a zruší jakýkoli čekající callback:
tim.deinit()
3.3.3. Kdy sáhnout po časovači¶
Virtuální časovače a dotazovací vzorec ticks_diff() ze stránky Časování řeší stejný problém z opačných směrů. Dotazovaná smyčka kontroluje hodiny při každé iteraci a jedná, když uplyne dostatek času; časovač požádá běhové prostředí, aby skript probudilo, jakmile uplyne dostatek času.
Dotazovaný
ticks_diff. Vše zůstává na jednom místě – smyčka vlastní časování, žádné další callbacky, které je třeba sledovat. Nejlepší pro krátkou, dobře definovanou práci, která spojuje několik časem řízených úloh.Virtuální časovač. Přesouvá plán mimo tělo smyčky. Nejlepší, když je periodická úloha nezávislá na hlavním toku (LED tepu, periodický odběr vzorku ze senzoru), a umožňuje hlavní smyčce věnovat svůj čas jiné práci.
Oba přístupy používají stejné podkladové hodiny a poskytují stejnou přesnost při periodách jedné milisekundy nebo více. Žádný z nich není vhodný pro přesné přepínání pinů ani pro generování průběhů kratších než milisekunda – latence callbacku je řádu tiku plánovače, nikoli nanosekund.