ROMを書き換えたい

初めまして。

RX621でRX用シンプルフラッシュAPI を使ってROMのプログラムを書き換える勉強中です。

最終的には外部と通信して更新データを取得して更新したいんですが、通信が難しそうなのでとりあえず実行中のプログラムAを0xFFFF0000~0xFFFFBFFFに、更新用のプログラムBを0xFFFE0000~0xFFFEBFFFにいれてAを実行中にAを削除してBを0xFFFF0000~0xFFFFBFFFにコピーしてWDTでリセットするとBで動作しました。

しかし、この時にAとBでプログラムの大きさが違うとリセット後PCが0x00000000に飛んでしまいます。

恐らく大きさが変わる過程で関数の開始アドレスがずれるから正常に動作できなくなっていると思いますが、解決方法がわかりません。

上記考察は実際に関数内のa = a+1をa = a+2にするなど大きさが変わらないような変化だと正常に動作し、__nop()を追加しただけで動作しなくなったので間違いないと思っています。

書き換え前後のプログラムは上記の通りROMにありますが、フラッシュAPI等書き換えに関するプログラムはRAMで動作して書き換えはしません。

ヒントが少なくて恐縮ですが、何か思い当たる点や試してみるべきことなどあれば教えてください。

Parents
  • > 最終的には外部と通信して更新データを取得して更新したいんですが、
    データだけをスゲ替えるならそこだけを書き換えることを考えた方が良いのでは?
    データフラッシュのあるデバイスならデータフラッシュを使っても良いでしょうし、
    main関数以降のアプリケーション部も一緒に書き換えるなら開始番地だけ固定にして呼んでもらっても良いし。

    CC-RXであれば *.fsy ファイルを介して分割したプログラム間で外部参照をさせることができます。
    (参考) ブート領域、フラッシュ領域の分割方法
    https://www.renesas.com/jp/ja/document/mat/rx-family-cc-compiler-package-cc-rx-how-divide-boot-and-flash-areas-rev100
    ※ 記述や設定内容でなく、何をやっているかに着目して読んでみてください。この例ではブート部とアプリケーション部は完全に別のプログラムですが、ドライバもブート側に持たせて最上位層だけを分離するなど、応用は可能です。
    ※ ダイナミックリンクではないのでリンクする相手のアドレスが変わったら変わった後の *.fsy ファイルで再リンクが必要です。

    他にもこのフォーラムで "RX フラッシュ ブートローダ" とか検索すると色々出て来ます。

    まずは自分がやりたい事と実現手段が一致しているかから考える必要があるかと思います。

  • ほやさんありがとうございます。

    データだけをスゲ替えるならそこだけを書き換えることを考えた方が良いのでは?

    更新データというより更新プログラムといった方が良かったですね。最終的にはアップデートするプログラムを外部から取得したいですが、今はそれ以前のところで止まってます。

    >まずは自分がやりたい事と実現手段が一致しているかから考える必要があるかと思います。

    やりたいことは実行中にプログラムを書き換えたいです。将来的にはそのプログラムを通信で取得したいんですが難しそうなのであらかじめROMの別領域に書き込んでおいてそれに書き換えたいです。

    その手段として書き換えるプログラムのセクションを指定して、そのセクションだけを上書きしようとしていますが、書き換えたセクション以外の領域(例外ベクタ等)も変わっている所があり、正常に動作しない問題が発生しています。

    そもそもの話ですが、書き換えるデータってどうやって用意するんでしょうか?

    今の以下の方法でやってます。

    1. 更新前の動作をするプロジェクトの一部を変更したプロジェクトをビルド&デバッグ・ツールへダウンロードしてメモリパネルから0xFFFF0000~0xFFFFBFFF番地のデータをコピーする

    2. コピーしたデータをconst char data[]={0x00,0x00…0x00}という要素数49152個の配列にして#pragma section Cを書いたcファイルにする

    0xFFFF0000~0xFFFFBFFF番地を書き換えるから0xFFFF0000~0xFFFFBFFF番地をコピペしたわけですがこれだと当然他の範囲は対応できませんよね。

    書き換える方法は検索して色々情報はありますが、書き換えるデータを用意する方法はよくわかってません。

  • > 書き換えるデータってどうやって用意するんでしょうか?
    ブートローダサンプルプログラムの中でXモデムがどうのと言っている辺りがそのイメージに近いかも?

    https://www.google.com/search?q=site:renesas.com+%22%EF%BC%B8%E3%83%A2%E3%83%87%E3%83%A0%22+%22RX%22

    通信で拾って来るブロック毎にフラッシュに書き込むような動作にするのが一般的だと思います。

Reply Children
No Data