3.3. טיימרים וירטואליים¶
העמוד תזמון כיסה חותמות זמן ולולאות לא-חוסמות המונעות על ידי time.ticks_diff(). טיימר וירטואלי הוא הצד ההפוך: התוכנה מבקשת מסביבת הריצה לקרוא לפונקציה על פי לוח זמנים, וסביבת הריצה מפעילה את פונקציית ה-callback מבלי שהסקריפט יצטרך לבדוק את השעון בעצמו.
3.3.1. המחלקה machine.Timer¶
machine.Timer בונה טיימר וירטואלי. התנהגות חוצת-פורטים דורשת את ה-id המיוחד -1; כל היתר – period, mode, callback – נקבע דרך ארגומנטים בעלי מילת מפתח:
from machine import Timer
def tick(t):
print("tick")
tim = Timer(-1)
tim.init(period=100, callback=tick) # 10 Hz
פונקציית ה-callback מופעלת כמו כל קריאת פונקציה רגילה – היא יכולה להקצות אובייקטים, לקרוא ל-print(), ולקרוא לקוד ספרייה אחר ללא הגבלות מיוחדות.
3.3.2. מחזורי וחד-פעמי¶
שני מצבים זמינים:
Timer.PERIODIC(ברירת המחדל). פונקציית ה-callback מופעלת כלperiodמילישניות, לנצח, עד שנקראתdeinit()או שהטיימר מאותחל מחדש.Timer.ONE_SHOT. פונקציית ה-callback מופעלת פעם אחת,periodמילישניות לאחרinit(), ואז הטיימר נעצר.
Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)
deinit() עוצר טיימר מחזורי ומבטל כל callback ממתין:
tim.deinit()
3.3.3. מתי להשתמש בטיימר¶
טיימרים וירטואליים ודפוס הדגימה ticks_diff() מ-תזמון פותרים את אותה בעיה מכיוונים מנוגדים. לולאה נדגמת בודקת את השעון בכל איטרציה ופועלת כשעבר די זמן; טיימר מבקש מסביבת הריצה להעיר את הסקריפט כשעבר די זמן.
נדגם
ticks_diff. הכול נשאר במקום אחד – הלולאה מחזיקה בתזמון, אין פונקציות callback נוספות לעקוב אחריהן. הכי טוב לעבודה קצרה ומוגדרת היטב הקושרת יחד מספר משימות מונחות-זמן.טיימר וירטואלי. מעביר את לוח הזמנים אל מחוץ לגוף הלולאה. הכי טוב כאשר המשימה המחזורית בלתי תלויה בזרימה הראשית (LED של פעימת לב, דגימת חיישן מחזורית) ומאפשר ללולאה הראשית להקדיש את זמנה לעבודה אחרת.
שתי הגישות משתמשות באותו שעון בסיסי ונותנות אותה דיוק במחזורים של מילישנייה או יותר. אף אחת מהן אינה מתאימה להחלפת פין מדויקת או ליצירת צורת גל בתת-מילישנייה – ההשהיה של פונקציית ה-callback היא בסדר גודל של tick המתזמן, לא ננו-שניות.