3.3. Virtuella timrar

Sidan Tidtagning behandlade tidsstämplar och icke-blockerande slingor drivna av time.ticks_diff(). En virtuell timer är den andra sidan: programvaran ber körtiden att anropa en funktion enligt ett schema, och körtiden anropar återanropet utan att skriptet självt behöver kontrollera klockan.

3.3.1. Klassen machine.Timer

machine.Timer konstruerar en virtuell timer. Beteende mellan portar kräver det speciella id:t -1; allt annat – period, läge, återanrop – ställs in genom nyckelordsargument:

from machine import Timer

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

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

Återanropet anropas som vilket vanligt funktionsanrop som helst – det kan allokera objekt, anropa print() och anropa annan bibliotekskod utan några särskilda begränsningar.

3.3.2. Periodisk och engångs

Två lägen är tillgängliga:

  • Timer.PERIODIC (standard). Återanropet utlöses var period millisekund, för evigt, tills deinit() anropas eller timern återinitieras.

  • Timer.ONE_SHOT. Återanropet utlöses en gång, period millisekunder efter init(), och timern stoppas sedan.

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

deinit() stoppar en periodisk timer och avbryter eventuellt väntande återanrop:

tim.deinit()

3.3.3. När man bör ta till en timer

Virtuella timrar och pollningsmönstret ticks_diff() från Tidtagning löser samma problem från motsatta håll. En pollad slinga kontrollerar klockan vid varje iteration och agerar när tillräckligt mycket tid har gått; en timer ber körtiden att väcka skriptet när tillräckligt mycket tid har gått.

  • Pollad ticks_diff. Allt stannar på ett ställe – slingan äger tidtagningen, inga extra återanrop att hålla reda på. Bäst för kort, väldefinierat arbete som knyter samman flera tidsstyrda uppgifter.

  • Virtuell timer. Flyttar schemat ut ur slingkroppen. Bäst när den periodiska uppgiften är oberoende av huvudflödet (en hjärtslags-LED, en periodisk sensorsampling) och låter huvudslingan ägna sin tid åt annat arbete.

Båda tillvägagångssätten använder samma underliggande klocka och ger samma noggrannhet vid perioder på en millisekund eller mer. Inget av dem är lämpligt för exakt stiftväxling eller vågformsgenerering under millisekundsnivå – återanropets latens är i storleksordningen av schemaläggartick, inte nanosekunder.