3.27. Watchdog timer¶
Sebuah watchdog timer adalah perangkat keras yang mereset mikrokontroler jika skrip yang berjalan pernah berhenti secara berkala menandainya. Skrip "memberi makan" watchdog dari suatu tempat yang diketahui menjalankan kode yang sehat; jika bug, hang, atau pengecualian tak terduga pernah mencegah kamera memberi makan watchdog dalam timeout yang dikonfigurasi, chip mereset dirinya sendiri dan skrip dimulai dari awal.
Pada perangkat yang sudah di-deploy tanpa manusia di dekatnya untuk melakukan power-cycle, ini adalah perbedaan antara bug sementara yang pulih dalam hitungan detik dan perangkat yang terkunci yang membutuhkan panggilan layanan.
Penghitung watchdog bertik turun dari timeoutnya. Setiap feed() memuat ulangnya; jika mencapai nol, chip melakukan reset.¶
3.27.1. Kelas machine.WDT¶
machine.WDT mengaktifkan watchdog dan mengekspos satu metode, feed(). Setelah dimulai, watchdog tidak dapat dihentikan -- satu-satunya cara keluar adalah memberinya makan sesuai jadwal atau membiarkannya mereset chip:
from machine import WDT
wdt = WDT(timeout=2000) # reset if not fed within 2 seconds
while True:
do_work()
wdt.feed()
timeout dalam milidetik. Nilai yang tepat tergantung pada berapa lama iterasi terpanjang yang sah dari loop utama berlangsung, dengan headroom yang nyaman -- loop 100 ms dengan timeout 2 detik memiliki cukup margin untuk iterasi yang lambat tanpa reset yang tidak perlu.
3.27.2. Di mana memanggil feed()¶
Di mana feed() ditempatkan adalah keputusan desain yang kritis; watchdog hanya menangkap bug pada bagian kode yang tidak berjalan di antara feed.
Panggil dari loop utama, di bagian atas atau bawah. Pola yang paling umum. Watchdog menangkap apa pun yang menghentikan loop utama -- deadlock,
whiletak terbatas, periferal yang tidak pernah kembali -- dan mereset chip kembali ke dalam loop.Jangan panggil dari dalam interrupt handler. Tujuan watchdog adalah menangkap hang di jalur kode normal. ISR yang terpicu terlepas dari apakah loop utama terhenti akan terus memberi makan watchdog yang seharusnya memicu.
Jangan panggil dari dalam operasi blocking yang panjang. Permintaan jaringan atau pembacaan sensor yang memakan waktu sepuluh detik adalah persis jenis hang yang seharusnya ditangkap watchdog. Menempatkan
feed()di dalamnya mengalahkan perlindungan tersebut.
Pedoman yang berlaku untuk sebagian besar program: beri makan sekali per iterasi loop utama, dengan timeout diatur beberapa kali durasi loop yang diharapkan. Jika satu iterasi secara sah membutuhkan waktu lebih lama dari timeout -- fase kalibrasi yang disengaja, misalnya -- strukturkan fase tersebut sebagai serangkaian chunk yang lebih kecil dengan feed() di antaranya, atau ubah timeout dengan timeout_ms() (bila didukung) sebelum memasukinya.
3.27.3. Ketersediaan¶
Watchdog tersedia pada sebagian besar OpenMV Cam tetapi tidak semua -- hardware ada di setiap bagian, tetapi API Python belum terhubung di semua tempat. Periksa Papan OpenMV atau coba konstruksi WDT dan tangkap AttributeError jika tidak didukung.
Bahkan pada kamera di mana WDT tidak tersedia, perangkat yang sudah di-deploy di lapangan dapat menggunakan padanan lunak -- tugas terpisah atau langkah loop utama yang memantau kemajuan dan memicu machine.reset() jika ada yang terlihat macet. Ini kurang kuat dari watchdog hardware (interrupt handler yang macet juga dapat menjatuhkan monitor lunak) tetapi mencakup kasus yang sama pada level aplikasi.