Instant Engineering

エンジニアの仕事効率を上げる知識をシェアするWeb記事/機械設計/TPS/QC品質管理

ウォッチドッグタイマーとは?異常検出の基本

組込みシステムを設計していると、「プログラムが暴走したらどうするのか」という問題に必ず直面します。

人間が常に監視できない無人運転の装置や、24時間稼働し続ける産業機器において、ソフトウェアのフリーズは致命的な事故につながりかねません。

そこで登場するのが「ウォッチドッグタイマー(WDT)」です。
文字どおり「番犬」のように、システムの動作を常に見張り、異常を検知したら自動的にリセットをかけてくれる安全機構です。

近年ではマイコンにほぼ標準搭載されているWDTですが、正しく設計しなければ「番犬が眠ったまま」という本末転倒な事態に陥ります。

本記事では、ウォッチドッグタイマーの基本原理からタイムアウト時間の計算方法、動作モードの違い、そして実装設計上の勘所までを体系的に解説します。

 

1. ウォッチドッグタイマー(WDT)とは

ウォッチドッグタイマー(Watchdog Timer、以下WDT)とは、システムの異常動作を自動検出し、リセットや割り込みによって正常状態へ復帰させるためのタイマー回路です。

「ウォッチドッグ」は英語で「番犬」を意味します。
番犬が不審者を見つけたら吠えるように、WDTはシステムの暴走やフリーズを検知するとリセット信号を発行します。

 

WDTが必要とされる背景

マイコン(マイクロコントローラ)で動作するソフトウェアは、ノイズや電源変動、ソフトウェアバグなど様々な要因で暴走する可能性があります。

暴走とは、プログラムカウンタが意図しないアドレスに飛んだり、無限ループに陥ったりして、本来の処理を実行できなくなる状態を指します。

人間が常に監視できる環境であれば手動リセットで対処できますが、以下のような場面では自動復帰が不可欠です。

  • 工場の24時間無人運転ライン
  • 自動車のエンジン制御ユニット(ECU)
  • 医療機器の生命維持装置
  • 通信基地局や電力系統の制御装置

これらの機器では、数秒のフリーズが重大事故や人命に関わる問題に直結するため、WDTによる自動異常検出とリセットが安全設計の基本として位置付けられています。

 

ソフトウェア暴走の具体的な原因

WDTが対処すべき「暴走」は、以下のような多様な原因から発生します。

電気的要因として、外来ノイズによるメモリ化け(SEU: Single Event Upset)、電源電圧の瞬時低下(ブラウンアウト)、静電気放電(ESD)によるラッチアップなどが挙げられます。

ソフトウェア要因として、スタックオーバーフロー、未初期化ポインタの参照、競合条件(レースコンディション)によるデッドロック、割り込み処理のネスト超過などがあります。

ハードウェア要因として、クロック源の異常発振、フラッシュメモリの読み出しエラー、外部デバイスからの予期しない入力などが考えられます。

これらの原因は設計段階で完全に排除することが困難であり、「暴走は必ず起きるもの」として備えるのがWDT設計の大前提です。

 

WDTの基本的な考え方

WDTの設計思想は非常にシンプルです。

正常動作しているプログラムは、定期的にWDTに「自分は正常です」という信号を送ります。
この信号を「キック」「リフレッシュ」「クリア」「フィード」などと呼びます(名称はメーカーにより異なります)。

もしプログラムが暴走してキック信号を送れなくなると、WDTは「異常が発生した」と判断してシステムをリセットします。

つまり、WDTは「沈黙を異常とみなす」という逆転の発想で動作するのです。
人間が「定期連絡がなければ異常事態」と判断するのと同じ論理構造です。

この「定期連絡方式」の美しさは、異常の種類や原因を特定する必要がない点にあります。
どのような原因で暴走しても、キックが途絶えるという一つの結果に収束するため、シンプルな回路で包括的な異常検出が可能になります。

 

 

WDTの歴史と標準化

ウォッチドッグタイマーの概念は1970年代のミニコンピュータ時代にまで遡ります。
当時のシステムは現在よりも信頼性が低く、ハードウェア障害やソフトウェアバグによる暴走が日常的に発生していました。

初期のWDTは外付け回路として設計され、555タイマーICとリセット回路を組み合わせたものが多く使われていました。
1980年代にはマイクロプロセッサの発展とともにWDTが標準ペリフェラルとして内蔵されるようになり、現在のマイコンではほぼ例外なく搭載される基本機能となっています。

