フラッシュ書き換えについて

使用CPU:R5F104JG(RL78/G14)

フラッシュセルフプログラミングライブラリType01を使っております。

目的の内容は以下のことです。

  • 実行中プログラムで、別プロブラムのmotファイル内容をシリアルで受け取る。
  • ライブラリを使用して、motファイル内容を書き込む。
  • 別プログラムを実行する。

 このとき、実行中プログラムはベクタ領域0x0000~と、プログラム領域0x3000~を使用しています。

 別プログラムはセクション設定でプログラム領域を0x4000~に変更しました。

 ここから質問になります。

  • ベクタ領域は「セクション設定」で変更する項目がありませんでしたが、変更する方法はあるのでしょうか?
  • 変更する方法がなければ、別プログラムのベクタ領域(0x0000~)を、ブートクラスタ1のベクタ領域(0x1000~)へ書き込んで良いのでしょうか?
  • ブートクラスタ1のベクタ領域(0x1000~)とプログラム領域(0x4000~)の書き換え後、アドレスジャンプで、0x1000へ飛べば、別プログラムは実行されるのでしょうか?(次回からは、最初の実行中プログラムから立ち上げたいので)

誠に申し訳ありませんが、宜しくお願い致します。

Parents
  • miesuge2さん、こんにちは。NoMaYと申します。

    RL78のブートスワップ機能を使おうとされていますでしょうか?(聞いたことが無ければ違うということですね。) 質問の一部は、ブートスワップ機能を使うならYes、使わないならNo、といった感じのリプライになりそうです。

    > ベクタ領域は「セクション設定」で変更する項目がありませんでしたが、変更する方法はあるのでしょうか?
    CC-RLにもCA78K0Rにも、この機能は無かったと思います。

    > ブートクラスタ1のベクタ領域(0x1000~)とプログラム領域(0x4000~)の書き換え後、アドレスジャンプで、0x1000へ飛べば、別プログラムは実行されるのでしょうか?(次回からは、最初の実行中プログラムから立ち上げたいので)
    すみません、これは質問の意図が分かりませんでした。ですが、以下のドキュメントが参考になるかと思います。(リプライとしては、ベクタ領域にジャンプしてはダメで、関数ポインタにベクタの値を代入して、関数ポインタ経由でプログラムを呼び出す、ということになるのですが、たぶん、聞きたかったことでは無いだろうと感じましたので。)

    > 変更する方法がなければ、別プログラムのベクタ領域(0x0000~)を、ブートクラスタ1のベクタ領域(0x1000~)へ書き込んで良いのでしょうか?
    これに関しても、以下のドキュメントが参考になると思います。

    RL78/G13フラッシュ・セルフ・プログラミング実行編 ← CA78K0R用ですがブートスワップ機能のサンプルコードがあります
    www.renesas.com/jp/ja/doc/products/tool/apn/r01an0718jj0102_rl78g13.pdf

    ブート領域、フラッシュ領域の分割方法(CC-RL)
    www.renesas.com/ja-jp/doc/products/tool/doc/006/r20ut3475jj0200_ccrl.pdf

    ブート-フラッシュ領域の分割方法 RL78、78K0R用CコンパイラCA78K0R 再リンク機能
    www.renesas.com/jp/ja/doc/products/tool/doc/003/r20ut3040jj0100_ca78k0r.pdf

    やりたいことの参考になりそうな(と思われる)情報は、以下のような検索ワードで探す手もあります。

    Renesasキーワード検索: ブート フラッシュ 領域 分割
    www.renesas.com/jp/ja/search/keyword-search.html#q=ブート フラッシュ 領域 分割

    Renesasサンプルプログラム検索: RL78 フラッシュメモリ
    www.renesas.com/jp/ja/search/keyword-search.html#q=RL78 フラッシュメモリ

    Renesasツールダウンロード検索: RL78 フラッシュメモリ
    www.renesas.com/jp/ja/search/keyword-search.html#q=RL78 フラッシュメモリ
     

  • ご回答有難う御座います。

    >すみません、これは質問の意図が分かりませんでした。
    質問が分かり難くて申し訳ありません。
    アプリケーションの実行中書き換えを行いたいのです。
    アプリA実行中に別領域へアプリBのフラッシュ書き込みを行い、アプリBへ実行を移そうとしています。
    その時、アプリBのコード部分はアドレスを別にしているので問題ないのですが、ベクタ部分はアドレスが変更できないので、どうすべきか解らなかったのです。

    ちなみに、
    アプリA:ベクタ(0x0000~)、コード(0x3000~)
    アプリB:ベクタ(0x0000~)、コード(0x4000~)
    に配置されています。


    >RL78のブートスワップ機能を使おうとされていますでしょうか?(聞いたことが無ければ違うということですね。) 質問の一部は、ブートスワップ機能を使うならYes、使わないならNo、といった感じのリプライになりそうです。
    フラッシュセルフプログラミングライブラリのサンプルコードを見て、ブートスワップ機能は使おうとしていましたが、セクション設定で挫折してしまい、アドレスジャンプで可能か試していました。

    CC-RLのセクション設定で、ブートクラスタ0領域に先頭アドレス(0x000CE)に「.const」を設定しようとすると、「overflowed out of range」とエラーになってしまいます。
    セクションを自動的に配置すると、ベクタは0x00000から配置されますが、コード部は0x3000からとなり、それより前のアドレスには変更出来ませんでした。
    それで、ブートクラスタ0を使用したアプリが作成できなかったのです。

    私の想像ですが、アプリB側のベクタ領域をブートクラスタ1のベクタ領域へ書き込み、「FSL_InvertBootFlag」でフラグ反転し、「FSL_SwapBootCluster」を実行すれば、0x4000からのアプリB側のコードが実行されるのですか?


    >CC-RLにもCA78K0Rにも、この機能は無かったと思います。
    ありがとうございます。
    CC-RLを使用していますが、RXにはあったのでRL78にもあるかと思いました。
