マイコンのプログラムが壊れていないか判断するために、電源投入時にチェックサム(CRC)を確認する事があります。プログラムをビルドする際に作成したチェックサムと、マイコン起動時にマイコンで計算したチェックサムを比較します。
次の資料を参考にしています。資料1*1、資料2*2、資料3*3
ビルド時のCRC
・CRCの作成
CRCは、CRC-16-CCITT, MSB-First, 初期値 0xffff, 反転出力、生成多項式はです。作成されたCRCをROMの先頭番地(0xffc 0000)に置くことにします。CRCの計算範囲を0xfffc 0100~0xffff ff7f としました。
・CRCの記入とセグメント配置
ビルド時のCRCを記載するソースコード(rom_crc_data.c)を作成します。
またこのコードが、0xfffc 0000から配置されるように、リンク・オプションのセクション開始アドレスを設定します。(本テスト用のセクション設定ファイル *.hsi のインポートでも可能です。)
・ビルド
ビルド後CRC値が表示されます。( 図2の -VERBOSE=CRC )
この値を、rom_crc_data.cへ転記します。
mapファイルで指定したアドレスに割り付いている事を確認します。
マイコンによるCRC計算
CRC演算器を使用します。CRC-16-CCITT, MSB-First, 初期値 0xffff, 生成多項式は 演算器によるCRC計算後、値を反転させています。
確認テスト
エミュレータ(E2-Lite)デバックします。CS+よりE2-Liteでダウロードすると、0xffff ff88~0xffff ff8bにあるオプション機能選択レジスタ1(OFS1) のb24が強制的に0となります。(資料3より) デバックツールと接続中は、b24=0が継続しているようです。 このため、CRCの計算には、0xffff ff80~0xffff ffffは含めていません。
rom_crc_dataが正常値ならばアラームは点滅しません。正常値以外を書き込んで実行すると、ALM1が点滅しました。
・CS+バージョン:
CS+ for CC V8.09.00 [12 Dec 2022]
ファイル一覧
GitHub登録場所: https://github.com/vABCWork/test_rom_crc
補足 (可変ベクタ空き領域のアドレス設定)
割り込み処理(int_prg.c)で未定義の処理 があります。例えばvect=1~15は定義されていません。
「リンク・オプション」で、可変ベクタ空き領域のアドレスを設定すると、未定義箇所にアドレス(処理プログラムの先頭アドレス)を登録できます。
mapファイルにより、ベクタテーブルのベクタ番号に実行アドレスが登録されているのがわかります。またテーブルの配置アドレスも確認できます。
E2-Liteで実行させると、割り込みテーブルレジスタ(INTB)に割り込みベクタ先頭アドレスが入っています。そのテーブルの内容を見ると、割り込み処理プログラムの先頭アドレスが登録されています。
これに対して可変ベクタ空き領域のアドレス設定 を空欄とした場合、ベクタテーブルのベクタ番号に実行アドレスは登録されません。登録されていない箇所には0x0000 0000が入ります。
この場合、もしCPUが誤動作してvect番号=1 が実行されると、PC(プログラムカウンタ)は0000 0000となり、0000 0000にある命令語、初期化されてないRAMの値が命令語として実行される可能性があります。
本テストでは、未登録アドレスは全て_Excep_BRKとして、ベクタ番号0の処理と同じにしています。
修正(2023年5月23日)
Githubに登録していある int_prg.c で、vect=199とvect=200の処理内容が dma.cで定義と記入してありますが、本内容ではdma.cはありません。下記のように修正します。
修正後のチェックサムは異なります。