Renesas Synergy™

FAQ 1006640 : ウォッチドッグ・タイマの基本

(1)はじめに

日頃使用しているパソコンでは、何らかの原因で動作がおかしくなった(指定した動作以外を繰り返す、黙り込んでしまい何の操作も受け付けない等)場合には「暴走した」または「フリーズした」として立ち上げ直すのは経験があるかと思います。使用者はパソコンが何をやっているかをある程度理解しており、異常を検知でき、対策を行うことができるからこのような処理が可能な訳です。

それでは、マイコンが通常使われている組み込み分野のアプリケーションではどうでしょうか。使用するのは一般の人です。マイコンが使われていることも知らない可能性があります。何か異常を感じたら、コンセントから電源コードを引き抜くようなことはあるかも知れませんが、常に監視している訳ではありませんし、的確な判断や処理ができるとは期待できません。

その一方で、アプリケーション・プログラムはどんどん大きくかつ複雑になっています。そのため、設計者も全体を理解するのは困難になってきています。そのために、プログラムに何らかの対策を盛り込むのは無理(対策を考えるよりは、プログラムそのものの完成度を上げるのが先)でしょう。プログラムのみでの対策ができないとなると、なんらかのハードウェアの助けを借りる必要があります。
プログラムが異常動作をしていないかを監視するハードウェアの代表的なものに「ウォッチドッグ・タイマ」(番犬機能)があります。

(2) ウォッチドッグ・タイマとは
ウォッチドッグ・タイマ(以下WDTと呼ぶ)はプログラムが異常動作していないかを監視する番犬の機能を果たすものですが、その実体は、監視対象であるプログラムからはクリアすることはできるが、止めることができない単なるタイマです。このタイマはオーバフローすると、WDT割り込みを発生したり、リセットをかけたりします。
通常は、オーバフローしないように定期的にクリアすることでWDT割り込みやリセットを発生させないようにします。これは、下記のように対応させると分かりやすいと思います。このように、WDTは他の機能と違って、動作させない(吠えさせない)ようにするのが正常な使い方になります。



(3) WDTの構成と動作(概要)
WDTタイマはクリアできるがとめられない(フリーランの)タイマで、起動すると指定されたクロックをひたすらカウントし続けます。イメージとしては下図のようになります。あふれる(オーバフロー)までの時間は水滴(カウントクロック)の頻度(周波数)で決まります。水滴を溜めていき(カウントして)、あふれる(オーバフロー)前に底をあけて水を捨て(クリア)れば、なにも起こりません。もし、水を捨てるのを忘れるか、間に合わなかった場合にはあふれて(オーバフロー)しまい、爆弾のスイッチが押される(リセットがかかる)ことになります。これで、プログラムの異常検出ができます。



(4) WDTの使い方の概要
WDTは、プログラムが正常に動作しているときには、その中で、クリア処理を定期的に行うことで、WDTが動作しない(番犬が吠えない)ようにします。



(5) WDTの限界
プログラムの暴走等異常な状態になったときには、WDTのクリア処理が定期的にできなくなります。そのため、WDTがオーバフローして、WDT割り込みが発生するかリセットがかかる(番犬が吠える)ので、異常を検出することができます。しかし、プログラムが異常になってもWDTが定期的にクリアされていれば、異常を検出することができません。



これは、どこでWDTをクリアしても構わないためで、マンガに出てくるダメな番犬が侵入者から肉をもらって吠えるどころか尻尾を振っているのと似たようなものです。WDTも決して万能ではありません。
また、一部のマイコンに内蔵されたWDTは初期状態では停止していて(寝たままで)、プログラムの中で起動しないと(起こさないと)、機能しない(番犬の役割を果たさない)ものもあります。

(6) 現状のWDT
上ではWDTの限界について説明しましたが、最近のマイコンに内蔵されたWDTではこれらが改善されて、利口になってきています。

・特定のデータパターンを書き込まないとクリアできず、違う値を書くとリセット
(いつものエサ以外を与えると、逆に噛み付く)

・クリアできるタイミングが制限されていて、それ以外で書き込むとリセット
(空腹でないときにエサをやると噛み付く)

・止められない専用クロックを使い、最初から起動している
(いつも起きていて見張っている)

と言ったところが主な改良点で、今後も改良が進むと思われます。

(7) WDT使用上の注意点
WDTを使う上で一番の注意点はオーバフローまでの時間をどうするかと、どのタイミングでクリアするかの問題です。オーバフローまでの時間を短くすると、頻繁にクリアする必要があり、システムとしての制約が増えてきます(番犬が直ぐに空腹になるようだと、頻繁にエサをあげないといけないので、遠くまで出かけられない)。
クリアするタイミングをぎりぎりまでにしてしまうと、カウントクロックの変動のようなハードウェアの変動要因やプログラムの処理内容による実行時間の変動や非同期で発生する割り込み等のソフトウェア処理の変動要因により間に合わなくなることがあります。これらを考慮して、最悪の場合でもオーバフローしないように設計する必要があります。
また、スタンバイのようにCPUが止まっているときにWDTがどうなるのかの検討も必要です。
なお、よくある間違いが、「WDTのクリアが目的になってしまっているケース」です。そのために、タイマ割り込みの中でWDTをクリアするといった安易な処理を行うケースが見受けられます(エサをやるのが面倒で、番犬が空腹で吠えないように自動給仕機でエサをやるようなものです)。これはまさに本末転倒です。

(8) WDTのまとめ
WDTは完全なものではありませんし、使いこなすためにはプログラム全体の動きを理解する必要がありますが、その動作と限界を理解すれば、プログラムの異常検出手段として使える機能です。

他にご質問がございましたら、リクエストを送信してください