リセットで初期化されないRAMセクションを作りたいのですが、
プログラム宣言
#pragma section @@DATA IRAMunsigned char IRAMH[5];#pragma section @@DATA @@DATA
リンクディレクティブ宣言
MEMORY RAM : ( 0FDF00H, 001F10H )MEMORY IRAM : ( 0FFE10H, 000010H )MEMORY RAM_SADDR : ( 0FFE20H, 0001E0H )
として、コンパイルは通ったのですが、IRAMH配列が
FFE10Hに配置されていない。
何処がおかしいのでしょうか?
チョコです。
#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 の確率でパリティエラーが発生するということです。
ありがとうございました。