コードフラッシュ領域のあるアドレスを参照しているのにミラー領域を参照している?

こんにちは。

題目のとおり、コードフラッシュ領域のアドレス(例として0x01000番地)の値を参照していますが、0x01000番地に格納されている値ではなく、0xF1000番地の値を参照してしまっており、なぜこうなるのか悩んでおります。

 

マニュアルを見ていると、0x00000~0x05FFFのコードフラッシュ領域を0xF0000~0xFFFFFにミラーさせていて、ミラー先を参照することで短いコードで読出しを行えるとのことです。

このミラーしていることが関係していそうな気もするのですが、、、どうなのでしょうか。

 

①この機能はミラー先を参照するものであり、ミラー元(0x00000~0x05FFFF)を参照しても特に支障はないという認識なのですが、間違っているでしょうか。

②添付画像のように、0x01000番地の値を読みたいのに、0xF1000番地の値が読めてしまう原因は何が考えられるでしょうか。

 

よろしくお願いします。。。

  • 添付画像が分かりにくいため補足します。

  • > 0x01000番地の値を読みたいのに、0xF1000番地の値が読めてしまう原因は何が考えられるでしょうか。

    nearポインタでアクセスしてるからですね。
  • > マニュアルを見ていると、0x00000~0x05FFFのコードフラッシュ領域を0xF0000~0xFFFFFにミラーさせていて、

    Mirror領域は0xF0000〜0xFFFFFの一部だけだぞ
  • fujita nozomuさん

    ありがとうございます。

    もともとfar指定していたのですが、添付画像のようにindexポインタ変数のアドレス値が範囲外に設定されてしまい、nearにしておりました。

    コードフラッシュ領域にアクセスするときはfar指定するのが原則ということなのでしょうか。

  • > コードフラッシュ領域にアクセスするときはfar指定するのが原則ということなのでしょうか。

    使用頻度の高いデータを優先して Mirror 領域を通じてアクセスできるアドレスに配置し短いコードで読み出しするのが理想的です。面倒であれば far アクセスで統一しても良いと思います。
  • 添付画像のように、__far指定したポインタ変数indexにアドレス0x00001000を与えています。
    index変数をウォッチすると0xfb001000と、明らかにおかしなアドレスを示しています。ウォッチしたときは0x00001000となっているかと思ったのですが、記述に誤りがあるのでしょうか。
  • > index変数をウォッチすると0xfb001000と、明らかにおかしなアドレスを示しています。

    ターゲットに使用されてるマイコンと使用されてるツール、書かれてるコード内容が不明ですが、1例を挙げると CC-RL の far ポインタの最上位 8bit は不定値となります。
  • チョコです。
    ほとんどが,fujitaさんとダブりますが,一部原因のネタバレを書いておきます。
    >①この機能はミラー先を参照するものであり、ミラー元(0x00000~0x05FFFF)を参照しても特に支障はないという認識なのですが、間違っているでしょうか。
    参照している記述の下にある例を見ると明確にF1000~F1FFFはデータフラッシュ領域であり,ミラー領域ではありません。ミラー領域はF2000~FEEFFとかいてありますよ。
    以前,ルネサスの人にクレームをつけたときに,「0000H-0FFFFHをF0000H-FFFFFHへミラー」という記述は,全てのRL78で共通に使っている考え方だけを示している共通の文言であり。個々のデバイスのマニュアルには,その下のメモリマップに具体的なアドレスが書いてあるので,間違えることはないと言い切ってましたけど。

    >②添付画像のように、0x01000番地の値を読みたいのに、0xF1000番地の値が読めてしまう原因は何が考えられるでしょうか。
    0x01000番地はミラー領域ではないので,単にnearで0x1000をアクセスしたから0xF1000の値(データフラッシュの値)が読めただけです。どうしても0x1000読みたければ,farでアクセスすべきです。