Reply
  • ご回答有難う御座います。

    >すみません、これは質問の意図が分かりませんでした。
    質問が分かり難くて申し訳ありません。
    アプリケーションの実行中書き換えを行いたいのです。
    アプリA実行中に別領域へアプリBのフラッシュ書き込みを行い、アプリBへ実行を移そうとしています。
    その時、アプリBのコード部分はアドレスを別にしているので問題ないのですが、ベクタ部分はアドレスが変更できないので、どうすべきか解らなかったのです。

    ちなみに、
    アプリA:ベクタ(0x0000~)、コード(0x3000~)
    アプリB:ベクタ(0x0000~)、コード(0x4000~)
    に配置されています。


    >RL78のブートスワップ機能を使おうとされていますでしょうか?(聞いたことが無ければ違うということですね。) 質問の一部は、ブートスワップ機能を使うならYes、使わないならNo、といった感じのリプライになりそうです。
    フラッシュセルフプログラミングライブラリのサンプルコードを見て、ブートスワップ機能は使おうとしていましたが、セクション設定で挫折してしまい、アドレスジャンプで可能か試していました。

    CC-RLのセクション設定で、ブートクラスタ0領域に先頭アドレス(0x000CE)に「.const」を設定しようとすると、「overflowed out of range」とエラーになってしまいます。
    セクションを自動的に配置すると、ベクタは0x00000から配置されますが、コード部は0x3000からとなり、それより前のアドレスには変更出来ませんでした。
    それで、ブートクラスタ0を使用したアプリが作成できなかったのです。

    私の想像ですが、アプリB側のベクタ領域をブートクラスタ1のベクタ領域へ書き込み、「FSL_InvertBootFlag」でフラグ反転し、「FSL_SwapBootCluster」を実行すれば、0x4000からのアプリB側のコードが実行されるのですか?


    >CC-RLにもCA78K0Rにも、この機能は無かったと思います。
    ありがとうございます。
    CC-RLを使用していますが、RXにはあったのでRL78にもあるかと思いました。
Children
No Data