คุณสามารถและมันค่อนข้างง่าย RPi มีโมดูล Linux ที่ใช้ Linux watchdog API มาตรฐาน คุณสามารถค้นหาเอกสารนี้ที่นี่
ทีนี้ถ้าคุณอ่านสิ่งนี้คุณจะรู้ว่ามีไฟล์อุปกรณ์พิเศษที่เรียกว่า/dev/watchdog
และเพื่อที่จะใช้watchdog
คุณต้องเปิดไฟล์นี้และเขียนข้อมูลบางอย่าง (หนึ่งไบต์ควรเขียนสิ่งอื่นที่ไม่ใช่ 'V' ที่ฉัน ' ฉันจะอธิบายในภายหลัง) เป็นครั้งคราว หากคุณไม่เขียนอะไรลงไฟล์นี้นานพอwatchdog
จะทริกเกอร์การรีบูต คุณสามารถค้นหาโปรแกรมตัวอย่าง (ง่ายมาก) ที่นี่
โปรดทราบว่าในสถานการณ์ปกติถ้าคุณปิด/dev/watchdog
, watchdog
สามารถเป็นคนพิการ มีโหมดพิเศษที่เรียกว่า 'คุณสมบัติ Magic Close' ซึ่งดูเหมือนว่าจะใช้งานโดยไดรเวอร์ RPi แต่ AFAIK ไม่ได้เปิดใช้งานในการกำหนดค่าเคอร์เนลเริ่มต้น (ตัวเลือก CONFIG_WATCHDOG_NOWAYOUT) ในกรณีนี้การรีบูตจะถูกเรียกใช้แม้ว่าคุณจะปิด/dev/watchdog
เว้นแต่ว่าคุณเขียน 'V' ลงไปก่อนที่จะออกจากแอป
คุณควรทดสอบด้วยตัวเองถ้ามันถูกปิดใช้งานแน่นอน (ฉันไม่มี RPi ที่นี่ตอนนี้เพื่อทดสอบ) แต่ถ้ามันไม่เป็นเช่นนั้นมันไม่ดีสำหรับคุณ หากแอปพลิเคชันของคุณขัดข้องไฟล์อุปกรณ์เฝ้าระวังจะถูกปิดและการรีบูตจะไม่ถูกเรียกใช้และนี่คือสาเหตุที่คุณต้องการ ในสถานการณ์นี้คุณสามารถเปลี่ยนการกำหนดค่าเคอร์เนลและสร้างใหม่หรือเขียนแอปพลิเคชันที่กำหนดเองที่จะตรวจสอบว่าแอปพลิเคชันหลักของคุณทำงานอยู่หรือไม่ (ใช้วิธี IPC เป็นต้น)
นอกจากนี้ยังมี API IOCTL watchdog
ซึ่งช่วยให้คุณทำบางอย่างมากขึ้นด้วย ตัวอย่างเช่นคุณสามารถตั้งค่าการหมดเวลาที่แตกต่างกัน - IOCTL ด้วย WDIOC_SETTIMEOUT (ดูเหมือนว่าจะได้รับการสนับสนุนโดยไดรเวอร์ RPI) หรือรับการหมดเวลา - IOCTL ด้วย WDIOC_GETTIMEOUT (ซึ่งก็ดูเหมือนว่าจะได้รับการสนับสนุน) คุณอาจต้องการใช้เพื่อแก้ไขการหมดเวลาเริ่มต้น (10 วินาที) มีการ จำกัด อย่างหนักถึง 16 วินาทีอย่างไรก็ตาม นี่คือตัวอย่าง:
int timeout = 15;
int fd = open("/dev/watchdog", O_WRONLY);
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
คุณยังสามารถใช้ IOCTL กับ WDIOC_KEEPALIVE แทนการเขียนตัวอักษรหากคุณต้องการ ทั้งสองวิธีนี้ถูกต้อง