V850 セルフプログラミングに関して

内蔵ROMの書き換えを行いたいので、
フラッシュ・メモリ・セルフ・プログラミン・ライブラリを使いたいのですが、
FlashEnv(1);のところで、暴走し、ライブラリを使うことができません。
使い方に間違いがあるのでしょうか?

【実験環境】
 CS+ for CA,CX V4.04
 MINICUBE2
 V850ES/FJ3(uPD70F3380)
 SelfLibV850 Type04 V1.20
【参照資料】
 U17819JJ7V0UM00
 フラッシュ・メモリ・セルフ・プログラミング・ライブラリ ユーザーズ・マニュアル
 -----------------
 FlashInit();
 __DI();
 FlashEnv(1);
 __EI();
----------------
ちなみに、ステップ実行したとき、下記のようになります。
===================================================
_SelfLib_BasFct_WriteSecReg:
     581a           add             -0x8, sp
     63a70100    st.w            r20, 0x0[sp]
     63af0500     st.w            r21, 0x4[sp]
     28a0           not             r8, r20
     20aea500     movea           0xa5, r0, r21      ←ここでBreakを貼ってGo実行すると、暴走する。
     47af0000     st.b            r21, 0x0[r7]           ←ここで暴走している模様。
     46470000    st.b            r8, 0x0[r6]
     46a70000    st.b            r20, 0x0[r6]
     46470000    st.b            r8, 0x0[r6]
     23a70100    ld.w            0x0[sp], r20
     23af0500     ld.w            0x4[sp], r21
     481a           add             0x8, sp
     7f00            jmp             [lp]
===================================================
なお、上記赤字箇所を実行時、r7、r6は以下の値を示しています。
   r6 : ffff f8d4  (実質、03ff f8d4)
   r7 : ffff f8d0  (実質、03ff f8d0)
   ⇒何れも内蔵I/Oレジスタの配置領域ですが、
      ユーザーズマニュアル ハードウェア編には記載がありません。
      (内蔵FLASHへのアクセス関連のレジスタ??)

Parents
  • ひろちゃんパパさん、こんにちは。NoMaYと申します。

    記憶が定かでは無いですけど、MINICUBE2では、内蔵フラッシュメモリセルフプログラミングのデバッグに関して、制約があったと思うのです。以下のようなことがあったような気がします。(JTAGデバッグ方式のMINICUBEだともっと出来るけれど、ROMモニタ方式のMINICUBE2だと結構な制約があったような気がします。)

    (1) ROMの最初のリセットエントリを含むブロックを消去してはいけない
    (2) ROMの最後の予約領域(2Kバイトだったかな?)を含むブロックを消去してはいけない
    (3) FlashEnv(1);~FlashEnv(0);ではブレーク出来ない(上記予約領域にアクセス出来なくなるからだったかな?)

    なので、試しに以下のようにしてみるとどうなりますでしょうか?

    ケース1(まずとりあえずの確認として)

        FlashInit();
        __DI();
        FlashEnv(1);
        FlashEnv(0);
        __EI();
        __NOP(); ← この記述が出来たか記憶が定かでは無いですが、ここにブレークポイントをセットしてブレークするか?

    ケース2(もう少し現実的なデバッグの確認として)

        FlashInit();
        __DI();
        FlashEnv(1);
        フラッシュブロックブランクチェックの処理(結果は変数に代入して以下のブレーク後にウォッチウィンドウで確認)
        FlashEnv(0);
        __EI();
        __NOP(); ← この記述が出来たか記憶が定かでは無いですが、ここにブレークポイントをセットしてブレークするか?

    とか、どうなりますでしょうか?

  • NoMayさん

    ご回答ありがとうございます。

    ご指摘の通り、MINICUBE2でのセルフプログラミングのデバッグに関しては、ユーザーズマニュアルにも注意事項が記載されておりました。
    その点に関しては、対応しているつもりではあるのですが、再度、設定を確認致します。
    参考までに、マップファイルの内容を下記に示します。

    =======================================
    OUTPUT  INPUT  VIRTUAL  SIZE  INPUT
    SECTION  SECTION  ADDRESS    FILE

    RESET          0x00000000 0x00000008
      RESET        0x00000000 0x00000008 Debug Build\crte.o
     ~ 省略 ~
    MonitorROM     0x0007f800 0x00000800
      MonitorROM   0x0007f800 0x00000800 Debug Build\inttab.o
    =======================================

    なお、E1のUART方式で接続した場合も同様の現象が発生することを確認しております。
    こちらもJTAGデバッグ方式での接続ではないため、同様の制限があると思われるため、マニュアルを再度確認致します。

    また、ご提案頂いたデバッグ方法に関してですが、
    既に確認をしておりまして、『FlashEnv(1);』 を実行すると、デバッガ(マイコン?)が暴走し、停止できなくなります。
    どこで暴走しているのかをステップ実行で追って行った結果が、最初の質問の際に記載させて頂いた箇所になります。
    (そもそも、デバッガのマニュアルでは、セルフプログラミング中、ステップイン/ステップアウトの実行は禁止されているようですので、ステップ実行での確認結果を信じてよいものかどうか、という点もありますが。。。)

    その他、確認すべき事項が御座いましたら、ご教示頂けますと幸いです。

    以上、よろしくお願い致します。

