3.27. ตัวจับเวลา watchdog

ตัวจับเวลา watchdog คือฮาร์ดแวร์ที่รีเซ็ตไมโครคอนโทรลเลอร์หากสคริปต์ที่รันอยู่หยุดโพกมันเป็นระยะๆ สคริปต์ "ให้อาหาร" watchdog จากจุดที่รู้ว่าโค้ดทำงานปกติ หากบัก การค้าง หรือข้อยกเว้นที่ไม่คาดคิดทำให้กล้องไม่สามารถให้อาหาร watchdog ภายใน timeout ที่กำหนด ชิปจะรีเซ็ตตัวเองและสคริปต์จะเริ่มต้นใหม่

สำหรับอุปกรณ์ที่ติดตั้งใช้งานจริงโดยไม่มีคนอยู่ใกล้ๆ เพื่อปิดเปิดเครื่อง นี่คือความแตกต่างระหว่างบักชั่วคราวที่หายไปในไม่กี่วินาทีกับอุปกรณ์ที่ใช้งานไม่ได้ซึ่งต้องการการซ่อมบำรุง

A graph of a watchdog counter over time. The counter starts at the timeout value, drops linearly toward zero, and is reloaded to the timeout each time the script calls feed(). After three successful feed() calls, a fourth interval has no feed() and the counter reaches zero, triggering an MCU reset.

ตัวนับ watchdog ลดลงจาก timeout แต่ละ feed() จะโหลดใหม่ หากถึงศูนย์ ชิปจะรีเซ็ต

3.27.1. คลาส machine.WDT

machine.WDT เปิดใช้งาน watchdog และมีเมธอดเดียวคือ feed() เมื่อเริ่มต้นแล้ว watchdog ไม่สามารถหยุดได้ ทางออกเดียวคือให้อาหารตามกำหนดหรือปล่อยให้มันรีเซ็ตชิป:

from machine import WDT

wdt = WDT(timeout=2000)    # reset if not fed within 2 seconds

while True:
    do_work()
    wdt.feed()

timeout มีหน่วยเป็นมิลลิวินาที ค่าที่เหมาะสมขึ้นอยู่กับระยะเวลาที่การทำซ้ำของลูปหลักที่นานที่สุดต้องการ พร้อมกับระยะห่างที่สบาย ลูป 100 มิลลิวินาทีพร้อม timeout 2 วินาทีมีระยะห่างเพียงพอสำหรับการทำซ้ำที่ช้าโดยไม่เกิดการรีเซ็ตที่ไม่ต้องการ

3.27.2. ตำแหน่งที่เรียก feed()

ตำแหน่งที่ feed() อยู่คือการตัดสินใจออกแบบที่สำคัญ watchdog จะตรวจจับบักเฉพาะในส่วนของโค้ดที่ ไม่ ทำงานระหว่างการเรียก feed

  • เรียกจากลูปหลัก ที่ด้านบนหรือด้านล่าง รูปแบบที่พบบ่อยที่สุด watchdog จะตรวจจับสิ่งที่ทำให้ลูปหลักค้าง ไม่ว่าจะเป็น deadlock while อนันต์ หรืออุปกรณ์ต่อพ่วงที่ไม่ยอม return และรีเซ็ตชิปกลับเข้าลูป

  • อย่าเรียกจาก interrupt handler จุดประสงค์ของ watchdog คือตรวจจับการค้างใน เส้นทางโค้ดปกติ ISR ที่ทำงานโดยไม่คำนึงถึงว่าลูปหลักค้างอยู่หรือไม่จะคอยให้อาหาร watchdog ที่ ควรจะ trigger

  • อย่าเรียกจากภายในการดำเนินการ blocking ที่ยาวนาน การร้องขอเครือข่ายหรือการอ่าน sensor ที่ใช้เวลาสิบวินาทีคือประเภทของการค้างที่ watchdog ควรตรวจจับ การใส่ feed() ไว้ภายในจะทำให้การป้องกันหมดประสิทธิภาพ

แนวทางที่ใช้ได้กับโปรแกรมส่วนใหญ่: ให้อาหารหนึ่งครั้งต่อการทำซ้ำลูปหลัก โดยตั้ง timeout เป็นหลายเท่าของระยะเวลาลูปที่คาดหวัง หากการทำซ้ำครั้งเดียวต้องการเวลานานกว่า timeout อย่างถูกต้อง เช่น ช่วงการสอบเทียบที่ตั้งใจไว้ ให้จัดโครงสร้างช่วงนั้นเป็นชิ้นเล็กๆ หลายๆ ชิ้นพร้อม feed() ระหว่างกัน หรือเปลี่ยน timeout ด้วย timeout_ms() (หากรองรับ) ก่อนเข้าสู่ช่วงนั้น

3.27.3. ความพร้อมใช้งาน

watchdog พร้อมใช้งานบน OpenMV Cam ส่วนใหญ่แต่ไม่ทั้งหมด ฮาร์ดแวร์มีอยู่ทุกรุ่น แต่ Python API ยังไม่ได้เชื่อมต่อทุกที่ ตรวจสอบ บอร์ด OpenMV หรือลองสร้าง WDT และดัก AttributeError หากไม่รองรับ

แม้ในกล้องที่ไม่มี WDT อุปกรณ์ที่ติดตั้งใช้งานจริงสามารถใช้ซอฟต์แวร์เทียบเท่า ได้แก่ งานแยกต่างหากหรือขั้นตอนในลูปหลักที่ตรวจสอบความคืบหน้าและเรียก machine.reset() หากมีอะไรดูผิดปกติ มันมีความแข็งแกร่งน้อยกว่า watchdog ฮาร์ดแวร์ (interrupt handler ที่ค้างยังสามารถทำให้ soft monitor หยุดทำงานได้) แต่ครอบคลุมกรณีเดียวกันในระดับแอปพลิเคชัน