現代では、自動車(ISO 26262)、産業(IEC 61508)、航空宇宙(DO-178C)、鉄道(EN 50128)など、安全が関わるあらゆる分野の規格でWDTの実装が推奨または必須とされています。
特にIEC 61508 Part 7のAnnex Aでは、WDTが「プログラムシーケンス監視」の代表的な安全メカニズムとして明記されています。

 

関連記事

instant.engineer

 

2. WDTの動作原理

WDTの内部構造は、基本的にはカウンタとクロック源で構成されます。
ここでは最も一般的な「フリーランカウンタ方式」の動作を順を追って解説します。

 

カウンタの動作フロー

WDTの動作は以下の3つのフェーズで理解できます。

フェーズ1:カウント開始

システム起動と同時に、WDT内部のカウンタがクロック信号に同期してカウントアップ(またはカウントダウン)を開始します。

カウンタのビット数を  n とすると、カウント最大値は  2^n - 1 です。
たとえば10ビットカウンタであれば、最大値は  2^{10} - 1 = 1023 となります。

WDTのクロック源には通常、メインクロックとは独立した低速発振器(32kHz〜128kHz程度のRCオシレータ)が使用されます。
メインクロックと独立にすることで、メインクロック停止時にもWDTが機能し続けられるようにするためです。

 

フェーズ2:キック(リフレッシュ)

正常動作中のプログラムは、カウンタがオーバーフローする前に「キック」命令を実行します。
キック命令はカウンタの値を0にリセット(アップカウンタの場合)し、カウントを最初からやり直させます。

この動作を周期的に繰り返すことで、カウンタは決してオーバーフローに到達しません。
つまり、正常時にはWDTリセットは発生しません。

キック処理は通常、WDTの制御レジスタに特定の値(キーワード)を書き込むことで実行されます。
誤書き込み防止のため、多くのマイコンでは2段階書き込み(例:0xAAを書き込み後に0x55を書き込む)を要求する仕様になっています。

 

フェーズ3:タイムアウト(異常検出)

プログラムが暴走すると、キック命令が実行されなくなります。
カウンタは止まることなくカウントアップを続け、やがてオーバーフローに到達します。

オーバーフローが発生すると、WDTは以下のいずれかの動作を実行します。

  • システムリセット信号の発行(最も一般的)
  • 割り込み(NMI:Non-Maskable Interrupt)の発生
  • リセット+割り込みの両方(2段階トリガ)

この一連の流れが「ウォッチドッグリセット」と呼ばれる基本動作です。

 

カウンタの方向とリセット条件

WDTのカウンタ方式には大きく分けて2種類があります。

アップカウンタ方式では、0から開始してオーバーフロー値  2^n - 1 に達するとリセットが発生します。
キック処理ではカウンタを0にクリアします。

ダウンカウンタ方式では、初期値(リロード値)から0に向かってカウントダウンし、0到達(アンダーフロー)でリセットが発生します。
キック処理ではリロード値を再設定します。

ダウンカウンタ方式は、リロード値を変更することでタイムアウト時間を動的に変更できる利点があります。
起動直後は長めに設定し、安定稼働後に短く切り替えるといった運用が可能です。

どちらの方式でも、タイムアウト時間の計算方法は本質的に同じです。
設計者はマイコンのデータシートで採用方式を確認し、適切な初期値やプリスケーラを設定する必要があります。

 

2段階トリガの活用

一部のマイコンでは、WDTタイムアウト時にまず割り込みを発生させ、その後さらに一定時間経過してからリセットを実行する「2段階トリガ」方式を採用しています。

最初の割り込みで異常発生のログ記録やデータ退避を行い、その後のリセットでクリーンな再起動を実現するための設計です。

この方式の時間関係は次のように表されます。

 

 T_{NMI} = T_{WDT}(割り込み発生)

 

 T_{reset} = T_{WDT} + T_{grace}(リセット発生)

 

ここで  T_{grace} は猶予時間であり、通常数ms〜数十msに設定されます。
この猶予時間内にNMIハンドラが重要データの不揮発メモリへの書き込みなどを完了させます。

 

関連記事

instant.engineer

 

3. タイムアウト時間の計算方法

WDTの設計で最も重要なパラメータが「タイムアウト時間」です。
タイムアウト時間を正しく計算し、適切な値に設定することが安定動作の鍵となります。

 

