システム タイマーをウォッチドッグとしてを使用する
重要
これは Azure Sphere (レガシ) のドキュメントです。 Azure Sphere (レガシ) は 2027 年 9 月 27 日に 再提供されておりユーザーは現時点で Azure Sphere (統合) に移行する必要があります。 TOC の上にある Version セレクターを使用して、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);
}
ウォッチドッグは、アプリケーション コードのどこかで定期的にリセットします。 1 つの方法は watchdogInterval
よりも短い間隔の第 2 のタイマーを使用する方法です。これは、アプリケーションが期待どおりに動作していることを検証し、動作している場合はウォッチドッグ タイマーをリセットします。
// Must be called periodically
void ExtendWatchdogExpiry(void)
{
//check that application is operating normally
//if so, reset the watchdog
timer_settime(watchdogTimer, 0, &watchdogInterval, NULL);
}