Použití systémového časovače jako sledovacího zařízení
Důležité
Toto je dokumentace k Azure Sphere (starší verze). Azure Sphere (starší verze) se vyřazuje 27. září 2027 a uživatelé musí do této doby migrovat do Azure Sphere (integrované). K zobrazení dokumentace k Azure Sphere (integrované) použijte selektor verzí umístěný nad obsahem.
Aplikace vysoké úrovně může jako sledovací program použít systémový časovač, aby operační systém ukončil a restartoval tuto aplikaci, pokud přestane reagovat. Když sledovací zařízení vyprší, vyvolá signál, že aplikace nezpracuje, což zase způsobí ukončení aplikace operačním systémem. Po ukončení operační systém automaticky restartuje aplikaci.
Použití časovače watchdogu:
- Definování časovače
- Vytvoření časovače a jeho arm
- Pravidelně resetujte časovač před vypršením jeho platnosti.
Pokud chcete definovat časovač, vytvořte strukturu itimerspec a nastavte interval a počáteční vypršení platnosti na pevnou hodnotu, například jednu sekundu.
#include <time.h>
const struct itimerspec watchdogInterval = { { 1, 0 },{ 1, 0 } };
timer_t watchdogTimer;
Nastavte událost oznámení, signál a hodnotu signálu pro sledovací zařízení, zavolejte timer_create ho vytvořte a zavolejte timer_settime , který ho má zaručovat. V tomto příkladu watchdogTimer
vyvolá událost SIGALRM. Aplikace tuto událost nezpracuje, takže operační systém aplikaci ukončí.
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);
}
Jinde v kódu aplikace pravidelně resetujte watchdog. Jednou z technik je použití druhého časovače, který má kratší období než watchdogInterval
, k ověření, že aplikace funguje podle očekávání, a pokud ano, resetujte časovač 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);
}