基本計算式

プリスケーラなしの場合、WDTのタイムアウト時間  T_{WDT} は以下の式で求められます。

 

 T_{WDT} = \dfrac{2^n}{f_{clk}}

 

ここで各変数の意味は次のとおりです。

  •  n:カウンタのビット数
  •  f_{clk}:WDT用クロック周波数(単位:Hz)
  •  T_{WDT}:タイムアウト時間(単位:秒)

 

プリスケーラ(分周器)を使用する場合は、クロック周波数が分周比  P で割られるため、式は次のように拡張されます。

 

 T_{WDT} = \dfrac{2^n \times P}{f_{clk}}

 

プリスケーラ値  P を大きくするほど、タイムアウト時間は長くなります。
多くのマイコンでは  P = 1, 2, 4, 8, 16, 32, 64, 128 のように2のべき乗で選択可能です。

 

具体的な計算例

以下の条件でタイムアウト時間を求めてみます。

・WDTクロック周波数: f_{clk} = 32.768 \text{ kHz} = 32768 \text{ Hz}
・カウンタビット数: n = 16(16ビットカウンタ)
・プリスケーラ: P = 1(分周なし)

 

Step 1:カウント最大値を求める

16ビットカウンタのオーバーフロー値は次のとおりです。

 

 2^{16} = 65536

 

つまり、カウンタは0から65535まで数えた後にオーバーフローします。
オーバーフローまでのカウント数は  2^{16} = 65536 回です。

 

Step 2:タイムアウト時間を計算する

基本式に値を代入します。

 

 T_{WDT} = \dfrac{2^{16} \times 1}{32768} = \dfrac{65536}{32768} = 2.0 \text{ s}

 

この設定では、キック処理が2秒以上途絶えるとWDTリセットが発生します。
2秒という値は、多くの産業機器では「やや長い」部類に入ります。

 

Step 3:プリスケーラによる調整

もしタイムアウト時間を短くしたい場合は、カウンタビット数を減らすか、クロック周波数を上げます。
逆に長くしたい場合はプリスケーラ値を上げます。

たとえばプリスケーラ  P = 8 に変更した場合は次のようになります。

 

 T_{WDT} = \dfrac{65536 \times 8}{32768} = 16.0 \text{ s}

 

タイムアウト時間が16秒に延長されました。

逆に、8ビットカウンタ( n = 8)でプリスケーラ  P = 1 の場合はどうなるでしょうか。

 

 T_{WDT} = \dfrac{2^8}{32768} = \dfrac{256}{32768} \approx 7.8 \text{ ms}

 

約7.8ミリ秒という非常に短いタイムアウトとなります。
これは高速応答が要求されるモーター制御などで使われることがある設定です。

 

タイムアウト時間の設定指針

一般的な設定指針として、以下の関係を満たすように設計します。

 

 T_{WDT} > T_{max\_loop} \times k

 

ここで  T_{max\_loop} はメインループの最大実行時間、 k は安全係数(通常  k = 2 \sim 3)です。

メインループが最も重い処理を実行した場合でも、WDTが誤ってリセットを発行しないよう、十分なマージンを確保することが重要です。

たとえばメインループの最大実行時間が  T_{max\_loop} = 50 \text{ ms} の場合、安全係数  k = 3 として次のように設定します。

 

 T_{WDT} > 50 \times 3 = 150 \text{ ms}

 

この場合、タイムアウト時間は少なくとも150ms以上に設定する必要があります。
実用上は200ms程度に設定するのが妥当でしょう。

ただし、タイムアウト時間が長すぎると異常検出が遅れるため、用途に応じた適切なバランスを見つけることが重要です。

 

 

代表的なマイコンのWDTタイムアウト時間一覧

参考として、代表的なマイコンファミリにおけるWDTの仕様を示します。

ARM Cortex-M系のSTM32シリーズでは、独立ウォッチドッグ(IWDG)として内蔵32kHz LSIクロックを使用し、最小タイムアウトは約125マイクロ秒、最大は約32秒です。
プリスケーラは  P = 4, 8, 16, 32, 64, 128, 256 の7段階で設定可能です。

ルネサスRXシリーズでは、WDTクロックとして  f_{PCLKB} \div 4 f_{PCLKB} \div 8192 の分周比が選択でき、カウンタのオーバーフロー周期で指定します。

