● プログラムの暴走

Q: マイコンのI/O機能の中に、ウォッチドッグ・タイマという変わった名前のものがあるのを見つけたのですが、これはいったい何ですか?

A: ウォッチドッグ・タイマ(watchdog timer)というのは、万一プログラムが暴走したときに、プログラムを終了させるための特別な機能をもったタイマです。名前が長いので、略してWDTと書くこともあります。watchdogとは、「番犬」とか「監視人」という意味の英語です。プログラムが暴走していないかを、いつも見張っていてくれることから、このような名前になりました。

Q: プログラムの暴走って、よく聞きますが、どういうことですか?

A: コンピュータは、与えられたプログラムを指定された順番通りに実行するのが仕事です。表示器にデータを出力したり、スイッチなどの状態を入力したりするのも、プログラムが順番通り動いていなければできません。プログラムの動作が誤って不正な無限ループに入ってしまうと、操作も何も受け付けない状態になり、元に戻らなくなることがあります。これを暴走と呼んでいます。

Q: 変な動作が続いて、元に戻らないのが暴走ということですか?

A: そうですね。一瞬誤動作してすぐに正常に戻る場合や、操作によって正常に戻せる場合は暴走とは言わないのが普通です。

変な動作が続くといっても、プログラムが暴走したときの症状はいろいろです。パソコンでは、表示が全く変わらなくなり、操作も一切受け付けなくなってしまうのが典型的な暴走の症状です。コンピュータが止まってしまったように見えるのでフリーズとも呼ばれますが、内部では不正な無限ループに入ってしまっていることが多いのです。

組み込み機器では、内部のマイコンが暴走すると機器そのものが制御不能になります。たとえば、ロボットが止まらずに動き続けたり、ヒータの通電が止まらなくなって過熱するなど、危険な状態になる可能性があるので、暴走を監視して確実に終了させるウォッチドッグ・タイマがよく用いられています。

Q: どうして暴走が起こるのですか?

A: 暴走の原因もいろいろありますが、大別すればプログラムのミスによるものか、ノイズなどによる一時的な誤動作がきっかけで暴走するものがあります。

プログラムのミスとしては、たとえば、スイッチの入力値やシリアル通信の受信値の想定範囲を間違えていて、特定の値が来たときに不正な番地にジャンプして暴走してしまうとか、絶対に来ない値を待って無限ループしてしまうような見つけにくいものもあります。

Q: 暴走を止めるには、どうしたらよいのですか。

A: 暴走が起きてしまったら、基本的にはシステムをリセットして、初期状態からプログラムを再実行します。リセットをかけるとRAMにあるデータは消えてしまうので、救出可能なデータを保存してからリセットをかける方法も用いられています。ただし、暴走が起きているときは、RAMにあるデータも誤って書き換えられている可能性があるので、その点は注意が必要です。

 

● ウォッチドッグ・タイマによる暴走検出の原理

Q: ウォッチドッグ・タイマは、どうやって暴走を検出するのですか?

A: 厳密にいうと、ウォッチドッグ・タイマは暴走の発生を検出するわけではありません。プログラムが正常な動作をしていない時間がある程度続いたら、そこで強制的にシステムをリセットしてしまおうという仕組みです。

もう少し詳しく言うと、ウォッチドッグ・タイマそのものは、コンピュータに内蔵されたハードウェアのタイマです。ウォッチドッグ・タイマに所定の値Tをセットして、タイマを起動すると、タイマは0からTまで自動的にカウントアップ(または、Tから0まで自動的にカウントダウン)します。そして、終了値に達すると、自動的にシステムをリセットするか、NMIと呼ばれる特別の割り込みを発生します。

このままだと、システムは一定時間後に強制リセットされてしまって、動作を続けられません。そこで、ウォッチドッグ・タイマを起動したら、終了値に達する前に必ずウォッチドッグ・タイマをクリアするように、プログラムを作ります。基本的には、プログラムをループ構造にして、周期的にウォッチドッグ・タイマをクリアすることが多いですね。

 

図 ウォッチドッグ・タイマ

Q: ややこしいのですね。

A: プログラムを作るのは、初めてだとちょっと難しいですね。でも、ループ処理やタイマ処理のやり方を知っていれば、簡単なプログラムで書けますよ。

ウォッチドッグ・タイマが広く使われているのは、システムのハードウェアがとても単純にできるからです。あるマイコンがプログラムを正しく実行しているかをきちんと監視しようとすると、もう1つか2つ別のマイコンが必要になったり、マイコン同士を連携させる仕組みが必要になったり、とても大がかりになってしまいます。

ソフトウェアの方も、ウォッチドッグ・タイマが終了値に達しないように、それよりも短い周期でウォッチドッグ・タイマをクリアするルーチンを組み込むだけなので、実行時に生じるオーバヘッド(余分に加わる時間)もごくわずかです。

簡単なわりに、暴走を確実に検出できる信頼性も大きな利点です。

信頼性が要求される組み込み用マイコンでは、大部分の製品がウォッチドッグ・タイマを内蔵しています。たとえば、テキサス・インスツルメンツ(TI)のMSP430™ ファミリでは、標準機能としてウォッチドッグ・タイマを内蔵しています。

Q: ウォッチドッグ・タイマを使うには、どんなところに注意が必要ですか?

A: プログラムが正常に動作している間、終了値に達する前に必ずウォッチドッグ・タイマをクリアすることと、このクリアはプログラムで行わなければいけない、という2つがあります。

プログラムの中で、周期的にウォッチドッグ・タイマをクリアするようにしていても、何かの処理に時間がかかってしまってクリアが間に合わないことがあれば、暴走していなくてもシステムがリセットされてしまいます。その点で、1つ1つの処理時間をきちんと管理できる組み込みシステムではウォッチドッグ・タイマを使えますが、もともと処理時間のことをあまり考えていないシステムではウォッチドッグ・タイマは使えません。

また、周期的クリアはハードウェアのタイマを使えば簡単にできますが、そうするとプログラムが暴走してもハードウェアが自動的にウォッチドッグ・タイマをクリアしてしまうので、暴走検出になりません。同様に、タイマ割り込みでクリアするのも危険です。単純なソフトウェアループでクリアする必要があります。

なお、先ほど例にあげたMSP430マイコンを初めて使う人には、もう1つ注意があります。

Q: どんな注意ですか?

A: MSP430マイコンは、ウォッチドッグ・タイマを内蔵しているだけでなく、パワーオン時やリセット後には自動的にウォッチドッグ・タイマが起動されます。そのため、ウォッチドッグ・タイマを使わない場合は、プログラムの最初でウォッチドッグ・タイマを停止する必要があります。それを知らないと、一定周期でリセットを繰り返してしまうので、マイコンが壊れていると思ってしまうことがあります。

MSP430マイコンは、計測機器、制御機器に多く使われてきた高信頼性のマイコンです。遠隔地で無人で動作するようなシステムでは、プログラムの暴走を確実に検出するために、常にウォッチドッグ・タイマが確実に働いていることが大事です。そのために、パワーオン時やリセット後に自動的に起動するようにしているのです。

※CapTIvate、MSP430およびMSP432はTexas Instruments Incorporatedの商標です。その他すべての商標および登録商標はそれぞれの所有者に帰属します。

*ご質問は E2E 日本語コミュニティにお願い致します。

Anonymous