RAMチェックの方法について

RAMチェックの方法について教えてください。

CPUはRX66Tを使用しています。

過去の例を元にRAMチェックを実装しようとしています。

https://community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rl78/f/forum18/5217/ram

スタートアップルーチンの中に _INITSCT というRAMの初期化を行う関数があるので、

この関数の前にRAMチェックを行おうと考えています。

方法としては0xAA、0x55の書き込みと読み出しを行い、値が一致することです。

この時、一致しなければエラーを外部変数に記録し、メイン関数の開始後、RAMエラーが発生していると

LEDに表示させようと考えてました。

実際は _INITSCT でRAMが初期化されて、エラー検出の外部変数も0になってしまい、上手くいきません。

初期化が終わった後にRAMチェックでエラーが起こっていたのを知るにはどのようにすればよいでしょうか。

  • エラーを記録する変数を個別のbssセクションに定義する方法があり得ます。

    _INITSCTは、デフォルトのbssセクションに対する初期化を行うもので、ユーザセクションを定義してそこにエラー記録用の変数を配置すれば可能です。

    RAMチェックの意味で言うと、エラー記録用の変数もチェック対象になることになりますことを考慮する必要があると思います。

  • 他には、初期化あり変数として定義することで、0初期化されないようにすることもできます。

    以下のようにすれば、_INISCTで、0初期化対象外にすることもできます(BSSではなくDセクションに配置される)。

    unsigned char ercd = 1;

    この場合でも、前述通りエラー記録用の変数もチェック対象になることになりますことを考慮する必要があります。

    さらに、

    _INISCTの初期化がRAMチェックの妨げになるようであれば、_INITSCT後にRAMチェックし、もう一度_INITSCTを

    呼び出すということも方法としてはありですが、2重初期化となりますので、起動速度への影響等考えるとあまりお勧めはしません。

  • わわいです

    こういう場合、セクション名を指定してその外部変数を定義します

    そして、そのセクションのアドレスを初期化するエリアから外れるように決め打ちで指定するようにします

    #たとえば、RAMの終端位置、とかスタックエリアの直前の位置とか

    メモリチェックのコードからはそのアドレスで結果を書き込むことになります

    #ましかし、メモリエラーが起きたときのこと、を考えるとその後のコード実行が信用できなくなるのをどうするのかって問題がありますが。

  • donkey さん わわいさん

    ご回答ありがとうございます。

    セクションを初期化されないよう別に設定して、そこのアドレスを使用すれば良いのが分かりました。

    丁寧に教えて頂きありがとうございます。

  • RX66Tは、メインメモリ(128K or 64k)の他に、ECCメモリ(16k)があります。

    00FF_C000H~に適当なセクション名(Becc_ram,Decc_ramなど)を割り付けて

    (初期値なしの変数はBecc_ram, 初期値有りの変数はDecc_ramに割り当てられる)

    #pragrma section ecc_ram

    //チェックに使用するワーク変数定義

    int i; //など

    #pragma section

    とやると、ワーク変数は0~1FFFFH(128kBの場合)とは別領域に確保されますので、メインメモリの全領域に書き込んでも問題ありません。

  • ちなみにですが、_INITSCTより前にRAMチェックを行いたいんですよね?

    RXは起動後は、オプションメモリを設定していない場合は、LOCO(遅いクロック)で立ち上がります。その後の、HardwareSetup()とかで(どこに書くかは自由ですが)、一般的にはICLK=160MHzに切り替えて使う事となるかと思います。メモリチェックですが、最大動作周波数か実使用周波数でチェックをしたくなる、って事はないでしょうか。(クロック設定の後、main関数の頭とかでチェックするというのではダメなのでしょうか。)

  • tfさん

    遅くなって申し訳ありません。

    ご回答ありがとうございます。

    確かにECCRAMの領域も一時的な退避場所として使えそうです。

    main関数の先頭でチェックしてしまうと、初期化付き変数を元にもどないといけないと思い、_INITSCTの前で実行するようにしました。

    確かにクロック前のチェックだと低速内部クロックなので時間はかかりますが、初期化の時間が許容できる範囲だったので、問題なしとしました。

  • LOCO(240kHz)でのチェックでは、時間が掛かるという事がいいたかった訳ではありませんでした。LOCOでチェックしてもアドレス線のスタック不良などは検出できるでしょう。でも、それはマイコンチップ出荷時の検査でチェックされているので、あえて起動時にやる意味があるのかと思っています。

    半導体チップにおいても経年劣化(摩耗故障)というのがあり、代表的なのはホットキャリアでトランジスタのVth(しきい値)の変動や電流の減少が起こります。素子の劣化が進むと、まずはAC特性が変動します。その場合、高速動作時(ICLK=160MHz)は、RAMアクセス時不具合がでるが、低速では不具合が出ないという事が考えられます。

    (アプリケーションでRAM不良で動作が異常になった→「起動時にRAMチェックはやっています!(…240kHzで)」:実使用状態とテスト条件に差がある状態となってしまっている)

    「起動時にRAMチェックを行う目的は?」というのが、気になった点です。