Dela via


Använda en systemtimer som vakthund

Viktigt!

Det här är dokumentationen om Azure Sphere (Legacy). Azure Sphere (Legacy) upphör den 27 september 2027 och användarna måste migrera till Azure Sphere (integrerad) vid den här tiden. Använd versionsväljaren ovanför TOC för att visa dokumentationen om Azure Sphere (integrerad).

Ett högnivåprogram kan använda en systemtimer som vakthund för att få operativsystemet att avsluta och starta om programmet om det slutar svara. När vakthunden upphör att gälla genererar den en signal som programmet inte hanterar, vilket i sin tur gör att operativsystemet avslutar programmet. Efter avslutningen startar operativsystemet om programmet automatiskt.

Så här använder du en vakthundstimer:

  • Definiera timern
  • Skapa och beväpna timern
  • Återställ timern regelbundet innan den upphör att gälla

För att definiera timern skapar du en itimerspec-struktur och anger intervallet och den första förfallotiden till ett fast värde, till exempel en sekund.

#include <time.h>

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

Ange ett meddelandehändelse-, signal- och signalvärde för vakthunden, anropa timer_create för att skapa den och anropa timer_settime för att beväpna den. I det här exemplet watchdogTimer genererar SIGALRM-händelsen. Programmet hanterar inte händelsen, så operativsystemet avslutar programmet.

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

På andra ställen i programkoden återställer du vakthunden med jämna mellanrum. En teknik är att använda en andra timer, som har en period som är kortare än watchdogInterval, för att verifiera att programmet fungerar som förväntat och i så fall återställa timern för vakthunden.

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