異常検出とウォッチドック

正常稼働を維持するために、以下のタイミングで再接続・再起動が行われます。

入力待ちのタイムアウト

起動後にユーザーの入力を待機する状態になった場合は、無操作30秒でタイムアウトし再起動します。停電など不意な電源断が起きても、入力待ちのまま停止することはありません。

異常検出とウォッチドック

obnizOSは3段階で自身を監視しており、それぞれ異常を検知すると端末を再起動します。

監視 監視する内容 再起動までの時間
(1) ハードウェアWDT CPUが動き続けているか 約10秒(ESP32)、9秒(ESP32-C3、ESP32-C6)
(2) タスク監視(FreeRTOS) タスクや割り込みが固まっていないか 割り込みは300ミリ秒。タスクが固まった場合は(1)により再起動
(3) 通信監視 サーバーとの通信が続いているか オンライン中は3分、未接続時は10分

(1) ハードウェアWDT

チップに内蔵されたウォッチドッグタイマーです。ESP32では約10秒、ESP32-C3とESP32-C6では9秒の間feedingされないと、チップをリセットします。

obnizOSは専用のタスクから毎秒feedingしています。CPUが固まりfeedingが止まると、チップがリセットされます。

(2) タスク監視(FreeRTOS)

obnizOSはFreeRTOS上で動作しており、ESP-IDFのウォッチドッグがタスクや割り込みが固まっていないかを監視しています。

  • 割り込みが300ミリ秒以内に終わらない場合は、エラー(Panic)として停止し再起動します。
  • あるタスクがCPUを占有し続けてほかのタスクが動けなくなると、(1)をfeedingするタスクも止まります。その結果、ハードウェアWDTによりチップがリセットされます。

(3) 通信監視

一定時間サーバーとの通信がない場合、obnizOSはネットワークやモデムが固まったとみなし、Hang Detect. Rebooting...とログに出力して端末を再起動します。

状態 通信がない場合に再起動するまでの時間
オンライン(サーバーと接続中) 3分
未接続(オフライン、接続中、cloud.disconnect()で切断中) 10分
  • オンライン中は、サーバーからデータを受け取るたびにタイマーがリセットされるため、通常の動作でタイムアウトすることはありません。30秒間何も受信しないとobnizOSはpingを送り、30秒以内(セルラーでは120秒以内)に応答がなければ接続を閉じて再接続します。そのため、接続の切断はたいてい3分より前に検知されます。
  • Luaプラグインで意図的にオフラインを続ける場合は、少なくとも10分に1回wdt.feed()を呼んでタイマーをリセットしてください。ウォッチドッグをご覧ください。
  • このタイマーは、(1)をfeedingするタスクが確認しています。このタスクが止まった場合は(1)により再起動します。

外部MCU(obniz Board 1Y)

obniz Board 1Yでは外部MCUからの監視も行っており、必要があればESP32ごとリセットされます。

WDTによる再起動の後

端末は自動的に再起動するため、復旧のための手動の操作は必要ありません。

  • (1)ハードウェアWDT、または(2)のエラー(Panic)による再起動の後は、セーフモードで起動します。セーフモードではLuaプラグインを読み込まず、クラウドへの接続だけを試みます。セーフモードは次に再起動するまで続きます。obniz.jsから判定する方法と通常モードに戻す方法はセーフモードをご覧ください。
  • (3)通信監視による再起動は通常の再起動です。端末は通常モードで起動し、Luaプラグインも動作します。