C言語

動作中ROMチェック処理の実装

イニシャル時の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チェック処理の実装については、以上となります。

-C言語