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

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

nakaiと申します。

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

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

開発環境:e2studio, gcc 

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

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

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

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

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

 

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

 

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

 

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

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

Parents
  • 皆様 ご教示ありがとうございます。

    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 に格納され ミラー領域から外れています。
  • 皆様

    MAPでは

    .rodata 0x0000d4f8 0x412
           0x0000d4f8 . = ALIGN (0x2)

    となっており、0xD714H に書かれたデータがせっかくのミラー設定した領域に行かずに
    単純にFD714Hと頭にFがつくだけみたいです。

    ジャンプ先をミラー領域にいれるのはどうするのが正しい方法なのでしょうか?
    ご教示お願いいたします。
  • 皆様

    MAPでは

    .rodata 0x0000d4f8 0x412
           0x0000d4f8 . = ALIGN (0x2)

    となっており、0xD714H に書かれたデータがせっかくのミラー設定した領域に行かずに
    単純にFD714Hと頭にFがつくだけみたいです。

    ジャンプ先をミラー領域にいれるのはどうするのが正しい方法なのでしょうか?
    ご教示お願いいたします。
  • e2studio の最新版ではない 4.3.1.001 で C Project を新規作成、ターゲットにコードフラッシュが RL78/G13 としては現時点で最大容量の 512kB を持つ R5F100LL を選択し、下記のコードをビルドすると

    main.c:

    const char a[0x7fff] = {0};
    const char b[0x7fff] = {0};
    const char c[0x7fff] = {0};
    
    int main(void)
    {
    	void hoge(const void*, const void*, const void*);
    	hoge(a, b, c);
    }
    

    hoge.c:

    void hoge(const void* a, const void* b, const void* c)
    {
    	(void)a;
    	(void)b;
    	(void)c;
    }
    

    問題なくビルドが成功します。

    R5F100LL の Mirror 領域は F3000 ~ F7EFF の 19.75kB であり、それを通じてアクセスできるコードフラッシュの領域は 03000 ~ 07EFF となりますが、それらが配置される .rodata セクションの領域を .map ファイルで確認しても

    .rodata         0x00003000    0x17ffd
                    0x00003000                . = ALIGN (0x2)
     *(.rodata)
     .rodata        0x00003000    0x17ffd ./src/main.o
                    0x00003000                a
                    0x0000afff                b
                    0x00012ffe                c
     *(.rodata.*)
                    0x0001affd                _erodata = .
    

    決められた領域を超えて配置がされていることが確認できます。どうやらビルド時に e2stuidio が作成するリンカスクリプトに不具合か何かがあり、Mirror 領域の判定が上手く機能していない感じですね。

    対策としては、ビルドをする度に.map ファイルを確認し、Mirror 領域を超えていた場合には .rodata に配置されている定数データを  .frodata に移動させることでしょうか。

    ちなみに、e2studio は最新版が 5.3.0 となっているようで今回確認したものではありません。今回最新版では確認を行っておらず、最新版では既に修正されている可能性も考えられます。

  • 最新の e2studio 5.3.0.023 と GCC 4.9.2.201604-GNURL78 の組み合わせで確認してみましたが、ターゲット R5F100LL に上記のコードでやはりビルドは成功してしまいます。
    リンク時のリンカスクリプト *.gsi はビルド時に自動生成されるのでちょっと手が出せない感じですね。

  • 訂正:

    > リンク時のリンカスクリプト *.gsi はビルド時に自動生成されるのでちょっと手が出せない感じですね。

    Tool Settings のセクションの設定に「リンカー・スクリプトの上書き」という項目があり、自由にできそうな感じですね。
  • fujita様

    ご教示ありがとうございます。
    確認してみます。
Reply Children