Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

ブート-フラッシュ領域を分割したプロジェクトでのROM化

はじめて質問します。あさたろうと申します。

使用している開発ツールは、「CS+ for CA,CX V4.01.00 [28 Nov 2017]」です。

RENESAS提供の資料「ブート-フラッシュ領域の分割方法(R20UT3040JJ0100)」
を参考にしてブートプロジェクト(boot)とメインプロジェクト(appmain)に
分けています。

このプロジェクトについて、「ROM化の指定方法(R20UT3041JJ0100)」
という資料に書かれた設定を行いました。

すると、boot側は、boot.map,romp.mapともに、_rcopy()がブート領域
内に割り付けられました。

ところが、メインのプロジェクト側では app_main.mapに_rcopy()は
現れず、romp.mapではブート領域(0~2000h)でなくフラッシュ領域
に_rcopy()が割り付けられてしまいます。

メインのプロジェクトでは、ビルド・ツールのプロパティで「オブジェクト
・コンバート・オプション」→「ヘキサ・ファイルを分割する」→「はい」
に設定していて、ブート側とメイン側とでヘキサファイルが以下のように
分割されるのですが。。。

メインプロジェクトのブート側ヘキサファイル(appmain.hxb)が、
ブート側のヘキサファイル(boot.hex)と同じものになりません。

appmain.hxbとboot.hexが同じになるように設定する方法を教えて
ください。

