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 varperiodmillisekund, för evigt, tillsdeinit()anropas eller timern återinitieras.Timer.ONE_SHOT. Återanropet utlöses en gång,periodmillisekunder efterinit(), 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.