3.3. Virtuele timers

De pagina Timing behandelde tijdstempels en niet-blokkerende lussen aangestuurd door time.ticks_diff(). Een virtuele timer is de keerzijde: software vraagt de runtime om een functie volgens een schema aan te roepen, en de runtime roept de callback aan zonder dat het script zelf de klok hoeft te controleren.

3.3.1. De machine.Timer-klasse

machine.Timer construeert een virtuele timer. Cross-port-gedrag vereist het speciale id -1; al het andere – periode, mode, callback – wordt via keyword-argumenten ingesteld:

from machine import Timer

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

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

De callback wordt aangeroepen als elke gewone functieaanroep – hij kan objecten toewijzen, print() gebruiken en andere bibliotheekcode aanroepen zonder bijzondere beperkingen.

3.3.2. Periodiek en eenmalig

Er zijn twee modi beschikbaar:

  • Timer.PERIODIC (de standaard). De callback wordt elke period milliseconden afgevuurd, voor altijd, totdat deinit() wordt aangeroepen of de timer opnieuw wordt geïnitialiseerd.

  • Timer.ONE_SHOT. De callback wordt eenmaal afgevuurd, period milliseconden na init(), waarna de timer stopt.

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

deinit() stopt een periodieke timer en annuleert eventuele wachtende callbacks:

tim.deinit()

3.3.3. Wanneer naar een timer te grijpen

Virtuele timers en het ticks_diff()-pollpatroon uit Timing lossen hetzelfde probleem op vanuit tegengestelde richtingen. Een gepollde lus controleert elke iteratie de klok en handelt wanneer er genoeg tijd is verstreken; een timer vraagt de runtime om het script te wekken wanneer er genoeg tijd is verstreken.

  • Gepolld ticks_diff. Alles blijft op één plek – de lus bezit de timing, geen extra callbacks om bij te houden. Het beste voor kort, welgedefinieerd werk dat meerdere tijdgestuurde taken samenbrengt.

  • Virtuele timer. Verplaatst het schema uit de body van de lus. Het beste wanneer de periodieke taak onafhankelijk is van de hoofdstroom (een heartbeat-led, een periodiek sensormonster) en laat de hoofdlus zijn tijd aan ander werk besteden.

Beide benaderingen gebruiken dezelfde onderliggende klok en geven dezelfde nauwkeurigheid bij perioden van een milliseconde of meer. Geen van beide is geschikt voor nauwkeurig pin-schakelen of golfvormgeneratie onder een milliseconde – de callbacklatentie is in de orde van de scheduler-tick, niet nanoseconden.