Watchdog

Molti microcontrollori integrano il sistema denominato watchdog al fine di controllare il programma caricato al suo interno. Esso, infatti, ha il compito di monitorare l’esecuzione del programma e di riavviare il microcontrollore nel momento in cui si verifichino blocchi o loop infiniti.

Di default tale funzionalità è disabilitata poiché si tiene conto del fatto che il programmatore preveda, durante la stesura del codice, la prevenzione di eventuali blocchi o loop infiniti. Spesso però ci si trova in situazioni per cui il nostro programma vada in situazioni di stallo durante l’attesa di eventi esterni che noi non possiamo prevedere o controllare. Proprio per questo ci viene incontro il watchdog

Vediamo come è possibile utilizzarlo all’interno del nostro sketch da caricare su arduino.

Prima di tutto includiamo la libreria #include <avr/wtd.h>.

Nel setup dovremo inizializzare il nostro watchdog attraverso l’istruzione

wdt enable(Parola Chiave);

Questa parola chiave è definita in base al tempo che riteniamo necessario, assunta dalla tabella seguente:

 

Tempo reset Parola Chiave
15mS WDTO_15MS
30mS WDTO_30MS
60mS WDTO_60MS
120mS WDTO_120MS
250mS WDTO_250MS
500mS WDTO_500MS
1S WDTO_1S
2S WDTO_2S
4S WDTO_4S
8S WDTO_8S

 

Supponiamo quindi di impostare il nostro watchdog con l’istruzione

wdt enable(WDTO_4S);

questo significa che se entro 4 secondi non resettiamo il conteggio del watchdog, esso eseguirà automaticamente il reset della cpu.
Per resettarlo impieghiamo la seguente funzione:

wdt reset();

 

Supponiamo ora di avere le seguenti istruzioni all’interno del nostro loop():

void loop(){

delay(3000);

Serial.println(“Ciao”);

wdt reset();

}

In questa situazione il watchdog non riavvierà mai Arduino in quanto passeranno solo 3 secondi prima che venga effettuato un reset.

Supponendo invece di avere l’istruzione delay(5000); al posto del delay(3000); . Di fatto non vedremo mai su seriale stampato il Ciao poichè non andremo mai oltre al delay.

Il funzionamento del watchdog in definitiva è molto semplice e intuibile e soprattutto utile nel momento in cui vogliamo essere sicuri che una determinata istruzione o blocco di istruzioni vengano eseguiti nel tempo preimpostato del watchdog.

Daniele Ruffo

Lascia un commento