Microchip PICマイコンのWDTは、内蔵LFINTOSCクロック(31kHz)を使用し、プリスケーラによって1ms〜約256秒の広範囲をカバーします。

いずれのマイコンでも、タイムアウト時間の計算には基本式  T_{WDT} = \dfrac{2^n \times P}{f_{clk}} を適用できます。
データシートに記載されたクロック周波数とプリスケーラ設定値を代入すれば、実際のタイムアウト時間を正確に算出できます。

 

温度によるタイムアウト精度の変動

WDTの内蔵RCオシレータは、外部水晶発振器に比べて温度特性が悪いという特徴があります。

一般的に、内蔵RCオシレータの周波数精度は常温で ±5%~±10% 、広温度範囲(-40~+85℃)では ±15%~±30% のばらつきがあります。

この周波数変動はタイムアウト時間に直接影響するため、マージン設計が必要です。

たとえば計算上のタイムアウト時間が  T_{WDT} = 100 \text{ ms} でも、温度変動を考慮すると実際のタイムアウトは  70 \sim 130 \text{ ms} の範囲でばらつく可能性があります。

安全設計では最短側(高温で周波数が高い場合)でも誤検出しないことを確認し、最長側(低温で周波数が低い場合)でも許容される復帰時間内に収まることを確認する必要があります。

 

4. WDTの動作モード

WDTには用途や要求される安全水準に応じて、複数の動作モードが存在します。
代表的な3つのモードについて、それぞれの特徴と適用場面を解説します。

 

タイムアウトモード(標準モード)

最も基本的なモードで、前述のとおり「一定期間内にキック信号がなければリセット」という単純な論理で動作します。

異常検出の条件は次の不等式で表現できます。

 

 T_{kick} > T_{WDT} \Rightarrow \text{リセット発生}

 

ここで  T_{kick} は前回のキックからの経過時間です。
シンプルで実装が容易なため、多くのシステムで採用されています。

タイムアウトモードの利点は、ソフトウェア側の実装負荷が最小限で済むことです。
メインループ内に1行のキック命令を追加するだけで基本的な保護が得られます。

ただし、タイムアウトモードには明確な弱点があります。
プログラムが暴走した先でキック処理だけが偶然実行され続ける「偽キック」の状態を検出できません。
また、プログラムが高速の無限ループに陥り、ループ内でキックが連発される場合も検出不可能です。

 

ウィンドウモード

ウィンドウモードは、タイムアウトモードの弱点を補うために開発された高度なモードです。

このモードでは、キック信号が有効と認められる「時間窓(ウィンドウ)」が設定されます。
ウィンドウの外でキックが来た場合も異常とみなされます。

正常判定の条件は次のとおりです。

 

 T_{open} < T_{kick} < T_{close}

 

ここで  T_{open} はウィンドウ開始時間(キック禁止期間「クローズドウィンドウ」の終了)、 T_{close} はウィンドウ終了時間(=タイムアウト時間)です。

異常検出される条件は2つあります。

  • キックが遅すぎる場合: T_{kick} \geq T_{close}(タイムアウト違反)
  • キックが早すぎる場合: T_{kick} \leq T_{open}(ウィンドウ違反)

 

たとえば  T_{open} = 50 \text{ ms} T_{close} = 200 \text{ ms} と設定した場合、キックは前回のキックから50ms〜200msの間に行われなければなりません。

50msより早いキック(暴走ループによる連発)も、200msより遅いキック(フリーズ)も、どちらも異常として検出されます。

早すぎるキックを検出できることで、暴走プログラムが高速ループ内でキックを連発する「ダブルパルス」異常も捕捉可能になります。

ウィンドウの幅  W は次のように表されます。

 

 W = T_{close} - T_{open}

 

このウィンドウ幅は、メインループの実行時間のジッター(変動幅)よりも十分に大きく設定する必要があります。
一般的には、ジッターの3〜5倍のウィンドウ幅が推奨されます。

自動車のECUや産業用安全コントローラなど、高い信頼性が求められるシステムで広く採用されています。

 

Q&A(チャレンジ&レスポンス)モード

最も高度な動作モードがQ&Aモード(チャレンジ&レスポンスモード)です。
このモードでは、単なるキック信号ではなく、WDTとマイコンの間で「問答」が行われます。

動作の流れは以下のとおりです。

