次の方法で共有


システム タイマーをウォッチドッグとしてを使用する

重要

これは 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);
}