Use um temporizador do sistema como um cão de guarda
Importante
Esta é a documentação do Azure Sphere (Legado). O Azure Sphere (Legado) 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 cão de guarda para fazer com que o sistema operacional encerre e reinicie esse aplicativo se ele deixar de responder. Quando o cão de guarda expira, ele gera um sinal de que o aplicativo não manipula, o que, por sua vez, faz com que o sistema operacional encerre o aplicativo. Após o encerramento, o SO reinicia automaticamente a aplicação.
Para usar um temporizador de vigilância:
- Definir o temporizador
- Criar e armar o temporizador
- Reponha o temporizador regularmente antes de expirar
Para definir o temporizador, crie uma estrutura itimerspec e defina o intervalo e a expiração inicial para um valor fixo, como um segundo.
#include <time.h>
const struct itimerspec watchdogInterval = { { 1, 0 },{ 1, 0 } };
timer_t watchdogTimer;
Defina um evento de notificação, sinal e valor de sinal para o cão de guarda, chame timer_create para criá-lo e chame timer_settime para armá-lo. Neste exemplo, watchdogTimer
gera o evento SIGALRM. O aplicativo não manipula o evento, então 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 outra parte do código do aplicativo, redefina o cão de guarda periodicamente. Uma técnica é usar um segundo temporizador, que tem um período mais curto do que o watchdogInterval
, para verificar se o aplicativo está funcionando conforme o esperado e, em caso afirmativo, redefinir o temporizador de vigilância.
// Must be called periodically
void ExtendWatchdogExpiry(void)
{
//check that application is operating normally
//if so, reset the watchdog
timer_settime(watchdogTimer, 0, &watchdogInterval, NULL);
}