1. WDTがマイコンに「チャレンジ」(乱数やシード値)を送信します。

2. マイコンは所定のアルゴリズム(CRC演算やXOR演算など)で「レスポンス」を計算します。

3. マイコンがレスポンスをWDTに返送します。

4. WDTが内部で独立に計算した期待値とレスポンスを比較し、一致すれば正常、不一致なら異常と判定します。

 

このモードの最大の利点は、マイコンのCPUが「正しい演算」を実行できる状態にあることを直接確認できる点です。

単にキック処理が動いているだけでなく、ALU(算術論理演算装置)やレジスタファイルを含む演算ロジック全体が健全であることを保証します。
ISO 26262(自動車機能安全規格)のASIL-D対応や、IEC 61508のSIL 3以上で要求されることが多いモードです。

Q&Aモードの欠点は実装の複雑さです。
マイコン側にレスポンス計算用のソフトウェアが必要となり、計算に要する時間も考慮した設計が求められます。
また、通信インターフェース(I2CやSPIなど)を介してWDT ICとデータ交換するため、通信エラーへの対処も必要です。

 

5. 内蔵WDTと外付けWDTの違い

WDTの実装形態には、マイコン内蔵型と外付けIC型の2種類があります。
それぞれの特徴を理解し、用途に応じて使い分けることが重要です。

 

内蔵WDTの特徴

現在のマイコンには、ほぼ標準でWDT機能が内蔵されています。
ARM Cortex-Mシリーズ、ルネサスRXシリーズ、PICマイコン、AVRマイコンなど、主要なマイコンファミリはすべてWDTを搭載しています。

内蔵WDTの利点は以下のとおりです。

  • 外付け部品が不要で基板面積を節約できる
  • マイコン内部のレジスタで柔軟かつ高速に設定変更が可能
  • 追加コストが発生しない(マイコンの標準機能)
  • 専用の内蔵RCオシレータで動作するため外部クロック不要

 

一方、内蔵WDTにはいくつかの限界があります。

  • マイコン自体のハードウェア障害(ラッチアップ等)では、WDTも巻き込まれて機能停止する可能性がある
  • 電源異常でマイコン全体が停止すると、WDTも停止する
  • ソフトウェアから意図せずWDTが無効化される恐れがある(レジスタ書き換え)
  • 単一障害点(Single Point of Failure)となりうる

 

外付けWDTの特徴

外付けWDT ICは、監視対象のマイコンとは独立した電源・クロックで動作する専用デバイスです。

代表的な製品には、日清紡マイクロデバイスのNBシリーズ、ABLICのS-58シリーズ、アナログ・デバイセズ(旧マキシム)のMAXシリーズ、テキサス・インスツルメンツのTPS38xxシリーズなどがあります。

外付けWDTの利点は以下のとおりです。

  • マイコンとは独立した電源系統で動作するため、マイコン電源異常も検出可能
  • ハードウェアレベルで無効化が困難なため、ソフトウェアバグによるWDT停止を防止
  • ウィンドウモードやQ&Aモードなど高度な検出機能を備えた製品が多い
  • 複数のマイコンを1つのWDT ICで監視するマルチチャネル構成も可能
  • 電圧監視(パワーオンリセット)機能を兼ねた製品もあり、部品点数を削減できる

 

外付けWDTの欠点は、追加部品によるコスト増加と基板面積の消費、および通信インターフェースの設計が必要になる点です。

 

使い分けの指針

一般的な使い分けの考え方を安全水準別に以下に示します。

民生機器(家電、IoTセンサ、ホビー用途)

内蔵WDTで十分なケースがほとんどです。
コスト要求が厳しい量産品では内蔵WDTが第一選択となります。
タイムアウトモードで運用し、暴走時は自動リセットで復帰させる設計が一般的です。

産業機器(PLC、インバータ制御、ロボットコントローラ)

内蔵WDT+外付けWDTの二重監視が推奨されます。
シーケンス制御のPLCでは内蔵と外付けの併用が標準的な設計手法です。
外付けWDTにはウィンドウモード以上の検出機能を持つ製品を選定します。

車載機器(ECU)や安全機器(SIL 2以上)

外付けWDT(ウィンドウモードまたはQ&Aモード)が必須です。
ISO 26262やIEC 61508の要求を満たすためには、マイコンから独立した監視系統が求められます。
複数の独立したWDTによる冗長構成も検討されます。

 

 

