一つ前の 記事と 密接に関係するので珍しく続けて2個の記事を書きます。
一つ前の記事{設定の保存(EEPROM)}の話は、まだ比較的分かりやすかったと思います。
今回の記事はウォッチドッグとも関係してきます。
何らかの理由で、システムの動作がおかしくなった場合にも、出来る限り処理を続行させる必要のある状況もあります。
バグでソフトが止まったままになる事が最悪です。
言葉だけで書いても分かりにくいので、C言語のスケルトンを載せておきます。
//-----------------------------------------------------------------------------
void check_restore_ram() {
if( check_ram_status()) { // 保存されているRAMの状態が正しいかチェック
restore_ram();
} else {
clear_ram();
}
}
//-----------------------------------------------------------------------------
void save_ram() {
copy_dram_sram(); // 通常のRAMからバックアップ用のRAMにコピー
calc_set_check_val(); // バックアップメモリーの妥当性チェックデータを書き込み
}
//-----------------------------------------------------------------------------
void main() {
check_restore_ram();
loop(1) {
func1();
func2();
func3();
wdc_clear();
save_ram();
}
}
//-----------------------------------------------------------------------------
雰囲気を理解してもらうために出来る限りシンプルにしています。
かなり省略している部分もありますが、自分で理解して、省略している部分を補えないと
トラブルの元になりますので、頑張って理解して実装してください
特にclear_ram()の部分とスタートアップルーチンあたりはバッティングします。
スタートアップルーチンの定数設定の部分は時間を浪費するので、大胆にカットして
この部分で行うのがいいと思います。
システムのRAM容量しだいですが、複数世代のバックアップを世代管理して妥当性チェックで
OKだったものをなんとか使うと言う場合もあるようです。
当然ですが、妥当性チェックのデータ自身もバックアップRAMにおく必要があります。
妥当性チェックの値はチェックサムないしは、CRCにて計算して複数持っておき、不一致が発生した場合は、迷わず初期化するしかないと思います。
電圧低下検地のデバイスからの割り込みが発生した場合、
CPUの動作は不定状態になると仮定する必要があるので、
積極的にリセットを繰り返して、瞬間停電にも備えたほうがいいかもしれません。
割と大サービスで書いてはあるんですが、あまりに事細かに書きすぎても問題なので、これぐらいの
説明で理解できる方でないと厳しいです。
0 件のコメント:
コメントを投稿