3.3. Virtual timers¶
หน้า การจับเวลา ครอบคลุม timestamp และลูปแบบไม่บล็อกที่ขับเคลื่อนด้วย time.ticks_diff() Virtual timer คือด้านตรงข้าม: ซอฟต์แวร์ขอให้ runtime เรียกฟังก์ชันตามกำหนดการ และ runtime เรียก callback โดยที่สคริปต์ไม่ต้องตรวจสอบนาฬิกาเอง
3.3.1. คลาส machine.Timer¶
machine.Timer สร้าง virtual 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. แบบ Periodic และ one-shot¶
มีสองโหมด:
Timer.PERIODIC(ค่าเริ่มต้น) callback ทำงานทุกperiodมิลลิวินาที ตลอดไป จนกว่าจะเรียกdeinit()หรือ timer ถูก re-initialiseTimer.ONE_SHOTcallback ทำงานครั้งเดียวperiodมิลลิวินาทีหลังจากinit()จากนั้น timer จะหยุด
Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)
deinit() หยุด periodic timer และยกเลิก callback ที่รอดำเนินการ:
tim.deinit()
3.3.3. เมื่อไหร่ควรใช้ timer¶
Virtual timer และรูปแบบการ poll ticks_diff() จาก การจับเวลา แก้ปัญหาเดียวกันจากทิศทางตรงกันข้าม ลูป poll ตรวจสอบนาฬิกาทุกรอบและกระทำเมื่อเวลาผ่านไปเพียงพอ timer ขอให้ runtime ปลุกสคริปต์เมื่อเวลาผ่านไปเพียงพอ
แบบ Poll
ticks_diffทุกอย่างอยู่ในที่เดียว -- ลูปเป็นเจ้าของการจับเวลา ไม่มี callback เพิ่มเติมที่ต้องติดตาม ดีที่สุดสำหรับงานสั้นที่กำหนดชัดเจนซึ่งเชื่อมงานที่ขับเคลื่อนด้วยเวลาหลายงานเข้าด้วยกันVirtual timer ย้ายกำหนดการออกจากตัวลูป ดีที่สุดเมื่องาน periodic เป็นอิสระจาก main flow (LED heartbeat, การ sample เซนเซอร์ periodic) และปล่อยให้ main loop ใช้เวลากับงานอื่น
ทั้งสองแนวทางใช้นาฬิกาเดียวกันและให้ความแม่นยำเท่ากันที่ period ตั้งแต่หนึ่งมิลลิวินาทีขึ้นไป ไม่มีแนวทางใดเหมาะสำหรับการสลับพินที่แม่นยำหรือการสร้างคลื่นที่ต่ำกว่ามิลลิวินาที -- เวลาแฝงของ callback อยู่ในระดับ scheduler tick ไม่ใช่นาโนวินาที