3.27. Bekçi köpeği zamanlayıcısı

Bir bekçi köpeği zamanlayıcısı, çalışan betik onu periyodik olarak dürtmeyi bırakırsa mikrodenetleyiciyi sıfırlayan bir donanım parçasıdır. Betik, bekçi köpeğini sağlıklı kod çalıştırdığını bildiği bir yerden “besler”; bir hata, bir takılma veya beklenmeyen bir istisna kameranın bekçi köpeğini yapılandırılmış bir zaman aşımı içinde beslemesini engellerse, yonga kendini sıfırlar ve betik baştan başlar.

Onu güç çevrimi yapacak hiçbir insanın yakında olmadığı dağıtılmış bir cihazda bu, saniyeler içinde kurtulan geçici bir hata ile servis çağrısı gerektiren bir tuğla arasındaki farktır.

Zaman içinde bir bekçi köpeği sayacının grafiği. Sayaç zaman aşımı değerinde başlar, doğrusal olarak sıfıra doğru düşer ve betik feed() çağırdığı her seferinde zaman aşımı değerine yeniden yüklenir. Üç başarılı feed() çağrısından sonra, dördüncü bir aralıkta feed() olmaz ve sayaç sıfıra ulaşır, bir MCU sıfırlamasını tetikler.

Bekçi köpeği sayacı zaman aşımından aşağı doğru sayar. Her feed() onu yeniden yükler; sıfıra ulaşırsa yonga sıfırlanır.

3.27.1. machine.WDT sınıfı

machine.WDT bekçi köpeğini etkinleştirir ve tek bir metot olan feed() metodunu açığa çıkarır. Bir kez başlatıldığında, bekçi köpeği durdurulamaz – tek çıkış yolları onu programa göre beslemek veya yongayı sıfırlamasına izin vermektir:

from machine import WDT

wdt = WDT(timeout=2000)    # reset if not fed within 2 seconds

while True:
    do_work()
    wdt.feed()

timeout milisaniye cinsindendir. Doğru değer, ana döngünün en uzun meşru yinelemesinin ne kadar sürdüğüne, rahat bir pay ile birlikte bağlıdır – 2 saniyelik zaman aşımına sahip 100 ms’lik bir döngü, sinir bozucu sıfırlamalar olmadan yavaş bir yineleme için bol miktarda marja sahiptir.

3.27.2. feed() nereden çağrılır

feed() fonksiyonunun nerede yaşadığı kritik tasarım kararıdır; bekçi köpeği yalnızca kodun beslemeler arasında çalışmayan kısımlarındaki hataları yakalar.

  • Ana döngüden, en üstten veya en alttan çağırın. En yaygın desen. Bekçi köpeği ana döngüyü takan herhangi bir şeyi yakalar – bir kilitlenme, sonsuz bir while, asla geri dönmeyen bir çevre birimi – ve yongayı döngüye geri sıfırlar.

  • Bir kesme işleyicisinden çağırmayın. Bekçi köpeğinin amacı normal kod yolundaki takılmaları yakalamaktır. Ana döngünün takılıp takılmadığına bakılmaksızın tetiklenen bir ISR, tetiklemesi gereken bir bekçi köpeğini beslemeye devam ederdi.

  • Uzun bir engelleyici işlemin içinden çağırmayın. On saniye süren bir ağ isteği veya sensör okuması, tam olarak bekçi köpeğinin yakalaması gereken türden bir takılmadır. feed() fonksiyonunu içine koymak korumayı boşa çıkarır.

Çoğu program için işe yarayan bir kılavuz: ana döngü yinelemesi başına bir kez besleyin ve zaman aşımını beklenen döngü süresinin birkaç katı olarak ayarlayın. Tek bir yineleme meşru olarak zaman aşımından daha uzun süreye ihtiyaç duyarsa – örneğin kasıtlı bir kalibrasyon aşaması – o aşamayı aralarında feed() bulunan daha küçük parçalar dizisi olarak yapılandırın veya ona girmeden önce zaman aşımını (desteklendiği yerde) timeout_ms() ile değiştirin.

3.27.3. Kullanılabilirlik

Bekçi köpeği çoğu OpenMV kamerada açığa çıkarılır ancak tümünde değil – donanım her parçada mevcuttur, ancak Python API’si henüz her yerde bağlanmamıştır. OpenMV Kartları belgesini kontrol edin veya bir WDT oluşturmayı deneyin ve desteklenmiyorsa AttributeError hatasını yakalayın.

WDT açığa çıkarılmayan kameralarda bile, sahaya dağıtılmış bir cihaz yumuşak bir eşdeğer kullanabilir – ilerlemeyi izleyen ve bir şey takılı görünürse machine.reset() fonksiyonunu tetikleyen ayrı bir görev veya ana döngü adımı. Donanım bekçi köpeğinden daha az sağlamdır (takılı bir kesme işleyicisi yumuşak izleyiciyi de devre dışı bırakabilir) ancak aynı durumları uygulama düzeyinde kapsar.