3.27. ตัวจับเวลา watchdog#
ตัวจับเวลา watchdog คือฮาร์ดแวร์ที่รีเซ็ตไมโครคอนโทรลเลอร์หากสคริปต์ที่รันอยู่หยุดโพกมันเป็นระยะๆ สคริปต์ "ให้อาหาร" watchdog จากจุดที่รู้ว่าโค้ดทำงานปกติ หากบัก การค้าง หรือข้อยกเว้นที่ไม่คาดคิดทำให้กล้องไม่สามารถให้อาหาร watchdog ภายใน timeout ที่กำหนด ชิปจะรีเซ็ตตัวเองและสคริปต์จะเริ่มต้นใหม่
สำหรับอุปกรณ์ที่ติดตั้งใช้งานจริงโดยไม่มีคนอยู่ใกล้ๆ เพื่อปิดเปิดเครื่อง นี่คือความแตกต่างระหว่างบักชั่วคราวที่หายไปในไม่กี่วินาทีกับอุปกรณ์ที่ใช้งานไม่ได้ซึ่งต้องการการซ่อมบำรุง
ตัวนับ 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 หยุดทำงานได้) แต่ครอบคลุมกรณีเดียวกันในระดับแอปพลิเคชัน