Funzioni gestione watchdog

Sulla scheda interfaccia è presente un complesso circuito di watchdog basato su di un processore Cortex M0. Il modulo CPU ed il processore di watchdog sulla scheda di interfaccia dialogano tra di loro tramite una connessione I2C permettendo una gestione ottimizzata del watchdog (Vedi articolo).

eWDogRefresh

bool_t eWDogRefresh(void);

Esegue il rinfresco del circuito di watchdog, quando è attivo il circuito ne và eseguito il refresh entro il tempo impostato, in caso contrario verrà forzato un reset sul modulo Raspberry. Viene ritornato l'esito: false: Errore esecuzione, true: Ok esecuzione.

eResetWDog

bool_t eResetWDog(void);

Resetta il numero di riavvii causati dall'intervento del watchdog ed imposta 0 come tempo di controllo watchdog disabilitandolo. Viene ritornato l'esito: false: Errore esecuzione, true: Ok esecuzione.

eResetWdogRebootCtr

bool_t eResetWdogRebootCtr(void);

Esegue reset del numero di riavvii eseguiti per intervento del watchdog controller. Viene ritornato l'esito: false: Errore esecuzione, true: Ok esecuzione.

Esempi

Come utilizzare gli esempi.
Avendo nella inizializzazione del bus periferico abilitato il watchdog (Vedi articolo) con un tempo di controlo di 2 secondi, occorre eseguire almeno ogni 2 secondi il rinfresco del circuito altrimenti si avrà il reset del modulo CPU Raspberry. Questo programma viene ciclicamente eseguito dal programma principale e otre al rinfresco del watchdog con la funzione eWDogRefresh permette di eseguire il test di funzionamento del circuito.

Digitando "s" sulla tastiera l'esecuzione ciclica si arresta per un tempo superore al tempo impostato di watchdog questo provoca l'intervento del circuito che esegue il reset con il conseguente riavvio. Avendo armato il circuito di watchdog se non si esegue ciclicamente il reset con la funzione eWDogRefresh, o se non lo si disabilita con la funzione eResetWDog o disabilitando il segnale di ready sul bus con la funzione ePhrI2cBusReady, il modulo CPU Raspberry verrà ciclicamente resettato ogni minuto.

CodeLite (Ptp174)
// *****************************************************************************
// PROGRAM "WatchDog.cpp"
// *****************************************************************************
// An example how to manage the watchdog circuit.
// Please note that this program is cyclically called by the main.
// -----------------------------------------------------------------------------

#include <Library.h>
#include <SystemTime.h>
#include <PhrI2cBus.h>
#include <WatchDog.h>
#include <stdio.h>
#include <unistd.h>
using namespace Elsist; //Defines namespace
extern int8_t Kb; //Key pressed

// -----------------------------------------------------------------------------
// PROGRAM EXECUTION
// -----------------------------------------------------------------------------

bool WatchDog(void)
{
    // -------------------------------------------------------------------------
    // LOCAL VARIABLES
    // -------------------------------------------------------------------------
    // Define variables.

    // -------------------------------------------------------------------------
    // MANAGES THE WATCHDOG CIRCUIT
    // -------------------------------------------------------------------------
    // The watchdog control has been set so it must be refreshed. If it's
    // not refreshed in the time set the system is rebooted.

    eWDogRefresh(); //Refresh the watchdog circuit

    // Manage keyboard command.

    switch (Kb&0xFF)
    {
        // On "s" Sleep command, the program sleeps for a time longer than
        // watchdog setting so the watchdog circuit reboots it.
        // Please remaind that the watchdog circuit is armed so if it's not
        // reset, the system reboots every 1 minute.
        // To unarm the watch dog control the eResetWDog() function
        // must be executed. Or manually reboot the system.

        case 's': printf("Sleep for a whilen"); usleep(eMSEC(3000)); break;

        // On "x" Exit command, the program terminates, and the watchdog
        // circuit is unarmed.

        case 'x':
        printf("Exit commandn");
        eResetWDog(); //Watchdog reset, it reinits the reboot counter
        ePhrI2cBusReady(false, 0); //Reset ready signal on peripheral bus
        return(false);
    }
    return(true);
}

// [End of file]
Was this article helpful?