若干の前段階の説明:
● マイコンの停止問題
静電気放電や雷からの誘導雷、電動機からのサージパルスなど多種多様な原因でマイコンを用いた製品、システムは
停止する事が有ります。
これは多くの場合、内蔵されているマイコン(CPU)が組込まれているソフトウェアの実行が正常にできなくなる事が
原因です。
● 暴走状態
この異常状態ではマイコンは止まって見える事が多いので、フリーズした、暴走している、デジ切れを起こしている、
と言われています。
ここではマイコンのCPUは設定された順番にソフトウェアを実行せず、と言ってもソフトウェアの実行が停止する訳では
ないので、ソフトウェアとして設定されていない所や順番を無視して実行する事から、何を実行しているか分からない
実行を継続している状態を指します。そこので、まとめて「暴走」として説明します。
製品やシステムが止まられては困るので対策は必須の事項です。
ところが厄介なのは、暴走しても何もしなくても元の正常な実行状態に、数パーセントですが、戻る場合もあります。
と言っても、これを頼りにはできないので何等かの対策が行われるのが普通です。
● 一般の対策
1: ウィッチドッグ・タイマー パッシブな暴走防止方法
この対策としては、ほとんどのワンチップ・マイコンに備えられている、ウォッチドッグ・タイマーによる対策が
一般的であり、普通、唯一の解決方法です。
このウォッチドッグ・タイマーによる方法とは、暴走時にはマイコンのソフトウェアが予定されている順番、順序での
実行がされない事を利用して、正常時には専用のタイマーが初期化されるのにたいして、暴走状態では初期化が
されない事を利用し、タイマーの時間が進み、設定されている時間になると全体をリセットするという対策です。
しかしマイコンが暴走していても、タイマーを初期化する事があります(割込み処理の場合、等)又、周辺回路の
応答待ち、他の要因でソフトウェアが永久ループしていて暴走している様に見える場合もあります。
こういった場合には、ウォッチドッグ・タイマーでは回復できません。
2: CPU自体の異常(Exception、Fault)検出機構
高級なCPUでは、多くの16ビット、32ビットのCPUでは、大体、似たエラー機能が有ります。8ビットの
マイコンでは、エラー検出機能は無いか、有っても一部に限定されます。
ARM社のCortexシリーズのCPUであれば、CPU自体に以下の異常検出機構が組み込まれています。
割込みで馴染のある、ベクター・テーブルに#1,リセット他と共に定義されています。
#3 ハードフォールト 適切なフォールト・ハンドラの無い全てのフォールト
#5 バス・フォールト データ、か、、命令へのアクセスの失敗
#6 用法フォールト 無効な命令、できない状態遷移
#7〜#10 予約(未定義)
♯13 予約(未定義)
他のCPUでは、スプリアス・インタラプト、バイト・アライメント・エラー、不法命令、という風に、細かく規定しているCPUも有ります。
これらのCPUの異常時の処理は、原則では、オペレーティング・システム(OS)が扱うべきものとされています。
しかし、ほとんどのOSでは、この様な異常に対応するベクターは、リセットと同じベクターとしています。
勿論、システムの設計者が、個々の異常に対して処理方法を作り、規定する事も可能となっています。
しかし、実際に、エラー処理ソフトを作り、OSに登録してエラー対策としている例は稀と思われます。
● デバッグされない暴走対策
マイコンの暴走が問題になっても、システムの開発現場では所要の機能の実現とデバッグに集中しているのが普通で、暴走はしないもの、として開発は進められます。
開発製品が完成に近づくとウォッチドッグ・タイマーを有効にしてみる程度で暴走に対するデバッグは不十分な場合が
ほとんどです。
これはウォッチドッグ・タイマーを有効を有効にしても、ソフトウェアの停止状態を作るのは難しいからです。
更に、他の原因としてデバッグ環境では、高電圧ノイズ等によりマイコンの暴走と同じ様な事を再現するのが困難な事も
あります。
● 暴走の種類
1)ICチップがラッチアップして過熱し、焼損して停止する
マイコンICのピンにマイナスのパルスが入り、マイコンICを仮想SCR(サイリスタ)にして、電源からGNDへ無制限の電流を流す。この電流によりマイコンICのICチップが過熱して動作不良となり、更に、継続するとICチップのシリコンが熔融して焼損する。
→ 対策は、電源を数十マイクロ秒異常遮断する事のみです
2)CPUが予定されているソフトウェアの実行の順序から外れる
CPUが実行すべき命令語を指定するプログラム・カウンタ(PC)と言われる、命令語のアドレスを指定するレジスタの値
が異常となり、予定された順序での命令語の実行ができず、PCが出せるアドレスの不定な箇所のデータを実行する。
ROM(プログラムを格納するメモリ)の何かを読み出すか、ROMの範囲外の不定データを読出して実行する。
この状態では、データを命令語として実行したり、バスがオープン状態の不定状態をデータとして読み、これを
命令語として実行する。
ソフトウェアとしては順序が無視されているので無意味なものとなるが何か?を連続して実行している。動いているのが、
無意味なので、「暴走」という言葉が使われている。
3)周辺回路(I/O)の設定が壊れて、正常な実行に必要なデータが得られずループする
周辺回路の設定が外来ノイズにて変更されてしまい、予定の機能を果たさなくなる事は多々あります。
周辺回路は基板上で他のICや回路と接続していたり、センサーへの配線が長かったりしてノイズが入り易いので
多くの症例があります。
ADCを設定して、アクセルべダルの位置を読んでいるのに、ノイズによりADCがGPIOに変化すると、実際のアクセル・
ペダルの位置に無関係にフル・スロットルになるでしょう。
モーター用のHブリッジがHブリッジの設定がクリアされれば、モーターを廻せません。
通信ポートにノイズが入ると、ボーレートがデフォルトに戻り全ての受信がエラーとなり、通信が完了しないので
完了待ちで停止している様に見える事もあります。
4)RAM上のフラグが壊れて解消するのに数年、数ヶ月かかるループに陥る
C言語では、フラグのコントロールを、flag++で設定、flag--でクリア、としている例が有ります。この方法ですと、ノイズでflagの値が、0でも1でもなくなると異常になります。このフラグを、1からゼロに戻そうとしても、100万回もこのループ
に掛かります。もし1ループ、1mSなら、1000時間掛かりますから、暴走して停止している事と区別が付きません。
フラグの処理は、可能なら、intではなく、bitかboolianを使うか、セットを、flag==1、クリアを、flag==0、として記述しましょう。
なお、このケースは、余程上手くソフトを組まないと、ウォッチドッグが効果の無いケースです。
5)RAM上のデータが壊れて無限ループに入る
RAMに置かれているデータが壊れる頻度は低いものです。これは、マイコンICにノイズが入って来ても、RAMが
アクティブで無いと、つまり、CSが有効になっていないと変化しないからです。
しかし、CPUがRAMへの書込みを行っているタイミングでノイズが入ると、RAMのデータは壊れます。特に多いのは、
割込みが有ってCPUのレジスタをRAM上のスタックに退避している時です。
これはCPUからRAMへの書込みが連続するからです。
この場合の対処方法は、安全に停止させてから、システムの初期化をするしか有りません。
6)DMAの設定が変化してRAMの所要のデータを塗りつぶす
通信用のポートからデータをRAMにDMAで転送している場合に多いエラーです。通信ポートは外部への配線が
長いので、これがノイズへのアンテナになり、DMAの設定を変化させる事も有ります。
これが起きると、DMAですから、RAMを塗りつぶします。必要なデータが失われるので、リセットによる
初期化しか対処方法が有りません。
7)CPUがダブル・フォールトといったシステム・エラーで静止している
Motorola 社の68シリーズ、ARM社のCortexリーズ氏には、CPU Haltが有ります。OSのスーパバイザのモード
(特権状態)で、システム・エラーが2度、連続すると、CPU は一切の活動を停止して静止します。
この機能は、システムの大きなエラーに対して、メモリ・ダンプといったエラー解析の手段を与えるためのものです。
この対処は、リセットしか有りません。
実は、当、リバイブ・システムでもウォッチドッグが必要な理由が、このCPU-Haltの解消のためとなっています。
● リセットの問題
システムにより、リセットは危険を伴います。
以下は、私の実体験です。半導体のウェファ―の加工肯定で薬液を表面に均一に塗布するための装置、スピナーが有ります。
薬液の雫がスポイトから離れると、ウェファ―の表面に接するタイミングでウェファ―を回転させて薬液を広げます。
数秒で、静止状態から20,000RPM、秒間で350回転以上の高速回転へとサーボ・モーターで直線的に加速します。
この装置の開発をしていた時に、2万RPMでサーボ・モーターが回転している時に、回転が不安定だとして同僚が
リセット・スイッチを押しました。
CPUも、PWMモジュールもリセットされ、サーボ・モーターは瞬停しました。ダンとメカから大きな音がしたはずです。
しかし、この音は、サーボ・モーターから電源に戻された回生電流により電源装置の大きなケミコン、4個が耐圧オーバーで
爆発した音より隠されました。部屋は向かいの壁が見えない位、噴出した煙が十万していました。
よく消防車が来なかったものです。
この様に、システムにより、リセットしてはならない機器も有ります。この様なシステムでは手動停止は、NMIといった
割込みから起動して、モーター類はスローダウンさせる必要があります。
そして、ウォッチドッグがPWMモジュールをリセットしてしまうなら、ウォッチドッグは危険です。使えません。
この様なシステムで異常検出をするなら、当、リバイブ・システムが有効です。