リセットで初期化されないRAMセクション

リセットで初期化されないRAMセクションを作りたいのですが、

プログラム宣言

#pragma section @@DATA IRAM
unsigned char IRAMH[5];
#pragma section @@DATA @@DATA

リンクディレクティブ宣言

MEMORY RAM : ( 0FDF00H, 001F10H )
MEMORY IRAM : ( 0FFE10H, 000010H )
MEMORY RAM_SADDR : ( 0FFE20H, 0001E0H )

として、コンパイルは通ったのですが、IRAMH配列が

FFE10Hに配置されていない。

何処がおかしいのでしょうか?

Parents
  • チョコです。

    #pragma section では、セクション名をIRAMに変更し、

    リンクディレクティブのMEMORY IRAM で領域名を設定しただけです。

    このセクショ名と領域名に関係はありません。

    セクションを特定の領域に配置するには、リンクディレクティブの

    セグメント配置宣言を行う必要があります。

    リンクディレクティブでは、(MEMORY IRAMはなくして、)以下のように

    セグメント配置を宣言するだけで、IRAMセクションはFFE10Hに配置できる

    はずですが。

    MERGE IRAM : AT ( 0FFE10H )

  • > リセットで初期化されないRAMセクション

    RAMパリティ・エラー検出機能に注意ですね。

  • チョコさんありがとうございます。解決しました。

    RAMパリティエラーについては、「使用するRAM領域の先頭+10バイト」でなければ

    問題ないですよね。

  • > RAMパリティエラーについては、「使用するRAM領域の先頭+10バイト」でなければ問題ないですよね。

    『RL78/G13 ユーザーズマニュアル ハードウェア編』 114頁

    > RAMパリティ・エラー・リセット発生を許可(RPERDIS = 0)で使用する場合, データ・アクセス時は「使用するRAM領域」を,RAM領域からの命令実行時は 「使用するRAM領域+10バイト」の領域を必ず初期化してください。

    「使用するRAM領域+10バイト」はRAM領域からの命令実行時の話で、恐らくは命令プリフェッチによる読み込みでパリティエラーが発生するのを避けるための注意であると思います。

    データ・アクセス時は「使用するRAM領域」とある通り使用する全域です。「リセットで初期化されないRAMセクション」を何かに利用するのであればそれは含まれます。

  • なるほど、初期化されないから、見た目データが正常であっても、

    パリティビットが変わっているかもという認識で良いですか?

    RAMパリティ・エラー・リセット発生を許可しなければ問題無いですよね。

  • チョコです。

    このようなRAM(データ領域)を使用する場合には、最初にRPERDISビットを1に

    設定して、パリティエラーでのリセットを禁止します。

    その状態で、リードとリードした値の書き戻しを行うことで、パリティビットを初期化

    できます。

    必要な分のRAMの処理が完了したら、RPERDISビットを0に戻してください。

    これで、RAMの値は自由にアクセスできます。

  • チョコさん。

    リセット時はRPERDISは必ず1ですか?

    不正メモリ・アクセス検出機能設定とはまた違うのですか?

    あとカテゴリ違いでスレ立ててましたすみません。

  • チョコです。

    RPERDIS=1は、初期化していないRAMをアクセスしても

    パリティエラーでのリセットを発生させないためです。

    リセット時に必ずやっても構いません。

    RAMパリティ・エラーでのリセットは不正メモリ・アクセス検出

    とは別の機能です。(ノイズ等でのRAMのデータこけを検出する

    ためにパリティ・ビットが付加されています。)

  • > 初期化されないから、見た目データが正常であっても、パリティビットが変わっているかもという認識で良いですか?

    起動後未初期化の RAM の内容はパリティも含めてランダムな値になっているので、1バイトを読み出すだけで 1/2 の確率でパリティエラーが発生するということです。

  • ありがとうございました。

  • R8Cの話かと思っていた。

Reply Children
No Data