Anda bisa dan itu sangat mudah. RPi memiliki modul Linux yang mengimplementasikan API pengawas Linux standar. Anda dapat menemukan dokumentasi ini di sini .
Sekarang, jika Anda membaca ini, Anda akan tahu bahwa ada file perangkat khusus yang dipanggil /dev/watchdog
dan untuk menggunakan watchdog
Anda harus membuka file ini dan menulis beberapa data (satu byte, yang terbaik adalah menulis sesuatu selain 'V' yang saya ' m menjelaskan nanti) dari waktu ke waktu. Jika Anda tidak akan menulis apa pun untuk file ini cukup lama, watchdog
akan memicu reboot. Anda dapat menemukan contoh program (sangat sederhana) di sini .
Perhatikan bahwa dalam situasi normal, jika Anda menutup /dev/watchdog
, watchdog
dapat dinonaktifkan. Ada mode khusus yang disebut 'fitur Magic Close' yang tampaknya diimplementasikan oleh driver RPi tetapi AFAIK tidak diaktifkan dalam konfigurasi kernel default (opsi CONFIG_WATCHDOG_NOWAYOUT). Dalam hal ini, reboot akan dipicu bahkan jika Anda menutup /dev/watchdog
kecuali Anda menulis 'V' sebelum berhenti dari aplikasi.
Anda harus menguji diri sendiri jika memang dinonaktifkan (saya tidak punya RPi di sini sekarang untuk menguji), tetapi jika tidak, itu tidak baik untuk Anda. Jika aplikasi Anda macet, file perangkat pengawas akan ditutup dan reboot tidak akan dipicu dan inilah mengapa Anda menginginkannya. Dalam situasi ini, Anda dapat mengubah konfigurasi kernel dan membangunnya kembali atau menulis aplikasi khusus yang akan dipantau jika aplikasi utama Anda berfungsi (misalnya menggunakan beberapa metode IPC).
Ada juga API ioctl yang memungkinkan Anda melakukan lebih banyak dengan watchdog
. Anda dapat, misalnya, mengatur batas waktu yang berbeda - IOCTL dengan WDIOC_SETTIMEOUT (tampaknya didukung oleh driver RPI) atau mendapatkan batas waktu - IOCTL dengan WDIOC_GETTIMEOUT (yang juga tampaknya didukung). Anda mungkin ingin menggunakannya untuk mengubah batas waktu default (10 detik). Namun ada batas keras hingga 16 detik. Ini sebuah contoh:
int timeout = 15;
int fd = open("/dev/watchdog", O_WRONLY);
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
Anda juga dapat menggunakan IOCTL dengan WDIOC_KEEPALIVE alih-alih menulis karakter jika Anda mau. Kedua metode ini valid.