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

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

nakaiと申します。

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

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

開発環境:e2studio, gcc 

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

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

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

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

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

 

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

 

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

 

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

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

  • 皆様

    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様

    ご教示ありがとうございます。
    確認してみます。
  • 皆様

    報告が遅れて申し訳ございません。
    rodataをミラー領域内に格納させることで先週この問題は解決しました。
    ありがとうございました。