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-initialise

  • Timer.ONE_SHOT callback ทำงานครั้งเดียว 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 ไม่ใช่นาโนวินาที