3.27. Watchdog časovač¶
Watchdog časovač je hardware, který resetuje mikrokontrolér, pokud jej běžící skript přestane pravidelně poťukávat. Skript watchdog „krmí“ odněkud, o čem ví, že tam běží zdravý kód; pokud chyba, zaseknutí nebo neočekávaná výjimka kdy zabrání kameře watchdog v nakonfigurovaném časovém limitu nakrmit, čip se sám resetuje a skript začne znovu.
Na nasazeném zařízení, u kterého není nablízku žádný člověk, který by jej vypnul a zapnul, je toto rozdílem mezi přechodnou chybou, ze které se zařízení zotaví během sekund, a cihlou, která vyžaduje servisní zásah.
Čítač watchdogu odpočítává od svého časového limitu. Každé feed() jej znovu nabije; pokud dosáhne nuly, čip se resetuje.¶
3.27.1. Třída machine.WDT¶
machine.WDT zapne watchdog a zpřístupní jedinou metodu, feed(). Jakmile je watchdog spuštěn, nelze jej zastavit – jediné cesty ven jsou krmit jej podle plánu, nebo jej nechat resetovat čip:
from machine import WDT
wdt = WDT(timeout=2000) # reset if not fed within 2 seconds
while True:
do_work()
wdt.feed()
timeout je v milisekundách. Správná hodnota závisí na tom, jak dlouho trvá nejdelší legitimní iterace hlavní smyčky, s pohodlnou rezervou – 100ms smyčka s 2s časovým limitem má spoustu prostoru pro pomalou iteraci bez zbytečných resetů.
3.27.2. Kde volat feed()¶
Kde feed() žije, je klíčové návrhové rozhodnutí; watchdog zachytí pouze chyby v těch částech kódu, které mezi krmeními neběží.
Volejte z hlavní smyčky, na jejím začátku nebo konci. Nejběžnější vzor. Watchdog zachytí cokoli, co zasekne hlavní smyčku – uváznutí (deadlock), nekonečné
while, periferii, která se nikdy nevrátí – a resetuje čip zpět do smyčky.Nevolejte z obsluhy přerušení. Smyslem watchdogu je zachytit zaseknutí v běžné cestě kódu. ISR, která se aktivuje bez ohledu na to, zda je hlavní smyčka zaseknutá, by neustále krmila watchdog, který by se měl spouštět.
Nevolejte zevnitř dlouhé blokující operace. Síťový požadavek nebo čtení ze senzoru, které trvá deset sekund, je přesně ten druh zaseknutí, který by měl watchdog zachytit. Vložení
feed()dovnitř ochranu maří.
Vodítko, které funguje pro většinu programů: krmte jednou za iteraci hlavní smyčky, s časovým limitem nastaveným na několikanásobek očekávané doby trvání smyčky. Pokud jedna iterace legitimně potřebuje déle než časový limit – řekněme záměrná kalibrační fáze – strukturujte tuto fázi jako sérii menších částí s feed() mezi nimi, nebo před vstupem do ní změňte časový limit pomocí timeout_ms() (kde je podporováno).
3.27.3. Dostupnost¶
Watchdog je zpřístupněn na většině kamer OpenMV, ale ne na všech – hardware je přítomen na každé součástce, ale Python API ještě není všude zapojeno. Zkontrolujte Desky OpenMV nebo se pokuste sestrojit WDT a zachyťte AttributeError, pokud není podporováno.
I na kamerách, kde WDT není zpřístupněn, může zařízení nasazené v terénu použít softwarový ekvivalent – samostatnou úlohu nebo krok hlavní smyčky, který sleduje postup a spustí machine.reset(), pokud se cokoli zdá zaseknuté. Je méně robustní než hardwarový watchdog (zaseknutá obsluha přerušení může shodit i softwarový monitor), ale pokrývá stejné případy na úrovni aplikace.