3.3. Virtuelle Timer

Die Seite Zeitmessung behandelte Zeitstempel und nicht-blockierende Schleifen, die von time.ticks_diff() angetrieben werden. Ein virtueller Timer ist die Kehrseite davon: Die Software bittet die Laufzeitumgebung, eine Funktion nach einem Zeitplan aufzurufen, und die Laufzeitumgebung ruft den Callback auf, ohne dass das Skript selbst die Uhr prüfen muss.

3.3.1. Die Klasse machine.Timer

machine.Timer konstruiert einen virtuellen Timer. Portübergreifendes Verhalten erfordert die spezielle id -1; alles andere – Periode, Modus, Callback – wird über Schlüsselwortargumente festgelegt:

from machine import Timer

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

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

Der Callback wird wie jeder gewöhnliche Funktionsaufruf aufgerufen – er kann Objekte zuweisen, print() aufrufen und anderen Bibliothekscode ohne besondere Einschränkungen aufrufen.

3.3.2. Periodisch und einmalig

Zwei Modi sind verfügbar:

  • Timer.PERIODIC (der Standard). Der Callback wird alle period Millisekunden ausgelöst, für immer, bis deinit() aufgerufen oder der Timer neu initialisiert wird.

  • Timer.ONE_SHOT. Der Callback wird einmal ausgelöst, period Millisekunden nach init(), und der Timer stoppt dann.

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

deinit() stoppt einen periodischen Timer und bricht jeden ausstehenden Callback ab:

tim.deinit()

3.3.3. Wann man zu einem Timer greift

Virtuelle Timer und das ticks_diff()-Polling-Muster aus Zeitmessung lösen dasselbe Problem von entgegengesetzten Richtungen. Eine gepollte Schleife prüft bei jeder Iteration die Uhr und handelt, wenn genug Zeit vergangen ist; ein Timer bittet die Laufzeitumgebung, das Skript zu wecken, wenn genug Zeit vergangen ist.

  • Gepolltes ticks_diff. Alles bleibt an einem Ort – die Schleife besitzt das Timing, keine zusätzlichen Callbacks, die man im Auge behalten muss. Am besten für kurze, klar definierte Arbeit, die mehrere zeitgesteuerte Aufgaben zusammenbindet.

  • Virtueller Timer. Verlagert den Zeitplan aus dem Schleifenrumpf heraus. Am besten, wenn die periodische Aufgabe unabhängig vom Hauptablauf ist (eine Heartbeat-LED, eine periodische Sensorabtastung) und lässt die Hauptschleife ihre Zeit für andere Arbeit verwenden.

Beide Ansätze verwenden dieselbe zugrunde liegende Uhr und liefern dieselbe Genauigkeit bei Perioden von einer Millisekunde oder mehr. Keiner ist für präzises Pin-Umschalten oder Wellenformerzeugung im Submillisekundenbereich geeignet – die Callback-Latenz liegt in der Größenordnung des Scheduler-Ticks, nicht von Nanosekunden.