はじめて投稿いたします。
nakaiと申します。
試作で汎用基板(RL78/G13-100LEAFB)で開発したプログラムを、試作基板RL78/G13-100LLAFBで
動作させたところ、誤動作してしまいます。
開発環境:e2studio, gcc
同一のソースプログラム群をビルドしデバッガ(E1)経由で動作させたところ
現象としてはプログラムの飛び先がおかしくなります。
例えば、関数のあるアドレスを静的にテーブル化して
関数コールした場合にあらぬところにジャンプします。
見てみると、そもそもテーブルに正しい飛び先が格納されていません。
汎用基板と試作基板にI/Oデバイスは違いますが、I/Oデバイスアクセスの以前のところで
トラぶっているようです。
この様な現象で解決の糸口がつかめていません。
チェックする項目をご教示頂きたく、お願い致します。
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 はビルド時に自動生成されるのでちょっと手が出せない感じですね。