安全規格とWDTモードの対応関係

安全規格で要求されるWDTの診断カバー率は、対象となる安全度水準(SIL/ASIL)によって異なります。

IEC 61508(産業用機能安全規格)では、SIL 1〜2レベルではタイムアウトモードの内蔵WDTで60〜90%の診断カバー率を達成できるとされています。
SIL 3〜4レベルでは、ウィンドウモード以上の外付けWDTが必須となり、99%以上の診断カバー率が求められます。

ISO 26262(自動車機能安全規格)では、ASIL-AからASIL-Bまでは内蔵WDT(タイムアウトまたはウィンドウモード)が許容されますが、ASIL-CおよびASIL-Dでは外付けWDTによる独立監視が要求されます。

特にASIL-Dの場合、Q&Aモードを含む複合的な監視と、さらに独立プロセッサによる相互監視(ロックステップ方式)が組み合わせて使用されることもあります。

WDTの選定にあたっては、製品が準拠すべき安全規格を最初に確認し、要求される診断カバー率から逆算してモードと実装形態を決定するのが効率的です。

 

 

安全規格とWDTモードの対応関係

安全規格で要求されるWDTの診断カバー率は、対象となる安全度水準(SIL/ASIL)によって異なります。

IEC 61508(産業用機能安全規格)では、SIL 1~2レベルではタイムアウトモードの内蔵WDTで60~90%の診断カバー率を達成できるとされています。
SIL 3~4レベルでは、ウィンドウモード以上の外付けWDTが必須となり、99%以上の診断カバー率が求められます。

ISO 26262(自動車機能安全規格)では、ASIL-AからASIL-Bまでは内蔵WDT(タイムアウトまたはウィンドウモード)が許容されますが、ASIL-CおよびASIL-Dでは外付けWDTによる独立監視が要求されます。

特にASIL-Dの場合、Q&Aモードを含む複合的な監視と、さらに独立プロセッサによる相互監視(ロックステップ方式)が組み合わせて使用されることもあります。

WDTの選定にあたっては、製品が準拠すべき安全規格を最初に確認し、要求される診断カバー率から逆算してモードと実装形態を決定するのが効率的です。

 

6. ウォッチドッグタイマーの実装設計

WDTの仕組みを理解しても、実装設計を誤れば番犬は正しく吠えてくれません。
ここでは実務レベルで押さえるべき設計ポイントを解説します。

 

キック処理の配置設計

WDTキック処理をプログラムのどこに配置するかは、WDT設計の最重要課題です。

悪い例:タイマー割り込み内でのキック

ハードウェアタイマーの定期割り込みハンドラ内にWDTキックを配置するのは、最もよくある設計ミスです。

割り込み処理は本体プログラムとは独立して動作するため、メインプログラムが暴走してもタイマー割り込みだけは正常に動き続ける場合があります。
この場合、WDTは暴走を検出できません。

 

良い例:メインループ末尾でのキック

メインループの末尾(全処理が正常完了した後)にキック処理を配置するのが基本原則です。
こうすることで、ループ内のどの処理で暴走してもキック処理に到達できなくなり、確実にWDTリセットが発動します。

さらに堅牢な設計として、メインループの先頭と末尾に「チェックポイントフラグ」を設置し、両方のフラグが立っている場合のみキックを実行する方式があります。
これにより、ループの一部だけがスキップされる部分暴走も検出可能になります。

 

マルチタスク環境での設計

リアルタイムOS(RTOS)を使用するマルチタスク環境では、WDTの設計がより複雑になります。

複数のタスクが並行動作するため、「どのタスクが正常でどのタスクが停止しているか」を個別に監視する必要があります。

代表的な設計パターンは「監視タスク方式」です。

1. 各タスクは定期的に「生存フラグ」を専用のビットフィールドにセットします。

2. 専用の監視タスク(最高優先度またはアイドルタスク)が全タスクの生存フラグを確認します。

3. 全タスクのフラグがセットされている場合のみ、監視タスクがWDTをキックします。

4. フラグ確認後、全フラグをクリアして次の監視周期に備えます。

 

この方式により、いずれか1つのタスクが停止しただけでもWDTリセットが発動する堅牢な設計が実現できます。

監視タスクの周期  T_{monitor} とWDTタイムアウト時間の関係は次のようになります。

 

 T_{WDT} > T_{monitor} + T_{jitter}

 

