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.

Graf brojača watchdoga kroz vrijeme. Brojač počinje na vrijednosti vremenskog ograničenja, pada linearno prema nuli, i ponovno se učitava na vremensko ograničenje svaki put kad skripta pozove feed(). Nakon tri uspješna poziva feed(), četvrti interval nema feed() i brojač dosegne nulu, okidajući resetiranje MCU-a.

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.