SH4A 7780 フラッシュROMへの消去/書込み

お世話になります。以下の内容について、ご教示のほど、お願い致します。

SH4A 7780 CPU に FlashRom が接続されているボードで、EtherNetのポートがあり、

データ送受信が出来ております。

実現したいことは、EtherNetで別のプログラムをデータ受信し、

FlashRomへの消去/書込みのプログラムを作成したいのです。

動作としては、

1.ボードの起動時はFlashRomからプログラムを読込み、CPU動作を開始する。

2.EtherNetポートが動作してデータ通信を開始する。

3.ボードとEtherNetで接続されたPCなどから、変更したいプログラムをデータ送信する。

4.ボードはデータ受信後DDRメモリなどFlashRomでは無い所でCPUのプログラムを動作する。

5.FlashRomを消去してデータ受信した新たなプログラムをFlashRomへ書込む。

6.FlashRomへ書込みが終了したら、WDTなどでボードを再起動させる。

7.ボードの再起動後は、FlashRomに書込まれた新たなプログラムでCPU動作を開始する

この様な事を実現したいのですが、上記4項のFlashRomではない場所でCPUのプログラムを

動作させるのが上手く行かない感じなのです。

XrossFinderでのデバックで、DDRメモリでプログラムを動作させると上手く動作する様なのです。

リリースプログラムで、flashRomからプログラムを動作させると、FalshRomの消去の動作は行われ

ますが、その後CPUがリセットされる様な感じでフリーズしてしまします。その後、ボードを再起動

させるとFalshRomの中身が消去されていてCPUが動作開始しません。

最初FlashRomから起動してCPUの動作が開始後に、DDRメモリなど別の場所でCPUのプログラムを

動作させる事が上手く出来れば、実現できるような気がしておりますが、アドバイスを頂けたら有難いです。

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

 

 

 

 

  • わわいです
    フラッシュメモリは消去、書き換えの動作中は読み出しすることはできません。
    なので、フラッシュ上でプログラムを実行させてフラッシュを書き換える操作をすると暴走します

    ということで、プログラム全体、(あるいはフラッシュ書き換えユニット)をRAM上に展開し、実行させるようにしないとダメです。

    ということで、これを実現させるためには
    ・プログラムはRAM上で実行させることを前提として構築する
    ・生成したプログラムデータをフラッシュの特定領域に書き込むようにする
    ・上のプログラムをRAM上に展開、実行させるための、フラッシュ上で実行するブートローダを用意する
    が必要となりますね

  • わわいさん
    Reply ありがとうございます。
    大変助かります。
    申し訳御座いません、更に詳細をご教示お願いしたいのですが、
    flashRomの消去/書込みプログラムをDDRのRAM上に展開しているつもりですが、
    実際はFlashRomで起動してCPU動作を開始してから、DDRのRAM上のプログラムに
    移行するための「ブートローダー」が上手く行かないと思っております。
    この様な動作をさせるための参考例などが有りましたら、ご教示程お願い致します。
  • わわいです
    ブートローダは、
    フラッシュ上に存在し、リセットエントリで、CPUのクロック設定、バス設定を行って、SDRAMをアクセスできるようにしなければなりません。
    ここで注意しなければならないのは、余計な初期設定まで行わないようにする、ということです。
    特に注意すべきは、キャッシュの設定で、慣れないうちはブートローダの段階ではキャッシュは有効にしないことです。
    また、割り込み関係もこの段階では有効にしないで、RAM上に展開したホンチャンのプログラム上でキャッシュ&割り込みを有効にするべきです。

    フラッシュの書き込みがうまくいかない、というのは、どこかでフラッシュのアクセスを行っている、ということですんで、よくコードを見直してください。
    特に、フラッシュ上の何らかのテーブルを参照している、とか、あるある例としては、割り込みベクタテーブルがフラッシュ上だった、とか割り込みルーチンがフラッシュ上にあった、というものがありますね
  • わわいです
    んで、慣れないうちは、ブートローダとホンチャンプログラムは、別のプロジェクトとして作成し、相互のアクセスは、ブートローダから、ホンチャンプログラムのエントリポイントへのジャンプだけに限定します。

    双方を一つのプロジェクトで作ろうとしてはいけません。

    #もちろん、そこらへんのことがわかるようになった上でなら、自由自在にできますね
  • わわいさん
    詳細なご教示ありがとうございます。

    >双方を一つのプロジェクトで作ろうとしてはいけません。

    この辺がよく理解できてませんでした。
    ・ブートローダは別のプロジェクトとして作成する
    ・相互のアクセスはブートローダから行う
    事について、もう少し勉強してみます。

    参考例となるドキュメントなどが有りましたらご教示頂けると有難いです。
  • わわいです
    一つのプロジェクトで、ここからから先はセクションを変えたから大丈夫、というわけにはなかなかなりません。
    果たして、そこで呼び出している関数はフラッシュかRAMかどっちに存在するのかわかっているでしょうか。
    また、も一つ大きな問題になるのが、標準ライブラリだったりします
    あなたが今使っているmemcpyとか、strlenとかの関数は、フラッシュ、RAM、どこに存在してるんでしょうか。
    ライブラリ関数が問題になるなら、使わなけりゃいいじゃない、ということになりますが、問題はそこにとどまりません。明示的にライブラリ関数を使わずとも、通常の代入、計算の過程で暗黙的にライブラリ関数が呼び出される場合があります

    それらをすべて、ブートローダ、プログラム双方で把握し、コントロールできると言うなら、一つのプロジェクトで構成することは可能です。
  • わわいさん
    詳細なご教示、色々とありがとうございます。
    プログラムを精査して再検討しております。
    単純な話では無い事が分かりましたので、ブートローダについてのやり方、
    および、
    プログラムがRAMなのか?FlashRomなのか?見極めております。
    FlashRomにアクセスしていない見極め方のポイントをご教示頂けたら有難いです。
  • わわいです
    >FlashRomにアクセスしていない見極め方のポイントをご教示頂けたら有難いです。
    リンカのオプションで、全シンボルリストを出し、各シンボルがどこに存在するのかをリストアップして、全ソースを精査するしかありません。
    また、幸運にもSHツールチェインでは最適化のオプションを操作することにより、ライブラリ関数をなしの設定にすることが実行できたので、標準関数、及びインラインを除くライブラリ関数の使用禁止を厳命することによりこれを実現させました。

    まあ、これだけの労力と縛りをかけるより、ブートローダとプログラムを別プロジェクトに分離するというだけでこの問題はすべて解決できるのですが。