3.27. Watchdog mjerač vremena¶
Watchdog mjerač vremena je dio hardvera koji resetira mikrokontroler ako mu skripta koja se izvršava ikada prestane periodički slati signal. Skripta „hrani” watchdog s mjesta za koje zna da izvršava zdrav kod; ako greška, zastoj ili neočekivana iznimka ikada spriječe kameru da nahrani watchdog unutar konfiguriranog vremenskog ograničenja, čip se sam resetira i skripta započinje iznova.
Na razmještenom uređaju bez čovjeka u blizini koji bi ga isključio i ponovno uključio, ovo je razlika između prolazne greške koja se oporavi za nekoliko sekundi i potpunog kvara koji zahtijeva servisni poziv.
Brojač watchdoga odbrojava od svog vremenskog ograničenja. Svaki feed() ga ponovno učitava; ako dosegne nulu, čip se resetira.¶
3.27.1. Klasa machine.WDT¶
machine.WDT omogućuje watchdog i izlaže jednu metodu, feed(). Jednom pokrenut, watchdog se ne može zaustaviti – jedini izlazi su hranjenje po rasporedu ili dopuštanje da resetira čip:
from machine import WDT
wdt = WDT(timeout=2000) # reset if not fed within 2 seconds
while True:
do_work()
wdt.feed()
timeout je u milisekundama. Prava vrijednost ovisi o tome koliko traje najdulja legitimna iteracija glavne petlje, s udobnom rezervom – petlja od 100 ms s vremenskim ograničenjem od 2 s ima dovoljno rezerve za sporu iteraciju bez neugodnih resetiranja.
3.27.2. Gdje pozvati feed()¶
Gdje feed() živi kritična je dizajnerska odluka; watchdog hvata samo greške u dijelovima koda koji se ne izvršavaju između hranjenja.
Pozovite iz glavne petlje, na vrhu ili na dnu. Najuobičajeniji obrazac. Watchdog hvata sve što zaustavi glavnu petlju – mrtvu petlju (deadlock), beskonačni
while, periferiju koja se nikada ne vrati – i resetira čip natrag u petlju.Nemojte pozivati iz rukovatelja prekidima. Smisao watchdoga je hvatanje zastoja u normalnom tijeku koda. ISR koji okida bez obzira na to je li glavna petlja zaglavljena nastavio bi hraniti watchdog koji bi trebao okinuti.
Nemojte pozivati iznutra duge blokirajuće operacije. Mrežni zahtjev ili očitanje senzora koje traje deset sekundi upravo je ona vrsta zastoja koju watchdog treba uhvatiti. Stavljanje
feed()unutar nje poništava zaštitu.
Smjernica koja radi za većinu programa: hranite jednom po iteraciji glavne petlje, s vremenskim ograničenjem postavljenim na nekoliko puta dulje od očekivanog trajanja petlje. Ako jedna iteracija legitimno treba dulje od vremenskog ograničenja – recimo namjerna faza kalibracije – strukturirajte tu fazu kao niz manjih dijelova s feed() između njih, ili promijenite vremensko ograničenje pomoću timeout_ms() (gdje je podržano) prije nego što u nju uđete.
3.27.3. Dostupnost¶
Watchdog je izložen na većini OpenMV kamera, ali ne na svima – hardver je prisutan na svakom dijelu, ali Python API još nije svugdje povezan. Provjerite OpenMV ploče ili pokušajte konstruirati WDT i uhvatite AttributeError ako nije podržan.
Čak i na kamerama gdje WDT nije izložen, uređaj razmješten na terenu može koristiti softverski ekvivalent – zaseban zadatak ili korak glavne petlje koji nadzire napredak i okida machine.reset() ako nešto izgleda zaglavljeno. Manje je robustan od hardverskog watchdoga (zaglavljeni rukovatelj prekidima može srušiti i softverski nadzornik), ali pokriva iste slučajeve na razini aplikacije.