組み込み機器では、プログラムが予期しない状態になったとしても、人が電源を入れ直してくれるとは限りません。
たとえば通信処理から戻ってこない、無限ループに入る、何らかの原因でプログラムが正常に進まなくなる、といった問題が発生することがあります。
このようなときに、マイコンが正常に動いているかを監視し、必要に応じて復旧させるために使われるのがウォッチドッグタイマー(Watchdog Timer:WDT)です。
この記事では、ウォッチドッグタイマーの基本的な仕組みから、タイムアウト、ウォッチドッグのリセット(キック)、通常のタイマーとの違い、ESP32-C3での考え方まで解説します。
ウォッチドッグタイマー(WDT)とは?
ウォッチドッグタイマー(Watchdog Timer:WDT)とは、マイコンやプログラムが正常に動作しているかを監視するためのタイマーです。
ウォッチドッグは一定時間をカウントしており、プログラムが正常に動作している間は、定期的にウォッチドッグへ「正常に動いている」という合図を送ります。
この合図によってウォッチドッグのカウントをリセットします。
ところが、プログラムがフリーズするなどして合図を送れなくなると、ウォッチドッグが設定時間に到達します。
その結果、設定に応じて割り込みやマイコンのリセットなどが発生し、システムの復旧を試みます。
上図①のように、プログラムが正常に動いている間はウォッチドッグを定期的にリセットします。何らかの原因でプログラムが停止してリセットできなくなると、設定時間の経過後にウォッチドッグが異常を検出します。
なぜウォッチドッグが必要なの?
パソコンのアプリケーションで問題が発生した場合、人がアプリケーションを終了したり、パソコンを再起動したりできます。
しかし組み込み機器では、人が操作できない場所で長期間動作していることがあります。
- 工場設備
- センサー端末
- IoT機器
- 屋外に設置された装置
- 無人で動作する機器
こうした機器がフリーズするたびに、人が現場へ行って電源を入れ直すのは現実的ではありません。
そこでウォッチドッグを利用し、プログラムが正常に動作できなくなった場合に自動的な復旧を試みます。
ウォッチドッグの基本的な動作
ウォッチドッグタイマーの基本的な流れは次のようになります。
- ウォッチドッグタイマーを開始する
- ウォッチドッグが時間をカウントする
- プログラムが正常なら一定時間以内にウォッチドッグをリセットする
- ウォッチドッグは再び最初からカウントする
- リセットされないまま設定時間に達するとタイムアウトする
- 設定に応じてリセットなどの処理を行う
つまりウォッチドッグは、プログラムから定期的に生存確認を受け取るタイマーと考えると分かりやすいでしょう。
ウォッチドッグを「キックする」とは?
組み込み開発では、ウォッチドッグのカウンタをリセットすることを「ウォッチドッグをキックする」や「ウォッチドッグをフィードする(feed)」と表現することがあります。
たとえばタイムアウト時間が5秒なら、正常動作中に5秒より短い間隔でウォッチドッグをリセットします。
時間 →
0秒 2秒 4秒 6秒 8秒
│ │ │ │ │
開始 キック キック キック キック
│ │ │ │ │
└─計測────┘
└─計測────┘
└─計測────┘
正常にキックされ続けている間はタイムアウトしません。
プログラムが止まるとどうなる?
たとえば次のような問題によって、ウォッチドッグをリセットする処理まで到達できなくなったとします。
- 意図しない無限ループ
- 処理が長時間ブロックしている
- 通信処理から戻ってこない
- タスクが正常に実行されなくなった
- ソフトウェアの不具合で処理が停止した
するとウォッチドッグのカウントがリセットされなくなります。
正常動作 正常動作 異常発生
│ │ │
キック キック プログラム停止
│ │ │
└── WDT計測 ────┘ │
└──── WDT計測 ───────→
↓
タイムアウト
↓
リセット
これによって、プログラムが停止したまま永久に放置されることを防ぎます。
タイムアウト時間はどう決める?
ウォッチドッグでは、どのくらい応答がなかったら異常と判断するかを決める必要があります。
この時間をタイムアウト時間として設定します。
タイムアウト時間が短すぎると、正常な処理に少し時間がかかっただけでも異常と判断してしまう可能性があります。
反対に長すぎると、本当にプログラムが停止しても復旧まで長時間待つことになります。
そのため、システムで正常時に最も時間がかかる処理や必要な復旧時間を考えて設定します。
通常のタイマーとウォッチドッグタイマーの違い
前回解説した通常のタイマーとウォッチドッグタイマーは、どちらも時間を扱いますが目的が異なります。
| 主な目的 | 使用例 | |
|---|---|---|
| 通常のタイマー | 時間計測や一定周期のイベント生成 | LED点滅、周期処理、時間計測 |
| ウォッチドッグタイマー | システムが正常に動作しているか監視 | フリーズ検出、異常時の復旧 |
通常のタイマーについては「タイマーとは?delay・millisとの違いとマイコンのタイマー割り込みを解説」で詳しく解説しています。
ウォッチドッグをキックすれば安心、ではない
ウォッチドッグを使うときに重要なのが、どこでウォッチドッグをリセットするかです。
たとえばプログラムのどこかで無条件にウォッチドッグをリセットし続けていると、システムの重要な処理が正常に動いていなくてもウォッチドッグが異常を検出できない場合があります。
ウォッチドッグは単に一定周期でキックすればよいのではなく、「正常に動作していることを確認できた場所でキックする」ことが重要です。
ウォッチドッグで何でも復旧できるわけではない
ウォッチドッグによるリセットは非常に便利ですが、すべての障害を解決できるわけではありません。
たとえば、再起動しても必ず同じソフトウェア不具合が発生する場合は、リセットを繰り返すだけになる可能性があります。
また、外部デバイス側が異常状態になっている場合、マイコンだけをリセットしても復旧できないことがあります。
そのため実際の製品では、ウォッチドッグだけに頼るのではなく、エラー処理、タイムアウト処理、ログ保存、再試行処理などと組み合わせてシステムを設計します。
リセットを繰り返す場合にも注意
異常の原因が解消されない場合、ウォッチドッグによる再起動後に同じ問題が発生し、再びウォッチドッグリセットされることがあります。
このような状態では、マイコンが再起動を繰り返すリセットループになる可能性があります。
製品では、起動回数やリセット原因を記録したり、一定回数以上異常が続いた場合に安全な状態へ移行したりする設計も検討します。
ESP32-C3にもウォッチドッグがある
KUMITATE-C3に搭載されているESP32-C3にも、システムの異常を検出するためのウォッチドッグ機能があります。
ESP32-C3では用途の異なるウォッチドッグが用意されており、ESP-IDFでは主にInterrupt Watchdog Timer(IWDT)やTask Watchdog Timer(TWDT)などが利用されます。
TWDTは、特定のタスクなどが長時間CPUを占有して、ほかの処理へ実行機会を渡せていない状態などを検出するために利用できます。
Arduino-ESP32でもESP-IDFの仕組みが内部で利用されているため、プログラムによってはウォッチドッグ関連のメッセージやリセットに遭遇することがあります。
KUMITATE-C3でWDTを学ぶときの考え方
ウォッチドッグの学習では、最初から複雑なAPIを覚えるよりも、まず次の動作を理解することが重要です。
- ウォッチドッグを開始する
- タイムアウト時間を設定する
- 正常動作中は定期的にリセットする
- わざとリセット処理を停止する
- タイムアウト時に何が起きるか確認する
実際にESP32-C3でウォッチドッグAPIを使用するときは、使用しているArduino-ESP32またはESP-IDFのバージョンに対応したAPIを確認してください。
ESP-IDFやArduino-ESP32ではバージョンによってウォッチドッグ関連APIの仕様が変わることがあるため、古いサンプルコードをそのまま使用するとビルドできない場合があります。
ウォッチドッグとタイムアウト処理の違い
通信などでは、ウォッチドッグとは別にタイムアウト処理を実装することも重要です。
たとえばサーバーから応答が来ない場合、マイコン全体をウォッチドッグで再起動する前に、通信処理だけを一定時間で中止して再試行できる場合があります。
| 主な目的 | |
|---|---|
| 処理のタイムアウト | 特定の処理が長時間終わらないことを防ぐ |
| ウォッチドッグ | システムやタスクが正常に動作しているか監視する |
まず個別の処理で異常から復帰できるようにし、それでもシステム全体が正常に動けなくなった場合の最後の復旧手段としてウォッチドッグを利用する、という設計も考えられます。
ハードウェアウォッチドッグとは?
システムによっては、マイコン内部のウォッチドッグだけでなく、外部の監視ICなどを使ってマイコンそのものを監視することもあります。
マイコンから一定周期で信号を出力し、その信号が来なくなった場合に外部回路からマイコンのリセット端子を制御する、といった構成です。
より高い信頼性が求められるシステムでは、ソフトウェアだけでなくハードウェア側からシステムを監視する考え方も重要になります。
ウォッチドッグを使うときの注意点
- タイムアウト時間を短くしすぎない
- 正常な長時間処理でもウォッチドッグを考慮する
- 意味なくウォッチドッグをリセットし続けない
- リセット後にシステムが安全な状態から再開できるようにする
- リセット原因を確認できる仕組みを検討する
- 再起動を繰り返すリセットループにも備える
- マイコンやSDKごとのWDT仕様を確認する
まとめ
ウォッチドッグタイマーは、マイコンやプログラムが正常に動作しているかを監視し、異常状態からの復旧に利用する重要な機能です。
- WDTはWatchdog Timerの略
- 正常動作中は一定時間以内にウォッチドッグをリセットする
- ウォッチドッグのリセットは「キック」「フィード」と呼ばれることがある
- 一定時間リセットされないとタイムアウトする
- タイムアウト時には設定に応じて割り込みやリセットなどが行われる
- 無限ループや処理停止などの異常検出に利用される
- 単に定期的にキックするだけでは正しい監視にならない場合がある
- ウォッチドッグだけですべての障害を復旧できるわけではない
ウォッチドッグを理解すると、組み込み機器を「正常に動かす」だけでなく、異常が起きたときにどうやって自力で復旧させるかという、実際の製品開発で重要な考え方が見えてきます。

