Utiliser une horloge système comme minuteur de surveillance
Important
Il s’agit de la documentation Azure Sphere (héritée). Azure Sphere (hérité) prend sa retraite le 27 septembre 2027 et les utilisateurs doivent migrer vers Azure Sphere (intégré) pour l’instant. Utilisez le sélecteur de version situé au-dessus du TOC pour afficher la documentation Azure Sphere (intégrée).
Une application de haut niveau peut utiliser un minuteur système en tant qu’agent de surveillance pour que le système d’exploitation se termine et redémarre cette application s’il ne répond plus. Quand le minuteur de surveillance arrive à expiration, il déclenche un signal non géré par l’application, ce qui force alors le système d’exploitation à arrêter l’application. Après avoir arrêté l’application, le système d’exploitation la redémarre automatiquement.
Pour utiliser un minuteur de surveillance, vous devez :
- Définir le minuteur
- Créer et activer le minuteur
- Réinitialiser le minuteur régulièrement avant son expiration
Pour définir le minuteur, créez un struct itimerspec et définissez l’intervalle et l’expiration initiale à une valeur fixe (par exemple, une seconde).
#include <time.h>
const struct itimerspec watchdogInterval = { { 1, 0 },{ 1, 0 } };
timer_t watchdogTimer;
Définissez un événement de notification, un signal et une valeur de signal pour le minuteur de surveillance, appelez timer_create pour créer le minuteur et appelez timer_settime pour l’activer. Dans cet exemple, watchdogTimer
déclenche l’événement SIGALRM. Comme l’application ne gère pas l’événement, elle est arrêtée par le système d’exploitation.
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);
}
Dans le code de l’application, réinitialisez régulièrement le minuteur de surveillance. Une technique consiste à ajouter un deuxième minuteur ayant un intervalle plus court que watchdogInterval
, pour vérifier que l’application fonctionne comme prévu et, le cas échéant, réinitialiser le minuteur de surveillance.
// Must be called periodically
void ExtendWatchdogExpiry(void)
{
//check that application is operating normally
//if so, reset the watchdog
timer_settime(watchdogTimer, 0, &watchdogInterval, NULL);
}