イニシャル時のROMチェックは、起動時のアセンブラファイルに記述しました。
動作中のROMチェック処理は、メイン処理から呼び出します。
また、ROMチェックの実施タイミングは、10ms周期毎に行いますが、赤外線リモコン受信がないときに行うこととします。
動作中にROMチェックを実施するには、マイコン機能の汎用CRCを用いて行います。
メイン処理からROMチェックを呼び出す
「AppMain.c」のメイン処理にROMチェックを呼び出す処理を追加するのみです。
インクルードとして、CpuRomChk.hをインクルードします。
そして、AppMain関数では、受信完了フラグが未完了であるelse側の処理の中で、スリープ判定後にROMチェック処理を呼び出します。
#include "CpuRomChk.h" // ←新規追加
省略
void AppMain(void)
{
省略
if( u2s_AppMain_SleepCnt >= U2S_APPMAIN_SLEEP_TIMEUP ) /* スリープカウンタが30s経過した場合 */
{
G_DrTimerCtrl_Sleep(); /* タイマ制御スリープ処理 */
G_DrRcvCtrl_Sleep(); /* 赤外線リモコン受信スリープ処理 */
halt(); /* HALTモード移行 */
G_DrTimerCtrl_MainCycleStart(); /* メイン周期タイマ再開 */
}
/* ここから追加(ROMチェック呼び出し) */
G_CpuRomChk_Main();
メイン処理の修正は以上です。
動作中ROMチェック処理の処理内容
メイン処理から呼び出されたG_CpuRomChk_Main関数について解説します。
動作中のROMチェックは、マイコンの汎用CRC機能を使用します。
関連する制御レジスタは、CRCデータ・レジスタ(CRCD)と、CRC入力レジスタ(CRCIN)になります。
CRCデータ・レジスタ(CRCD)は、汎用CRCの演算結果を格納するレジスタです。
CRC入力レジスタ(CRCIN)は、汎用CRCのCRC計算する入力データをセットするレジスタです。
処理の流れとしては、最初にCRCデータ・レジスタ(CRCD)を0で初期化します。
ROM領域の1バイト分のデータを読み出し、CRC入力レジスタ(CRCIN)にデータをセットします。
1バイト毎にCRC入力レジスタ(CRCIN)にセットしていき、ROMチェック対象の領域をすべてセットしたら、1クロックの待ちを行って、汎用CRC演算結果が格納されているCRCデータ・レジスタ(CRCD)の値を読み出します。
あらかじめ汎用CRC計算した期待値と比較して、一致していたら、処理を終了し、不一致の場合は、無限ループを行い、ウォッチドッグタイマタイムアウトさせ、マイコンをリセットします。
動作中ROMチェック処理の実装
CpuRomChk.cに動作中ROMチェック処理を実装していきます。
#include "iodefine.h"
#include "CpuRomChk.h"
#define U2S_CPUROMCHK_RESULT_CLAR ((U2)(0x0000U)) /* CRCDクリア値 */
void G_CpuRomChk_Main( void )
{
U2 u2l_CrcResult;
U2 u2l_Count;
CRCD = U2S_CPUROMCHK_RESULT_CLAR;
/* 汎用CRC実行 */
for( u2l_Count = 32; u2l_Count < 50; u2l_Count++ )
{
CRCIN = *( __far U1 * )u2l_Count;
}
NOP();
u2l_CrcResult = CRCD;
if( u2l_CrcResult != *( __far U2 * )0x00C000 ) /* CRC演算結果が期待値と違う場合 */
{
DI();
while( 1 )
{
/* ウォッチドッグタイマリセット待ち */
}
}
else
{
return;
}
}
Cファイルについては、以上です。
あとは、メイン処理から呼び出されるので、ヘッダーファイルを用意します。
#ifndef CPUROMCHK_H
#define CPUROMCHK_H
#include "common.h"
extern void G_CpuRomChk_Main( void ); /* ROMチェック処理 */
#endif
ヘッダーファイルは、ROMチェック処理の関数プロトタイプ宣言のみです。
動作中ROMチェック処理の実装については、以上となります。