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ých period milisekund, donekonečna, dokud není zavolána deinit() nebo dokud není časovač znovu inicializován.

  • Timer.ONE_SHOT. Callback se spustí jednou, period milisekund po init(), 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.