CS+のメモリ表示についての質問

初めて投稿させていただきます もぐら と申します。

よろしくお願い致します。

RL78G13マイコンをE2シミュレータLiteを使用してCS+でデバッグを行っております。

CS+にてメモリ表示機能([表示]->[メモリ])を使ってコード・フラッシュメモリを確認してみたところ、

ベクタテーブルの0x00000番地がダウンロードしたmotファイルと異なるデータとなっておりました。

■ダウンロードしたmotファイルのデータ

 S1130000D800FFFF00000000000000000000000016

■CS+からメモリ表示機能を使用した時に表示されたデータ

 00000 | D0 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 00

また、プログラムで0x00000番地を直接リードしてみましたが、こちらもメモリ表示機能と同じく”0xD0”が取得されました。

そこで質問させていただきたいのですが、RL78G13マイコンのコード・フラッシュメモリはCS+からのメモリダンプや

プログラムからのリードでは確認することが出来ないのでしょうか?

また、リードするための設定や手順などありましたら教えていただけると幸いです。

  • チョコです。

    出力されたMAPファイルの.textfにGAP(コードがない部分)はないでしょうか。

    motファイルでGAP部分がどんな状態になっているかが気になります。

  • もぐら さん、こんにちは。NoMaYです。

    どうも説明と#defineとwhile条件(もしくは代入式)が一致していないように思います。

    > 0x01A0番地~0x0D53番地におきまして、

    #define D_ROM_CHK_STR 0x000001A0
    #define D_ROM_CHK_END 00000D54 ← (1) D53の間違いでは?

     

    chkadr  = (unsigned long)D_ROM_CHK_STR;
    endadr = (unsigned long)D_ROM_CHK_END;  ← (3) それとも、-1するのを忘れたとか?

    while( endadr >= chkadr ) ← (2) あるいは、こちらが > の間違いとか?
    {
        sumchk += (unsigned char)(*(__far unsigned char *)chkadr);
        chkadr++;
    }

     

  • チョコ様、NoMaY様
     
    お世話になっております。
    返事が遅くなってしまい
    大変申し訳ありません。
     
    MAPファイルの.textfセクションを確認しましたところ、コードが無い部分はありませんでした。
    また、motファイルにて.textfのアドレス範囲を確認したところ、全ての領域にデータが格納されておりました。
    NoMaY様からご指摘いただいた私の説明とプログラム内容の不一致についてですが、(1)の箇所を間違えておりました。
    正しくはご指摘の通り、D53となります。ご指摘いただき有難うございます。

     
    その後、.textfセクションのデータが不一致な箇所を探したところ、自作関数のプログラムコードの先頭番地
    (0x000003a2番地)であることが分かりました。
    0x000003a2番地をプログラムで1byteリードしたところ、motファイルやCS+のメモリ表示と異なる値が
    変数に格納されました。
     
     CS+のメモリ表示機能で表示されたデータ:0x30
     motファイルのデータ:0x30
     プログラムでリードした値:0xFF
     
    また、原因を探るために以下を試してみました。
     
    ①2byteリードに変更
      ⇒現象変わらず
     
    ②4byteリードに変更
      ⇒現象変わらず
     
    ③自作関数のプログラムコードの先頭アドレスを変更(0x000003a2番地から0x000003a0番地に変更)
      ⇒現象変わらず(0x000003a0番地にてデータ不一致が発生)
     
    ④コンパイルオプションの最適化レベルをデバッグ優先(-Onothing)に設定
      ⇒現象変わらず
     
    何度もお聞きして申し訳ありませんが、何か気づいたことなどありましたらご教示いただけると幸いです。
  • もぐら さん、こんにちは。NoMaYです。

    ひょっとしてその場所にブレークポイントを設定されていませんか?

    > CS+のメモリ表示機能で表示されたデータ:0x30
    > motファイルのデータ:0x30
    > プログラムでリードした値:0xFF

    これは、私が以前に書いた以下の件(正確にはそのシミュレータ版の事例)ではないかなぁ、という気がするのです。

    > あと、初学者さんへ伝えたいこととしては、ソフトウェアブレークポイントを設定するとフラッシュメモリの該当箇所の命令が(命令セット上は非公開の)ソフトウェアブレークポイント命令へとデバッガにより書き換えられます。ですので、その時にユーザプログラムで該当箇所を読むとMOTファイルとは異なる値が読めます。(デバッガのメモリウィンドウや逆アセンブルウィンドウではMOTファイルの値(書き換えられる前の値)が表示されます。)

  • NoMaY様

    お世話になっております。

    返信ありがとうございました。

      

    イベント表示ウィンドウで確認しましたところ、ブレークポイントは設定されていませんでしたが、過去にタイマ計測のイベントを設定したままとなったおりました。

    そのタイマ計測を全てはずした状態で、データ不一致が発生していたアドレスをプログラムでリードしたところ、motファイルと同じ値を読むことが出来ました。

    その後、.textfセクションのサムチェックを行い正常終了し、対象セクション全てのサムチェックも正常終了致しました。

    お陰様で解決することができました。ありがとうございます。

  • チョコ様、NoMaY様

    お二人のお陰で悩んでいた問題を解決することができました。

    また、今回の問題以外にも色々と学ばせていただきました。

    誠にありがとうございました。