内蔵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へのアクセス関連のレジスタ??)
ひろちゃんパパさん、こんにちは。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 INPUTSECTION 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);』 を実行すると、デバッガ(マイコン?)が暴走し、停止できなくなります。 どこで暴走しているのかをステップ実行で追って行った結果が、最初の質問の際に記載させて頂いた箇所になります。 (そもそも、デバッガのマニュアルでは、セルフプログラミング中、ステップイン/ステップアウトの実行は禁止されているようですので、ステップ実行での確認結果を信じてよいものかどうか、という点もありますが。。。) その他、確認すべき事項が御座いましたら、ご教示頂けますと幸いです。 以上、よろしくお願い致します。
ひろちゃんパパさん、こんにちは。NoMaYです。デバッグ時特有の問題か、そうでなくても暴走しているのか、その切り分け方として、素朴にLEDのOn/Offで確認してみるのはどうでしょうか?(どれかのポートにLEDを繋いで。)
LED消灯 FlashInit(); __DI(); FlashEnv(1); FlashEnv(0); __EI(); LED点灯 for(;;);
それで、これで暴走するとなると、スタックオーバフローとか、そういうのも気になります。あと、上記コードと共にRAM上にコピーしたセルフプログラミングライブラリのコードが、他の箇所のプログラムの不具合によって、破壊されてしまってないかとか、そういう可能性も気になります。