同一のソースプログラム群, RL78/G13-100LEAFBでは正常動作 ,RL78/G13-100LLAFBでは誤動作

はじめて投稿いたします。

nakaiと申します。

試作で汎用基板(RL78/G13-100LEAFB)で開発したプログラムを、試作基板RL78/G13-100LLAFBで

動作させたところ、誤動作してしまいます。

開発環境:e2studio, gcc 

同一のソースプログラム群をビルドしデバッガ(E1)経由で動作させたところ

現象としてはプログラムの飛び先がおかしくなります。

例えば、関数のあるアドレスを静的にテーブル化して

関数コールした場合にあらぬところにジャンプします。

見てみると、そもそもテーブルに正しい飛び先が格納されていません。

 

汎用基板と試作基板にI/Oデバイスは違いますが、I/Oデバイスアクセスの以前のところで

 

トラぶっているようです。

 

この様な現象で解決の糸口がつかめていません。

チェックする項目をご教示頂きたく、お願い致します。

  • > 例えば、関数のあるアドレスを静的にテーブル化して
    > 関数コールした場合にあらぬところにジャンプします。
    > 見てみると、そもそもテーブルに正しい飛び先が格納されていません。

    RL78版の gcc では、10000H 以降に配置された関数については 00000~0FFFF 内にその関数へのジャンプを行うエントリを用意して16bit の関数ポインタで 20bit のアドレス内に配置された関数を指すことを実現してますが、その点を勘違いされてるのではないでしょうか。
  • ご教示ありがとうございます。
    今のところ16ビット HEXの4ケタに収まっていますが、いずれ超えると思います。
    超えた場合はチョコ様の前の投稿のRL78のミラー領域についてを参考にさせていただきます。
  • ソースコードをもう一度チェックした方が良いのでは?
    曖昧なところがあってもそれなりにコンパイルして動作してしまうのがC言語の良いところでもあり悪いところでもあります。
  • > ビルドはやり直しています。

    ビルドやり直し後に生成されたマップファイルで

    • .rodata
    • .text
    • .bss
    • .data

    以上の各セクションが適切に配置されてるかを確認すべきと思います。

  • それ以前の話として、

    > 開発環境:e2studio, gcc 

    RL78用として配布されてる gcc はいまだ嵌りどころも多いので注意が必要です。ターゲットが RL78/G13 だからといって `-mcpu=g13 -mmul=g13' を指定したりすると泣きを見る羽目となります。コンパイルオプションの指定は出力されるコードの確認も十分に行った上で慎重にされることをお勧めします。というか個人的には RL78 をターゲットとした業務目的の用途では gcc の使用はお勧めしません。
  • 皆様 ご教示ありがとうございます。

    RL78/G13-100LEAFB のプロジェクトも、RL78/G13-100LLAFB のプロジェクトもマップは
    CPUの設定は変えていますが同じでした。

    プログラム容量は64kを超えていません。

    とび先がおかしくなるアドレスは0FD8F2Hで0272Hと書かれなければいけないはずが223AHと書かれています。

    気になったのは、データが化けないRL78/G13-100LEAFBでは0FD8F2Hがミラー領域(0F2000H~FEEFFH)内ですが
    データが化けるRL78/G13-100LLAFBではミラー領域(F3000H~F7EFFH)外であることです。

    プログラムではミラー領域を意識せずに作成し、CPUの設定をすれば勝手にマッピングされるものだと
    考えていたのですが間違っているのでしょうか?

    ご教示お願いいたします。
  • チョコです。
    >とび先がおかしくなるアドレスは0FD8F2Hで0272Hと書かれなければいけないはずが223AHと書かれています。
    ここは,明らかにメモリ空間が異なる部分ですね。このアドレスをどのように定義し,参照しているかが気になる
    ところです。
  • チョコ様 皆様
    e2 studioはプロジェクト設定のデバイス名を変更してもセクションの
    配置アドレスを自動的に付け直すことはなく、セクションのメモリー領域の設定を
    以下に変更するようにアドバイスをいただきました。

    開始アドレス   終了アドレス
    VEC   0x00000       0x00003
    IVEC  0x00004 0x000BF
    OPT 0x000C0 0x000C3
    SEC_ID 0x000C4 0x000CD
    OCDSTAS 0x000CE 0x000D7
    OCDROM 0x000D8 0x7FFFF
    ROM 0x000D8 0x7FDFF
    MIRROR 0xF3000 0xF7EFE
    RAM 0xF7F00 0xFFEFE

    しかしながら、まだ、ジャンプ先をミラー領域外の0x0FD8F2Hに書き込み
    データ化けしています。

    上記以外にも設定が必要なのでしょうか?

    ご教示お願いいたします。
  • > しかしながら、まだ、ジャンプ先をミラー領域外の0x0FD8F2Hに書き込み
    データ化けしています。

    ビルド時に生成される .map ファイルの

    > Memory Configuration
    >
    > Name Origin Length Attributes
    > VEC 0x00000000 0x00000004
    > IVEC 0x00000004 0x000000bc
    > OPT 0x000000c0 0x00000004
    > SEC_ID 0x000000c4 0x0000000a
    > OCDSTAD 0x000000ce 0x0000000a
    > OCDROM 0x0007fe00 0x00000200
    > ROM 0x000000d8 0x0007fd28
    > MIRROR 0x000f3000 0x00004eff
    > RAM 0x000f7f00 0x00007fff
    > *default* 0x00000000 0xffffffff

    等の結果はどうなってますか?
  • fujita様 皆様

    mapファイルは新しい設定が反映されています。
    以下に示します。

    Name Origin Length Attributes
    VEC 0x00000000 0x00000004
    IVEC 0x00000004 0x000000bc
    OPT 0x000000c0 0x00000004
    SEC_ID 0x000000c4 0x0000000a
    OCDSTAD 0x000000ce 0x0000000a
    OCDROM 0x0007fe00 0x00000200
    ROM 0x000000d8 0x0007fd28
    MIRROR 0x000f3000 0x00004eff
    RAM 0x000f7f00 0x00007fff
    *default* 0x00000000 0xffffffff

    しかしながら、化けているジャンプ先が格納されるアドレスはROMでは0xD714Hに
    RAMでは0xFD714H に格納され ミラー領域から外れています。