Dapatkah saya mengirim detak jantung ke anjing penjaga perangkat keras dari program saya sendiri?

14

Berikut dari pertanyaan dan jawaban yang sangat baik yang diberikan oleh Steve Robillard di sini:

Bagaimana cara saya mereset Raspberry Pi?

Bagaimana saya bisa mengirim sinyal detak jantung dari program saya sendiri ke pengawas perangkat keras BCM2708 alih-alih dari daemon pengawas Linux? Dengan kata lain, saya ingin mengatur ulang RPi jika program MY tidak berjalan (yang dijalankan saat startup), tidak hanya ketika seluruh sistem dibekukan.

Terima kasih.

Orang
sumber
Awal yang bermanfaat ... mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt
Alex Chamberlain

Jawaban:

7

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/watchdogdan untuk menggunakan watchdogAnda 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, watchdogakan memicu reboot. Anda dapat menemukan contoh program (sangat sederhana) di sini .

Perhatikan bahwa dalam situasi normal, jika Anda menutup /dev/watchdog, watchdogdapat 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/watchdogkecuali 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.

Krzysztof Adamski
sumber
Oh, dan saya lupa - Anda benar-benar dapat menggunakan watchdogd untuk ini. Ini mendukung panggilan program eksternal yang akan memeriksa dan melaporkan status sistem. Baca "Periksa Biner" di halaman manual ini
Krzysztof Adamski
Terima kasih. Saya membuatnya bekerja! Setelah menambahkan bcm2708_wdog ke / etc / modules saya membuat aplikasi tes VB.NET sederhana untuk memeriksa pemahaman saya: Dim fs As System.IO.FileStream Baru (fn, IO.FileMode.Open) untuk memulai timer berjalan dan fs.WriteByte ( H) lalu fs.Flush () untuk mengirimnya detak jantung. Bagus sekali!
Guy
apa representasi numerik WDIOC_KEEPALIVE? tidak dapat menemukannya di mana pun.
Flash Thunder
@FlashThunder: Ini didefinisikan di sini: lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29 tetapi Anda harus menyelesaikan beberapa level makro untuk menemukan nilai yang tepat. Cara yang lebih baik adalah menulis program C sederhana untuk mencetak nilainya. Cukup sertakan <linux / watchdog.h>. Pada sistem saya itu0x80045705
Krzysztof Adamski