ここで  T_{jitter} は監視タスクの実行タイミングの揺らぎ(最悪値)です。
RTOSのスケジューリング遅延やより高優先度タスクによるプリエンプションも考慮に入れます。

 

起動時の特別処理

システム起動直後は、ペリフェラルの初期化やセンサのキャリブレーションなど、通常よりも長い時間を要する処理が実行されます。

この起動処理時間が通常のタイムアウト時間を超過する場合、WDTが誤ってリセットを発行する「起動時リセットループ」に陥る危険があります。

対策として、以下の方法が用いられます。

  • 起動時は長いタイムアウト時間を設定し、初期化完了後に短く変更する
  • 起動処理の各段階でキックを挟む(ただし暴走検出能力は低下する)
  • 外付けWDTのパワーオンリセット遅延機能を活用する

 

関連記事

instant.engineer

 

7. WDTが効かない原因と対策

「WDTを実装したのにシステムが復帰しない」というトラブルは、組込み開発の現場で頻繁に報告されます。
ここでは代表的な原因と対策を解説します。

 

原因1:割り込み内キックによる偽正常

前述のとおり、タイマー割り込みやDMA完了割り込みの中でキックを行っていると、メインプログラムの暴走を検出できません。

対策:キック処理はメインループ(またはRTOSの監視タスク)の正常経路上のみに配置します。
割り込みハンドラ内でのキックは設計レビューで禁止事項として管理すべきです。
コードレビュー時のチェックリストに「WDTキックが割り込みコンテキスト内にないこと」を明記するのが有効です。

 

原因2:WDTの無効化コード残留

開発中のデバッグ効率化のためにWDTを無効化するコードを入れ、リリース時に削除し忘れるケースです。
特にデバッガ接続時にWDTを自動停止する設定を有効にしたまま量産ビルドに混入する事故が起こりがちです。

対策:WDTの有効/無効はコンパイル時定数で管理し、リリースビルドでは強制有効化するビルド構成を採用します。
さらに起動時にWDTステータスレジスタを読み出して有効状態を確認する自己診断を組み込みます。
CIパイプラインでWDT関連レジスタの設定値を静的解析する仕組みも有効です。

 

原因3:暴走先にキック処理が存在

プログラムメモリ上のキック処理のアドレスに偶然暴走した場合、キックが実行されてWDTがリセットされ続ける可能性があります。
キック処理が1命令(レジスタへの即値書き込み)で完結する構造だと、この偶然の確率が高くなります。

対策:ウィンドウモードを採用することで、想定外のタイミングでのキックを異常として検出します。
また、キック処理の前後に正常フロー確認用のフラグチェックを入れ、複数条件が揃った場合のみキックが実行される構造にすることも有効です。

 

原因4:電源リセット後のWDT未再設定

一部のマイコンでは、WDTリセット後にWDTが自動的に無効化される仕様のものがあります。
リセット後の初期化ルーチンでWDTを再設定しないと、2回目以降の暴走は検出できません。

対策:起動処理の最初期段階(Cランタイム初期化前が理想)でWDTを再設定・再有効化するコードを配置します。
具体的には、リセットベクタ直後のスタートアップコード(アセンブリレベル)に記述します。
また、「一度有効化したら無効化不可」のヒューズビット設定が可能なマイコンでは、この設定を活用します。

 

原因5:クロック源の異常

WDTのクロック源が停止または異常発振すると、カウンタが進まなくなりタイムアウトが発生しません。
内蔵RCオシレータを使用するWDTでは稀ですが、外部クロック入力型やメインクロック流用型では注意が必要です。

対策:可能であれば、WDT専用の独立クロック(内蔵RC等)を使用します。
外付けWDT ICは通常、専用の内蔵発振器を備えているため、この問題が発生しにくい利点があります。
マイコン選定時にWDTクロック源の独立性をデータシートで確認することが重要です。

 

 

原因6:リセット後の無限ループ

WDTリセット自体は正常に発動するものの、リセット後に再び同じ暴走パターンに陥り、WDTリセット→暴走→WDTリセットを永遠に繰り返す「リセットループ」も見落とされがちな問題です。

この状態ではシステムは一見「動いている」ように見えますが、有効な処理は一切実行されません。
特に起動直後に外部デバイスとの通信エラーが暴走を引き起こすケースでは、何度リセットしても同じ箇所で暴走するため永続的なリセットループとなります。

