Compartir vía


Uso de un temporizador del sistema como un guardián

Importante

Esta es la documentación de Azure Sphere (heredado). Azure Sphere (heredado) se retira el 27 de septiembre de 2027 y los usuarios deben migrar a Azure Sphere (integrado) en este momento. Use el selector de versiones situado encima de la TOC para ver la documentación de Azure Sphere (integrado).

Una aplicación de alto nivel puede usar un temporizador del sistema como guardián para hacer que el sistema operativo finalice y reinicie esa aplicación si deja de responder. Cuando el guardián expira, provoca una señal que la aplicación no controla, lo que hará que el sistema operativo finalice la aplicación. Tras la finalización, el sistema operativo reinicia automáticamente la aplicación.

Para usar un temporizador como guardián:

  • Defina el temporizador
  • Cree y active el temporizador
  • Restablezca el temporizador con regularidad antes de que expire

Para definir el temporizador, cree una estructura itimerspec y establezca el intervalo y la expiración inicial en un valor fijo, por ejemplo, un segundo.

#include <time.h>

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

Establezca un evento de notificación, una señal y el valor de señal para el guardián, llame a timer_create para crearlo y llame a timer_settime para activarlo. En este ejemplo, watchdogTimer provoca el evento SIGALRM. La aplicación no controla el evento, por lo que el sistema operativo termina la aplicación.

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);
}

En alguna parte del código de la aplicación, restablezca el guardián periódicamente. Una técnica consiste en utilizar un segundo temporizador con un período más corto que el valor de watchdogInterval para comprobar que la aplicación está funcionando según lo previsto y, si es así, restablecer el temporizador.

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