3.3. Virtuális időzítők

A Időzítés oldal az időbélyegekkel és a time.ticks_diff() által vezérelt nem blokkoló ciklusokkal foglalkozott. Egy virtuális időzítő ennek a fonákja: a szoftver megkéri a futtatókörnyezetet, hogy egy ütemezés szerint hívjon meg egy függvényt, és a futtatókörnyezet meghívja a visszahívást anélkül, hogy a szkriptnek magának kellene az órát ellenőriznie.

3.3.1. A machine.Timer osztály

A machine.Timer egy virtuális időzítőt hoz létre. A portok közötti egységes viselkedés a speciális -1 id-t igényli; minden mást – periódus, üzemmód, visszahívás – kulcsszavas argumentumokon keresztül állítunk be:

from machine import Timer

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

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

A visszahívás úgy hívódik meg, mint bármely közönséges függvényhívás – objektumokat foglalhat le, használhatja a print() függvényt, és bármilyen különleges megkötés nélkül hívhat más könyvtári kódot.

3.3.2. Periodikus és egylövetű

Két üzemmód áll rendelkezésre:

  • Timer.PERIODIC (az alapértelmezett). A visszahívás minden period ezredmásodpercben kiváltódik, örökké, amíg a deinit() meghívásra nem kerül, vagy az időzítőt újra nem inicializálják.

  • Timer.ONE_SHOT. A visszahívás egyszer váltódik ki, period ezredmásodperccel az init() után, majd az időzítő leáll.

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

A deinit() leállít egy periodikus időzítőt, és törli a függőben lévő visszahívásokat:

tim.deinit()

3.3.3. Mikor nyúljunk időzítőhöz

A virtuális időzítők és a Időzítés oldalon szereplő ticks_diff() lekérdezési minta ugyanazt a problémát oldja meg ellentétes irányból. Egy lekérdezett ciklus minden iterációban ellenőrzi az órát, és cselekszik, amikor elegendő idő telt el; egy időzítő megkéri a futtatókörnyezetet, hogy ébressze fel a szkriptet, amikor elegendő idő telt el.

  • Lekérdezett ticks_diff. Minden egy helyen marad – a ciklus birtokolja az időzítést, nincs nyilvántartandó extra visszahívás. A legjobb rövid, jól meghatározott munkához, amely több idővezérelt feladatot köt össze.

  • Virtuális időzítő. Kiviszi az ütemezést a ciklus törzséből. A legjobb, amikor a periodikus feladat független a fő folyamattól (egy szívverés-LED, egy periodikus érzékelő-mintavétel), és lehetővé teszi, hogy a fő ciklus az idejét más munkára fordítsa.

Mindkét megközelítés ugyanazt az alapul szolgáló órát használja, és egy ezredmásodperces vagy hosszabb periódusoknál ugyanazt a pontosságot adja. Egyik sem alkalmas pontos lábállapot-váltáshoz vagy ezredmásodperc alatti hullámforma-előállításhoz – a visszahívás késleltetése az ütemező tickjének nagyságrendjébe esik, nem nanoszekundumokéba.