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

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

nakaiと申します。

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

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

開発環境:e2studio, gcc 

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

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

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

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

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

 

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

 

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

 

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

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

  • わわいです
    関数テーブルの飛び先がおかしいってことですが、コードや定数領域などのセクション配置がどうなってるかをチェックしてみましょう。
    存在しないメモリ領域に配置してるとかROM領域に変数領域が割り当たってるとか、そもそのセクション割当されてなかったりとか、初心者あるあるネタもりだくさんだったりします。
  • >わわい様

    ご教示ありがとうございます。
    確認してみます。
  • RL78/G13-100LEAFBでは正常動作

    RL78/G13-100LLAFBでは誤動作

    コード・フラッシュ・メモリ容量が 64kB の R5F100LEAF と 512kB の R5F100LLAFB では、データ・フラッシュ・メモリや Mirror 領域の開始/終了アドレスが全然違います。詳しくは『RL78/G13 ユーザーズマニュアル ハードウェア編』に掲載されてるメモリ・マップを参照してください。

  • >fujita nozomu様

    ありがとうございます。
    十分注意したつもりですが、確認してみます。
  • >fujita nozomu様

    ありがとうございます。
    十分注意したつもりですが、確認してみます。
  • チョコです。
    同じプログラムということですが,ビルドだけはやり直したのでしょうか?
    ビルド結果のHEXファイルをそのまま使わないで,ビルドだけをやり直せば,
    ミラー領域(固定値に使用)はデバイスに合わせてくれるはずです。

    その場合に注意するのは,プログラムが64kを超えてしまったかどうかです。

    100LEは64Kなので,16ビットでアドレスできますが,100LLは16ビットでは

    指定できなくなります。ミラー領域のアドレスが0x2000から0x3000に変わり,

    コードもその分後ろにずれることになり,64kを超えてしまい,16ビットで表せなく

    なっている可能性は無いでしょうか。

  • >チョコ様
    ありがとうございます。
    ビルドはやり直しています。
    プログラム容量は64kに近づいていますが64kは超えていません。
    ただ、16ビットで表せなくなっているということに着目したことがなかったので
    参考になりました。
  • >チョコ様
    追伸です。
    もし、64kを超えた場合、どのような処理すべきでしょうか?
    ご教示お願いいたします。
  • >チョコ様
    追伸です。
    もし、64kを超えた場合、どのような処理すべきでしょうか?
    ご教示お願いいたします。
  • チョコです。
    MAPファイルをみると,プログラムがどのような配置になっているかが分かるので,まずは,MAPファイルを
    確認してください。
    64kを超えた場合に注意すべき点は,関数テーブルの中身がlong(32ビット)になっているかです。64kに
    収まっていれば,20ビットアドレスの上位4ビットは固定なので,下位16ビットで指定可能ですが,64kの
    境界を超えるとできません。