RX210 固定ベクタの割り込み処理関数、標準ライブラリの移動

初めて投稿いたします。 ふんと申します。

RX210を使用した製品でフィールドでのファームウェア書き換え機能が必要になり、USBメモリやSDカード等を使用したROM書き換えを開発中です。 開発環境にはHEW,ROM書き換えにはルネサス提供のフラッシュAPIを使用し、PDGも使用しています。

フラッシュAPIのROM消去単位は2Kバイトなのですが、0xffffff80番地にはエンディアン指定レジスタがあり、ビッグエンディアンで開発してきているので、ここを含む領域が消去できません。  そのため固定ベクタのExcep_PrivilegedInst、Excep_UndefinedInst、Interrupt_NMI の内容を 0xfffff800に移動し、エンディアンレジスタ・固定ベクタと固定ベクタの処理関数を含むブロック0は消去しないようにして、ブロック255からブロック1までを消去・書き込みするようにしてみました。     Excep_PrivilegedInst、Excep_UndefinedInst、Interrupt_NMI はPDGが生成するInterupt_INTC.cファイルの内容をそのままにして、0xfffff800以降の番地に割り付けてあります。

これで動作しているように見えますが、このような方法をとって問題ないでしょうか?

もう一つ、消去・書き込みをするのにフラッシュAPI自身が使用する標準ライブラリがあるらしくて、これらを消去すると動作しないので、P領域にある標準ライブラリは全て 初期化時ROMからRAMへコピーするセクションに移しました。(_INITSCTは別)

このような方法も問題ないものでしょうか?

ROM書き換えは初めて行うので、不安になりお伺いする次第です。

  • わわいです
    RXでのフラッシュメモリ書き換えには、ブートモードで起動してからのフラッシュ書き換えとなると思いますが、ブートモードで起動した段階でフラッシュメモリは全消去となります
    お使いのフラッシュ書き込みツールが何かわかりませんが、今一度、その書き換え不可のエリアのデータチェックをしたほうがいいかと思われます。
    そこが意図したデータのままだというのであれば、それでOKだとは思われますが。

    フラッシュメモリの操作中(消去なり書き込みなり)は、フラッシュのデータは読み込み不可となりますんで、そーゆー操作をするルーチンはRAMで実行する必要があります
  • わわい様
    ブートモードではなく、動作中に何らかのきっかけ(現在は外部との通信内容)で、RAMにコピーした自分自身のプログラムにより、モトローラSファイルを書き込んでおいたメディアを読み込みながらROMを書き込みます。 もちろん最初はE1エミュレータにより書き込んでおります。 ユーザーブート領域も使っておりません。
    フラッシュAPIと標準ライブラリをRAMにコピーするのに苦労しましたが、現在は何とかRAM上でメディア読み込み・ROM消去・書き込みが動作しているとは思います。
    PDGをいったん使うと、PDGを使わない場合とは固定ベクタの内容が変わるようですね。 NMIも特に使ってないので、PDGが生成した固定ベクタの処理内容をそのまま書き換えない領域に移したのですが..
  • わわいです
    諸事情によりプログラムをRAM上で走らせるというのはそんなに珍しいことでもないですが、、

    RX630のFITのフラッシュ操作ユニットは内部のフラッシュ操作コードをRAMにコピーしてそこで実行するように作ってあり、このユニット自体はふつーにROM上に配置して実行できるようになってますが、RX210のそこら辺のユニットはそうなってないんでしょうか?
  • こんにちは。
    circleです。

    使用方法としては問題ないのではないかと考えられます。
    また、わわいさんのおっしゃっているように
    フラッシュAPIはフラッシュ操作の処理をRAMへコピーして
    使用するようになっていたのではないかと思います。
    (ユーザガイドに記載があったように思います。ROMtoRAM)

    > PDGをいったん使うと、PDGを使わない場合とは固定ベクタの内容が変わるようですね。 NMIも特に使ってないの
    > で、PDGが生成した固定ベクタの処理内容をそのまま書き換えない領域に移したのですが..

    こちらは固定ベクタへ割り込み関数を登録していると、
    対応する割り込み関数のアドレスが書かれます。
    PDGを使わない場合で割り込み関数を登録しなかったり、
    対応する割り込み関数のアドレスが異なっていれば値も異なります。
  • わわいです
    それと、ちょっと引っかかってるんですが、RAMで実行するユニットというのはちゃんとRAMのアドレスでの実行を前提としてビルドされてますよね?
    ROMアドレスのコードをそのままRAMにコピーして実行させてるようにも見れますが。。
  • わんです。
    間違ったところに書いてしまいました。

    circle様
    返信ありがとうございました。
    アプリケーションノートを参考にしてフラッシュAPIはRAMにコピーし、同様にメディア読み込みとROM消去・書き込みプログラムも別セクションのRAMにコピーしています。
    どうやら問題なく動作していますが、何分始めて行うことなので、他の方のコメントをいただくと心強いです。

    わわい様
    RAMで実行するのは、上記のようにセクションを作ってHEWの「ROMからRAMにマップするセクション」を指定し、_INTSCTでコピーしています。
  • わわいです
    >RAMで実行するのは、上記のようにセクションを作ってHEWの
    了解です
    それなら大丈夫ですね

    SHやRZでガンガンメモリ載せてやる場合とか、Linuxベースで動かせる場合もそうですけど、ROMはあくまでブート用のストレージという割り切りで、システムの立ち上げ後、ROMから実行イメージをRAMに展開してそこで実行させるというのはふつーにやられてることですね