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+からのメモリダンプや

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

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

Parents
  • チョコ様、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)に設定
      ⇒現象変わらず
     
    何度もお聞きして申し訳ありませんが、何か気づいたことなどありましたらご教示いただけると幸いです。
Reply
  • チョコ様、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)に設定
      ⇒現象変わらず
     
    何度もお聞きして申し訳ありませんが、何か気づいたことなどありましたらご教示いただけると幸いです。
Children
  • もぐら さん、こんにちは。NoMaYです。

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

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

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

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