Reply
  • NoMayさん

    ご回答ありがとうございます。

    ご指摘の通り、MINICUBE2でのセルフプログラミングのデバッグに関しては、ユーザーズマニュアルにも注意事項が記載されておりました。
    その点に関しては、対応しているつもりではあるのですが、再度、設定を確認致します。
    参考までに、マップファイルの内容を下記に示します。

    =======================================
    OUTPUT  INPUT  VIRTUAL  SIZE  INPUT
    SECTION  SECTION  ADDRESS    FILE

    RESET          0x00000000 0x00000008
      RESET        0x00000000 0x00000008 Debug Build\crte.o
     ~ 省略 ~
    MonitorROM     0x0007f800 0x00000800
      MonitorROM   0x0007f800 0x00000800 Debug Build\inttab.o
    =======================================

    なお、E1のUART方式で接続した場合も同様の現象が発生することを確認しております。
    こちらもJTAGデバッグ方式での接続ではないため、同様の制限があると思われるため、マニュアルを再度確認致します。

    また、ご提案頂いたデバッグ方法に関してですが、
    既に確認をしておりまして、『FlashEnv(1);』 を実行すると、デバッガ(マイコン?)が暴走し、停止できなくなります。
    どこで暴走しているのかをステップ実行で追って行った結果が、最初の質問の際に記載させて頂いた箇所になります。
    (そもそも、デバッガのマニュアルでは、セルフプログラミング中、ステップイン/ステップアウトの実行は禁止されているようですので、ステップ実行での確認結果を信じてよいものかどうか、という点もありますが。。。)

    その他、確認すべき事項が御座いましたら、ご教示頂けますと幸いです。

    以上、よろしくお願い致します。

Children
  • ひろちゃんパパさん、こんにちは。NoMaYです。

    デバッグ時特有の問題か、そうでなくても暴走しているのか、その切り分け方として、素朴にLEDのOn/Offで確認してみるのはどうでしょうか?(どれかのポートにLEDを繋いで。)

        LED消灯
        FlashInit();
        __DI();
        FlashEnv(1);
        FlashEnv(0);
        __EI();
        LED点灯
        for(;;);

    それで、これで暴走するとなると、スタックオーバフローとか、そういうのも気になります。あと、上記コードと共にRAM上にコピーしたセルフプログラミングライブラリのコードが、他の箇所のプログラムの不具合によって、破壊されてしまってないかとか、そういう可能性も気になります。

  • NoMaYさん

    こんにちは、ひろちゃんパパです。
    上記件、ご教示ありがとうございます。

    ケース1に対して、改めてブレーク位置を見直して実行すると正しく動作しました。

    FlashInit();
    __DI();
    FlashEnv(1);
    FlashEnv(0);
    __EI();
    __NOP(); ← ブレーク(これ以前のブレークは全て無効にする)

    その後、ケース2のように、FlashEnv(1);~FlashEnv(0); の間に
    セルフプログラミングライブラリの関数を呼び出した際、
    またもや途中で暴走する現象が発生しましたが、
    こちらは、ローカル変数を全てグローバル変数へ変更することにより、解決しました。
    (ローカル変数により、セルフプログラミングライブラリの配置領域が破壊されていた?)

    何はともあれ、無事FLMD0端子チェックやフラッシュメモリの消去は確認出来ましたので、
    引き続き、書き込み等の実装を行っていきます。

    色々ご教示頂き、ありがとうございました。

    以上です。