[040] Czym jest watchdog? cz. 1

[040] Czym jest watchdog? cz. 1

Gdy pod koniec lat osiemdziesiątych przerobiłem ośmiobitowy komputer do grania ZX Spectrum na sterownik inteligentnego domu, poległem zaraz na wstępie. Jeszcze przed dołączeniem peryferiów wykonawczych, na samym etapie budowania zegara i dołożenia wyświetlacza LCD okazało się, że od czasu do czasu urządzenie się zawiesza i co najwyżej z wyświetlacza można odczytać godzinę, o której miało to miejsce. Przyczyny były różne, najczęściej związane to było z przepięciami w sieci i mimo zbudowania dobrego, stabilizowanego zasilacza z filtrami, działanie komputera nie poprawiło się. Okazało się wówczas, że zabawkowy komputer jest zbudowany zdecydowanie inaczej niż przemysłowe sterowniki, choć oba systemy mogą wykorzystywać te same elementy.


Już klon Spectrum – Timex, a jeszcze bardziej CA80, polski komputer, czy raczej komputeropodobny produkt, znacznie wyprzedzał niezawodnością poczciwe Spectrum i wielu twórców tego komputerka używało go w formie budzika i sterownika różnych urządzeń. I tak w zasadzie można było, ale nadal istniało ryzyko, że podczas burzy czy jakichś innych losowych zdarzeń urządzenie mogło się zawiesić albo zresetować. Jak sobie radzić z takimi sytuacjami?

Zagadnienie możemy podzielić na dwie części. Po pierwsze, potrzebujemy czegoś, co w razie katastrofy przywróci nasze urządzenie do życia. Po drugie, potrzebujemy sposobu, by urządzenie wróciło do życia tak jak chcemy, a tak jak chce ono. Zacznijmy od końca, bo tu będzie prościej. W przypadku komputera sprzed 35 lat, po resecie wyświetlał się napis powitalny i koniec. Bez wklepania kodu zmuszającego do zaczytania programu z taśmy komputer był martwy, choć żywy. W przypadku Arduino oczywiście startuje szkic siedzący w pamięci i problemu nie ma. Acz można go stworzyć, jeśli po starcie wymaga się jakichś ręcznych nastaw, na przykład ustawiania czasu. Trzeba o tym pamiętać i tak całość zorganizować – jeśli to możliwe – by po resecie system działał jakby się nic nie stało. Czyli na przykład zegar należy delegować do osobnego modułu, a ustawienia trzymać w pamięci nieulotnej. Ale tutaj tego omawiać nie będę, bo to zależy już od rozwiązań konkretnych.

Przejdźmy do pierwszego zagadnienia, czyli sposobu na to, by zawieszony system odwiesić i powołać do życia. Naturalnym byłoby użycie jakiegoś sztucznego oka mającego… oko na całość i sztucznej ręki wciskającej reset. I trochę tak to działa. Powstała analogia do pieska pilnującego interesu. Piesek siedział sobie grzecznie, karmiony regularnie. Ale gdy zbyt długo nie pojawiała się pełna miska, cierpliwość zwierzęcia była wystawiana na próbę, do czasu aż naprawdę zgłodniał, objawiając ten fakt całemu światu głośnym szczekaniem.

Ideę nazwano watchdogiem i wygląda to tak: obok mikroprocesora czuwa układ licznikowy, możliwie prosty i niezawodny, z własnym taktowaniem, w ogóle maksymalnie niezależny od wszystkiego. Układ ten zlicza ustaloną liczbę impulsów i w chwili przekroczenia tej wartości wystawia sygnał, który resetuje pilnowany mikroprocesor. Nie miałoby to sensu, jeśli watchdog nie miałby także wejścia zerującego licznik zanim ten się przepełni. Po co? By mikroprocesor mógł się bronić przed próbą zresetowania.

Program musi być tak napisany, by zanim dojdzie do przepełnienia licznika watchdoga, wysłać do niego sygnał zerujący. Gdy program się zawiesi, sygnał ten nie zostanie wysłany, więc watchdog wyśle sygnał resetu i mikroprocesor zresetuje się, zbierając się do kupy i powróci do pracy.

Teraz szczypta teorii: jak dużo czasu dać mikroprocesorowi na marudzenie? To już zależy od konkretnej sytuacji i możliwości samego watchdoga, bo zwykle dysponuje on niewielką paletą czasów. W przypadku sterowania silnikami, siłownikami i w ogóle mechaniką, czasy te powinny być krótkie, nawet sięgające milisekundy. W tak krótkim czasie niekontrolowane ruchy raczej nie wyrządzą szkód, ale już ramię robota spawające karoserię samochodu puszczone w tak zwane maliny na całą sekundę, może już zrobić straty idące w tysiące. Ale gdy myślimy o inteligentnym domu i na przykład rozsuwaniu rolet, kilkusekundowa zwłoka nie zrobi problemu, po prostu jasno się zrobi kilka sekund później. Zatem czas ten dobieramy z sensem, pamiętając, że im jest krótszy, tym dokładniej trzeba przeprowadzić analizę co do potrzeb resetowania licznika.

Drugi problem, jaki należy rozwiązać, to miejsce w programie, w którym licznik trzeba zresetować. Zwykle niejedno, co zobaczymy w przykładach. Trzeba przeanalizować cały program i znaleźć te miejsca, w których mikroprocesor może utknąć na dłużej. Jakie to będą miejsca? Choćby czekanie na puszczenie wciśniętego klawisza. Albo przesunięcie siłownika o tyle, o ile ma się przesunąć. Jeśli zadbamy o reset watchdoga wszędzie, z wyjątkiem choćby jednego takiego miejsca, program będzie się resetował za każdym razem, gdy tam się znajdzie. Najgorzej będzie, gdy resety pojawią się czasem tylko. Na przykład w pewnych przypadkach siłownik zdąży przesunąć się tak, jak chcemy, a innym razem będzie bardziej obciążony i jego podróż potrwa dłużej – na tyle długo, że watchdog nie dostanie sygnału zerującego i system zostanie zresetowany. Trzeba po prostu to wszystko logicznie przemyśleć.

Gdzie nie wolno wstawiać procedur zerujących? W przerwaniach. Przerwania absolutnie nie służą do tego, by w nich pozostać na czas dłuższy niż to niezbędne, tam nie ma żadnego oczekiwania na stany nieokreślone. Jeśli coś pójdzie źle, można utknąć w przerwaniach, a gdyby tam znajdowała się procedura zerująca, system działałby w najlepsze, nie działając. Watchdog chroni także przed utknięciem w przerwaniach, w których zaistniała sytuacja, która zaistnieć nie powinna (nota bene, prawie zawsze jest to winą programisty).

No i trzeba uważać z usypianiem układu, bo wówczas pewne jego fragmenty po prostu nie działają do czasu wybudzenia. Jeśli ten czas przekroczy czas wymagany do wyzerowania watchdoga, także wpadniemy w pętle niekończących się resetów.

Skoro wszystko już wiemy, zapraszam do kolejnego artykułu, w którym ujrzymy konkrety. Ach, jeszcze jedno. Historycznie układ watchdoga był osobnym układem scalonym, podłączanym do resetu mikroprocesora. Dziś każdy mikrokontroler ma taką strukturę zatopioną w obudowie i nie trzeba już niczego dokładać.

Powiązane tematy

Płytka edukacyjna TME-EDU-ARD-2Płytka edukacyjna TME-EDU-ARD-2Sprawdź tutaj

Przeczytaj również

Nasi partnerzy

TMETech Master EventTME EducationPoweredby
Copyright © 2024 arduino.pl