使用系统计时器作为监视程序

重要

这是 Azure Sphere(旧版)文档。 Azure Sphere(旧版)将于 2027 年 9 月 27 日停用,用户此时必须迁移到 Azure Sphere(集成)。 使用位于 TOC 上方的版本选择器查看 Azure Sphere(集成)文档。

高级应用程序可以使用系统计时器作为监视器,使 OS 在应用程序无响应时终止并重启该应用程序。 监视程序过期时,会引发一个信号来告知应用程序无法处理事件,从而导致 OS 终止该应用程序。 终止后,OS 会自动重启该应用程序。

使用监视程序计时器:

  • 定义计时器
  • 创建并装备计时器
  • 在计时器过期之前定期重置计时器

若要定义计时器,请创建 itimerspec 结构,并将间隔和初始过期时间设置为固定值,例如 1 秒。

#include <time.h>

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

设置监视程序的通知事件、信号和信号值,调用 timer_create 创建计时器,然后调用 timer_settime 装备计时器。 在此示例中,watchdogTimer 引发 SIGALRM 事件。 应用程序无法处理该事件,因此 OS 会终止该应用程序。

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

在应用程序代码中的其他位置定期重置监视程序。 一种方法是使用周期比 watchdogInterval 更短的秒计时器来验证应用程序是否按预期方式运行,如果是,则重置监视程序计时器。

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