Compartilhar via


Usar um timer do sistema como um watchdog

Importante

Esta é a documentação do Azure Sphere (herdado). O Azure Sphere (herdado) será desativado em 27 de setembro de 2027 e os usuários devem migrar para o Azure Sphere (integrado) até esse momento. Use o seletor de versão localizado acima do sumário para exibir a documentação do Azure Sphere (Integrado).

Um aplicativo de alto nível pode usar um temporizador do sistema como um watchdog para fazer com que o sistema operacional encerre e reinicie esse aplicativo se ele parar de responder. Quando o watchdog expira, ele emite um sinal que o aplicativo não consegue manipular, o que, por sua vez, faz com que o sistema operacional encerre o aplicativo. Após o encerramento, o sistema operacional reinicia automaticamente o aplicativo.

Para usar um temporizador watchdog:

  • Defina o temporizador
  • Crie e inicie o temporizador
  • Redefina o temporizador regularmente antes que ele expire

Para definir o temporizador, crie uma estrutura itimerspec e defina o intervalo e a validade inicial como um valor fixo, por exemplo, um segundo.

#include <time.h>

const struct itimerspec watchdogInterval = { { 1, 0 },{ 1, 0 } };
timer_t watchdogTimer;

Defina um evento de notificação, um sinal e um valor de sinal para o watchdog, chame timer_create para criá-lo e chame timer_settime para armá-lo. Neste exemplo, watchdogTimer emite o evento SIGALRM. O aplicativo não manipula o evento, portanto o sistema operacional encerra o aplicativo.

void SetupWatchdog(void)
{
    struct sigevent alarmEvent;
    alarmEvent.sigev_notify = SIGEV_SIGNAL;
    alarmEvent.sigev_signo = SIGALRM;
    alarmEvent.sigev_value.sival_ptr = &watchdogTimer;

    int result = timer_create(CLOCK_MONOTONIC, &alarmEvent, &watchdogTimer);
    result = timer_settime(watchdogTimer, 0, &watchdogInterval, NULL);
}

Em outro lugar no código do aplicativo, redefina o watchdog periodicamente. Uma técnica é usar um segundo temporizador, que tem um período menor do que o watchdogInterval, a fim de verificar se o aplicativo está funcionando conforme o esperado e, nesse caso, redefinir o temporizador watchdog.

// Must be called periodically
void ExtendWatchdogExpiry(void)
{
    //check that application is operating normally
    //if so, reset the watchdog
    timer_settime(watchdogTimer, 0, &watchdogInterval, NULL);
}