対策:リセット要因レジスタを起動時に確認し、WDTリセットが連続した場合(例:3回連続)は通常起動ではなくセーフモード(最低限の機能のみ起動)に遷移する設計を入れます。
リセット回数はバックアップレジスタや不揮発メモリに記録しておきます。

 

WDT設計のレビューチェックリスト

最後に、設計レビュー時に確認すべき項目をまとめます。

  • キック処理は割り込みコンテキスト外(メインループまたは監視タスク内)に配置されているか
  • タイムアウト時間は最大処理時間の2〜5倍のマージンを確保しているか
  • 起動処理中のWDTタイムアウトを考慮しているか
  • リリースビルドでWDTが確実に有効化される仕組みがあるか
  • WDTリセット後の再初期化でWDTが再設定されるか
  • 温度変動によるタイムアウト精度のばらつきを考慮しているか
  • リセットループ対策(セーフモード遷移)が実装されているか
  • 安全規格の要求に対して適切なWDTモード・構成が選定されているか

これらの項目を設計段階で確認し、コードレビュー時にも再検証することで、WDTに関するトラブルの大半を未然に防ぐことができます。

 

 

原因6:リセット後の無限ループ

WDTリセット自体は正常に発動するものの、リセット後に再び同じ暴走パターンに陥り、WDTリセット→暴走→WDTリセットを永遠に繰り返す「リセットループ」も見落とされがちな問題です。

この状態ではシステムは一見「動いている」ように見えますが、有効な処理は一切実行されません。
特に起動直後に外部デバイスとの通信エラーが暴走を引き起こすケースでは、何度リセットしても同じ箇所で暴走するため永続的なリセットループとなります。

対策:リセット要因レジスタを起動時に確認し、WDTリセットが連続した場合(例:3回連続)は通常起動ではなくセーフモード(最低限の機能のみ起動)に遷移する設計を入れます。
リセット回数はバックアップレジスタや不揮発メモリに記録しておきます。

 

WDT設計のレビューチェックリスト

最後に、設計レビュー時に確認すべき項目をまとめます。

  • キック処理は割り込みコンテキスト外(メインループまたは監視タスク内)に配置されているか
  • タイムアウト時間は最大処理時間の2~5倍のマージンを確保しているか
  • 起動処理中のWDTタイムアウトを考慮しているか
  • リリースビルドでWDTが確実に有効化される仕組みがあるか
  • WDTリセット後の再初期化でWDTが再設定されるか
  • 温度変動によるタイムアウト精度のばらつきを考慮しているか
  • リセットループ対策(セーフモード遷移)が実装されているか
  • 安全規格の要求に対して適切なWDTモード・構成が選定されているか

これらの項目を設計段階で確認し、コードレビュー時にも再検証することで、WDTに関するトラブルの大半を未然に防ぐことができます。

 

8. まとめ

本記事では、ウォッチドッグタイマー(WDT)の基本原理から実装設計まで、体系的に解説しました。

WDTはシンプルな「番犬」のメカニズムでありながら、組込みシステムの安全性を根底から支える重要な機能です。
タイムアウト時間の計算式  T_{WDT} = \dfrac{2^n \times P}{f_{clk}} を理解し、適切な値を設定することが設計の第一歩となります。

動作モードの選択では、民生機器はタイムアウトモード、産業機器はウィンドウモード、車載安全機器はQ&Aモードと、要求される安全水準に応じた使い分けが重要です。

内蔵WDTと外付けWDTの選定では、コストと安全要求のバランスを考慮し、必要に応じて二重監視構成を採用してください。

そして最も注意すべきは「キック処理の配置」です。
割り込み内でのキックや暴走経路上のキックなど、WDTを無力化してしまう設計ミスを確実に排除してください。

WDTの設計において忘れてはならないのは、「WDTは最後の砦」であるという点です。
WDTがリセットを発動する状況は、すでに他のすべての防御策(ソフトウェアの例外処理、ハードウェアの保護回路など)が突破された後の非常事態を意味します。

だからこそ、WDT自体が確実に機能するよう、設計・実装・検証の各段階で細心の注意を払う必要があります。

WDTは正しく設計すれば、24時間365日、黙って忠実にシステムを見守り続けてくれる頼もしい番犬です。
本記事の知識を活かして、信頼性の高いシステム設計に取り組んでいただければ幸いです。