ฉันสามารถส่งหัวใจเต้นไปหาสุนัขเฝ้าดูฮาร์ดแวร์จากโปรแกรมของฉันเองได้หรือไม่?


14

ต่อจากคำถามและคำตอบที่ยอดเยี่ยมโดย Steve Robillard ที่นี่:

ฉันจะรีเซ็ต Raspberry Pi อย่างหนักได้อย่างไร

ฉันจะส่งสัญญาณ heartbeat จากโปรแกรมของฉันเองไปยังฮาร์ดแวร์ watchdog ของ BCM2708 ได้อย่างไรจาก Linux watchdog daemon? กล่าวอีกนัยหนึ่งฉันต้องการรีเซ็ต RPi หากโปรแกรมของฉันไม่ได้ทำงาน (ซึ่งทำงานเมื่อเริ่มต้น) ไม่เพียง แต่เมื่อระบบทั้งหมดถูกแช่แข็ง

ขอบคุณ


เริ่มต้นที่เป็นประโยชน์ ... mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt
Alex Chamberlain

คำตอบ:


7

คุณสามารถและมันค่อนข้างง่าย 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 แทนการเขียนตัวอักษรหากคุณต้องการ ทั้งสองวิธีนี้ถูกต้อง


โอ้และฉันลืม - คุณสามารถใช้ watchdogd สำหรับสิ่งนี้ได้จริง รองรับการโทรโปรแกรมภายนอกที่จะตรวจสอบและรายงานสถานะของระบบ อ่าน "ตรวจสอบไบนารี" ในหน้าเอกสารนี้
Krzysztof Adamski

ขอบคุณ ฉันเข้าใจแล้ว! หลังจากเพิ่ม bcm2708_wdog ไปยัง / etc / modules ฉันสร้างแอปทดสอบ VB.NET แบบง่าย ๆ เพื่อตรวจสอบความเข้าใจของฉัน: Dim fs As New System.IO.FileStream (fn, IO.FileMode.Open) เพื่อเริ่มจับเวลาและ fs.WriteByte ( H) จากนั้น fs.Flush () เพื่อส่ง heartbeats ใช้งานได้ดี!
Guy

การแสดงตัวเลขของ WDIOC_KEEPALIVE คืออะไร ไม่สามารถหาได้ทุกที่
Flash Thunder

@FlashThunder: มันถูกกำหนดไว้ที่นี่: lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29แต่คุณต้องแก้ไขมาโครสองระดับเพื่อหาค่าที่แน่นอน วิธีที่ดีกว่าคือเพียงแค่เขียนโปรแกรม C อย่างง่ายเพื่อพิมพ์ค่า เพียงแค่ใส่ <linux / watchdog.h> ในระบบของฉันมัน0x80045705
Krzysztof Adamski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.