止まらないマイコンの実現方法
マイコン(MCU)は容易に止まってしまうものであり、止まってしまうことは止めようが無い。ここから考えます。止まってしまうなら、止まれば直ぐに再起動すればよい。再起動するにはリセットを掛けるしかない。リセットは究極の再起動方法です。
ウォッチドッグ
リセットを掛けるために、通常ウォッチドッグ・タイマーと呼ばれる一種のタイマー回路が採用されています。このタイマーをソフトウェアで初期化し、このタイマーがタイムアップしない様にします。もし、タイムアップすれば、それはソフトウェアに異常があったということですから、このタイマーはリセットを行いシステムを初期化します。
しかし、この方法では都合の悪いことが幾つか知られています。その一つはウォッチドッグ・タイマーが検出できない、動作していない場合があることです。ウォッチドッグ・タイマーがあるのにマイコンは暴走し、外からみて何もせず初期化も行われない場合が多々あると知られています。
また、ウォッチドッグ・タイマーが動作してシステム全体を初期化すると、RAMに有る重要なデーターが失われたり、入出力も初期化されることにより外部へ異常な状態を作ったりします。
過去技術
これらの問題を解決するのが高レジリエンス・マイコンです。
必要条件
先ず、この技術を適用できるマイコンには条件があります。それはリセットの信号が最低、2系統となっていてCPUコアのみにリセットが行える事です。更に、このリセットの直前に、最高優先度の割込みがかけられる事も必要な条件です。このハードウェアの条件をクリアしているマイコンは多くはありません。このサイトの「製品」に紹介しているマイコンは、これらの条件を満たしているマイコンです。
この様なマイコンのブロック図を示します。外部からも掛けられる、システム・リセット、と緑色の部分からCPUに与えられるリセットとリセットは2系統となっています。
ソフトウェア
ハードウェアに加え、ソフトウェアも必要です。先ず最高優先度の割込み用のソフトウェアですが、この割込みが開始されてからリセットが来る迄の時間はハードウェアで決まっています。従って、この部分のソフトウェアは最大の実行時間を考慮して作る必要があります。この実行時間に関しては、ノイズにより最高優先度の割込みが更に起きる事も想定します。つまり、この割込み処理はリセット迄の時間に関して多重化した場合を考慮して余裕が必要です。
ソフトウェアのプロトコル
- 割込み処理の最初に行う事は、割込みへ移る以前のソフトが暴走していないか?のチェックです。PCの値は妥当か?、スタックは予定した範囲に有るか?をチェックするとほとんどの暴走は検出できます。
- 暴走していない、と判定したら、現在のCPUの内部情報を全てスタックに移し、更に、この内容をRAM中の2ヶ所にコピーしておきます。これはこの処理以降に暴走する事を想定しています。
- 全ての退避が終われば、退避正常のフラグを立てて、何もしないでリセットが起きるのを待機します。
- リセットが来ると、先ず、RAMが正常に初期化されているか?このチェックで電源投入、ないし、レベル4の異常をチェックします。電源投入、レベル4、と判定すれば初期化を行います。
- 次ぎに、退避正常、のフラグをチェックします。フラグが正常であれば暴走していない事になりますので、この最高優先度の割込みから退避してある元のスタックの内容を用いて、元のプログラムへと「割込みからの復帰」として戻ります。通常、割込みの発生から復帰迄の時間は数%の低い方です。
- 又、この復帰処理の前に、リアルタイム割込み、としての処理を行う事も可能ですし、周辺回路の部分再設定を行うのはFUJIMIの要件の一つとなっています。ERR)リセットの処理で、RAMの状態は正常、しかし、退避正常、のフラグが無い場合は、どこかでマイコンは暴走していた事になります。
この場合は、「レジリエンス」性を発揮して、プログラマーがフェールセーフでも、アプリケーション・ループの先頭へでも、指定しておいた復帰点へでも、移行してプログラムの実行を継続します。この概要をフローチャートに示します。