ーーー
あさたろう

  • わわいです
    まず、なぜBOOT部とアプリケーション部を分けなければならないか、ということを考える必要があります。
    双方同じROMに格納されていて、単にアドレス分けたいだけ、というのであれば、わざわざプロジェクトを分ける、というのは無駄でしかありません。
    ということで、この質問の回答としては、BOOT部のプロジェクトは破棄し、同じプロジェクトで、セクションを分けて記述し、あとで分割すればいい、ということになるかと思います。

    ただ、この場合は当然のことながら、BOOT部、アプリ部、双方の同名の関数は共用され、memcpyなどの標準関数も(どっちに存在するにしろ)共用される形となります
    ただし、BOOT部のみの修正、アプリ部のみの修正、という場合にも、双方共用されている関数のことを考えると、全部一緒くたにビルドし、全部一緒くたに書き換える必要が出てきますね

    まあ、RLのような小容量なCPUの場合は、これがベストな方法となろうかと思います
  • In reply to わわい:

    わわいです
    SHとかRZとかのCPUの場合、ちょっと大規模なプロジェクトになったりすると、
    BOOT部はSPIフラッシュに格納され、アプリケーション部はSDカードに格納されている、ということになる場合もあります
    その場合は、BOOT部の実行中はアプリ部のコードは使えない(存在していない)、アプリ部の実行中はBOOT部のコードは使えない、という状況になります。
    こうなると、双方同名の関数はもちろん、標準関数やライブラリなども一切共用することはできず、双方独立して存在させる必要が出てきます

    この場合は、きっちりプロジェクトを独立させ、相互の呼び出しは一切できないように考慮しないとダメですわな。
  • In reply to わわい:

    わわい様

    > なぜBOOT部とアプリケーション部を分けなければならないか

    BOOT部にアプリケーション部を書き換える処理を入れています。

    > BOOT部のみの修正、アプリ部のみの修正、という場合にも、
    > 双方共用されている関数のことを考えると、全部一緒くたにビルドし、
    > 全部一緒くたに書き換える必要が出てきますね

    「ブート-フラッシュ領域の分割方法(R20UT3040JJ0100)」には、
    アプリ部のビルド時にブート部の関数,変数が参照可能となる
    ような、“再リンク”が可能である、とあります。

    基本はアプリ部のみの修正で、ブートは致命的な誤りが無い限り
    書換えを行ないません。
    (ブート自信の書換え処理も入れて有ります。その場合はアプリ
    も書き換える必要があります)

    あさたろう
  • In reply to あさたろう:

    わわいです。
    >基本はアプリ部のみの修正で、ブートは致命的な誤りが無い限り
    >書換えを行ないません。
    そうしたいのなら、少なくともBOOT部で使用する関数はすべてBOOT部に入れる必要がありますね

    それでは、アプリケーション部はどうします?
    完全にアプリ部のみ独立して走るようにするのか、BOOT部に依存して動くようにするのか。

    アプリ部のみで独立して動くようにするなら、双方プロジェクトを分けてアプリ部のみでビルドすればいいだけのはなしとなります
  • In reply to わわい:

    チョコです。
    >なぜBOOT部とアプリケーション部を分けなければならないか
    これは,フィールドでプログラムを書き替えるためによく用いられる方法ですよ。

    RL78では,このようにしないとアプリケーションを書き替えるために,プログラマを準備して,
    チップ全体を書き替えるしかなくなります。フィールドでこのようなことを行うのは危険でしょうね。

    このように,BOOT部を分離することで,セルフプログラミング機能を用いて,アプリケーション部
    のコードだけを外部からシリアルで入力することで書き換えができるようになります。
    このためにはアプリケーション部のコードがBOOT部と分かれている必要があります。
    RL78では,CS+でこの方法がサポートされているだけです。

    _rcopy()(ROM化)と再リンクについては,ANの最後の方に書いてあるようなので,そちらも
    参照してみてください(ここらは,スタートアップ・ルーチンの問題なので,分かりません)。
  • あさたろう さん、こんにちは。NoMaYと申します。

    念の為、確認したいのですが、「ブート-フラッシュ領域の分割方法(R20UT3040JJ0100)」と「ROM化の指定方法(R20UT3041JJ0100)」を併用する理由は、以下の2つの何れかもしくは両方を、ブート領域側もしくはフラッシュ領域側もしくは両方で使用する、という理解で良いのですよね? 言い方を変えますと、そこまで必要ではない普通のROM化では「ROM化の指定方法(R20UT3041JJ0100)」は気にしなくても良い、のですが、その点は宜しいでしょうか?

    ・ RAMに配置するプログラム
    ・ RAMに配置するconst定数


    また、チョコさんが指摘されていた部分は以下の部分だと思いますが、この文面からすると、あさたろうさんが想定しているような、メインプロジェクトのブート側ヘキサファイル(appmain.hxb)がブート側のヘキサファイル(boot.hex)と同じものになる、という素朴な話にそもそもならないのかも知れません。



    この2つの資料に目を通すだけでは、さすがに状況を充分に把握することが出来ず、何かプロジェクトを作って触ってみる必要があるのですが、あさたろうさんの手元に、かふぇルネでプロジェクト一式のzipファイルを公開することが出来るような簡単なものがあったりしませんでしょうか? あるのであれば、公開して頂けると、リプライしようと思っている人達(当方を含む)が資料を見ながらプロジェクトを作成する手間を省略することが出来ます。何かお持ちではないでしょうか?

  • In reply to NoMaY:

    わわい様
    チョコ様

    リプライありがとうございます。
    チョコ様の言われる通り、フィールドプログラミングを想定
    しています。


    NoMaY様

    > 以下の2つの何れかもしくは両方を、ブート領域側もしくは
    > フラッシュ領域側もしくは両方で使用する、という理解で良いのですよね?

    その理解で良いです。

    また、最初の生産時にはBOOT+APPMAINが1つになったヘキサファイル
    をFlashProgrammerで書込む必要があります。

    製品となった後に、もしアプリケーション側の修正が発生した場合には、
    BOOTプログラムにてAPPMAIN側のヘキサファイルをシリアルで転送して
    書き換えます。

    ですので、BOOT側プロジェクトのBOOT単体のヘキサファイルと、
    アプリ側のBOOT+APPMAINが1つになったヘキサファイルとで、
    BOOT部分が同じにならないと困るのです。


    > かふぇルネでプロジェクト一式のzipファイルを公開することが出来る
    > ような簡単なものがあったりしませんでしょうか?

    現状のプロジェクトで、現象の確認だけ行なえるようにソースを削る
    ことは出来ると思うのですが、すぐには出せない状況です。


    > リプライしようと思っている人達(当方を含む)が資料を見ながら

    ありがとうございます。

    もともと、他にも検討しなくてはならないことがあり、時間を節約
    する目的でこちらへ質問させていただきました。
    (CS+の設定だけの問題で、ご存知の方がいらっしゃるかと考えて
    おりました)

    先ず、公開するプロジェクトを用意しようと思います。

    ---
    あさたろう
  • In reply to あさたろう:

    わわいです
    アプリケーション部で、BOOT分も含めてビルドする必要がある場合、単独のBOOT部と同一にする、というのは無理があります
    標準関数、ライブラリ関数は当然BOOT部に配置しなければなりませんが、BOOT部単独のときとアプリ部が含まれるときとでは使用する関数の数が変わってきてしまうからです

    で、どうするかというと、BOOT部とアプリ部を独立させておき、アプリ部のリンク時に、BOOT部の実行イメージと結合してしまう、ということをすればいいです。
  • In reply to あさたろう:

    あさたろうです。

    この投稿をご覧になり、試してみたいと考えてくださる方へ
    先にお礼申し上げます。

    現象を確認できるプロジェクトを用意しました。

    どうぞよろしくお願いいたします。

    ---
    あさたろう


    for_CafeRune.zip

  • In reply to わわい:

    わわい様

    リプライありがとうございます。

    BOOTをアプリのサブプロジェクトとするアプリケーションノート
    がありましたので、それを元にした場合でもROM化をうまく設定
    できるのではないかと考えました。

    無理なようであれば、わわい様のご提案も検討させていただきます。

    ---
    あさたろう
  • In reply to あさたろう:

    あさたろうさん

    アプリケーションノートのサンプルプロジェクト(an_r01an0718ej0102_rl78g13_flash.zip)をコンパイルしたところ、ブート(boot.hex)とアプリのブート部分(.hxbの0~1FFFh)は一致してましたよ。boot部で作ったboot.hexをアプリに取り込んでいるので同じになるはずかと思います。

    コンパイラはあんまり詳しくありませんけれども、、、何か設定に違いがあるかも?!

  • In reply to Kirin:

    Kirin様

    確認ありがとうございます。

    こちらでは、このようになってしまいます。。。

    boot.hex をヘキサファイルからバイナリに変換すると、

     

    004F2H以降に_rcopy()(と思われるデータ)がいます。

    appmain.mapには_rcopy()がいなくて、
    romp.mapには_rcopy()がいるのですが、フラッシュ領域に居ます。

    appmain.hxbをバイナリに変換すると、_rcopy()が居て欲しい
    004F2H以降のアドレスは、

    空っぽです。

    boot.hexとappmain.hxbをdiffしても、

    違っているんです(;_;)。

    ---
    あさたろう

     

  • あさたろう さん、こんにちは。NoMaYです。

    今調べてますが、第1印象としては、ライブラリ関数rcopy()が入っているセグメント@@ROMPが明示的に定義されていないので、とにかくコードの末尾に@@ROMPが配置されてしまっているような気がします。(あくまで第1印象ですよ。)

    そのせいで、BOOT側プロジェクトではBOOT部しかないのでBOOT部の末尾、メイン側プロジェクトではBOOT部+FLASH部のペアの末尾すなわちFLASH部の末尾、に配置されてしまっているのではないかという気がします。更に調べます。

  • In reply to NoMaY:

    NoMaY様

    貴重なお時間を割いていただいて恐縮です。
    ありがとうございます。

    チョコ様ご指摘のAN内の記述(NoMaY様が画像で提示された部分)、
    「再リンク機能とROM化機能を併用について(1/3)」にある内容
    から、やろうとしていることがそもそも出来ないのかと思いました
    が。。。

    どうぞよろしくお願いいたします。

    ---
    あさたろう
  • あさたろう さん、こんにちは。NoMaYです。

    本件は、以下の2つの画面コピーのように、BOOT側プロジェクトとメイン側プロジェクトで、それぞれ同じアドレスをCS+ for CA,CXの[ROM化プロセスオプション]→[コピールーチンの先頭アドレス]に設定してあげれば良さそうです。例えば以下の画面コピーのようにしたところ、どちらのプロジェクトも_rcopy()が入っているセグメントが0x1000に配置され、問題となっている2つのHEXファイルは同じになりました。ごめんなさい。何か別の差異がでてました。更に調べます。

    BOOT側プロジェクトのビルドツールの設定


    メイン側プロジェクトのビルドツールの設定

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page