使用系统计时器作为监视程序
重要
这是 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);
}