スマートコンフィグレータ使用時のブート領域、フラッシュ領域の分割方法について

お世話になります。

アプリケーションノート:R20UT4547JJ0100『RXファミリ用C/C++コンパイラパッケージ(CC-RX)ブート領域、フラッシュ領域の分割方法』を参考に、ブート領域とフラッシュ領域を分割したプロジェクト作成をおこなっています。使用環境は以下になります。

【使用環境】

  • RX65N(R5F565NEDDFC:ROM容量2MByte)
  • 開発環境:CS+(V8.03.00),スマートコンフィグレータ(2.3.0)
  • ビルド・ツール:CC-RX(V3.02.00)
  • デバッグ・ツール:RX E1(JTAG)

アプリケーションノートの手順で、新規作成したプロジェクトのブート領域/フラッシュ領域の分割とダウンロードはできました。

ですが、分割予定のプロジェクトはスマートコンフィグレータを搭載しており、ルネサスボードサポートパッケージFITモジュール(r_bsp)ファイルが生成される影響で、プロジェクト作成時に自動生成されるファイルの一部(intprg.c, stack.h, vect.h)がプロジェクトから外されてしまいます。

そのため、アプリケーションノートの

  • 2.1.2:(2)自動生成ファイルの削除
  • 4.1.1:スタックサイズ定義のインクルードと、スタックポインタの設定をコメントアウト
  • 4.1.1:各制御レジスタの設定をコメントアウト

等の方法が分からず、ブート領域の.fsyファイルがスマートコンフィグレータ未使用時と異なる内容が書かれてしまいます。

スマートコンフィグレータ使用時のブート領域、フラッシュ領域の分割方法についてご教授お願いいたします。

 

---.fsyファイル(左:スマートコンフィグレータ未使用時、右:スマートコンフィグレータ使用時)---

                                     


  • togashiさん、こんにちは。NoMaYです。

    天下り式ですけれども、上側のコードを下側のコードのようにすれば良いですよ。ただし、遷移していく先ですが、main()では無くて、PowerON_Reset_PC()ですよ。(RXスマートコンフィグレータのBSPモジュールでの定義で書けばR_BSP_POWER_ON_RESET_FUNCTION()です。BSPモジュールのソース上の表記そのままで書けばresetprg.cのR_BSP_POR_FUNCTION(R_BSP_STARTUP_FUNCTION)です。)


      ((void (*)(void)) 0xXXXXXXXX)(); //XXXXXXXX=main関数のアドレス

     

    アプリケーション側のRESETセクションをBANK1のFFEF_FFFC番地に配置したとします。

      (*((void (**)(void)) 0xFFEFFFFC))();

     

    ちなみに、遷移はこんな感じです。

    ブートローダ代わりのプログラム+アプリケーションの場合: (CS+でのダウンロード順は、アプリケーション側が1番目、ブートローダ代わりのプログラムが2番目)

    CPUリセット

    CPUがブートローダ代わりのプログラムのRESETセクション(FFFF_FFFC番地から4バイト)をリードする

    ブートローダ代わりのプログラムのPowerON_Reset_PC()

    ブートローダ代わりのプログラムのmain()

    ブートローダ代わりのプログラムがアプリケーション側のRESETセクション(FFEF_FFFC番地から4バイト)をリードする

    アプリケーション側のPowerON_Reset_PC()

    アプリケーション側のmain()

     
    アプリケーション単体でのデバッグの場合: (アプリケーション単体でデバッグする場合の利便性向上の為)

    CPUリセット

    CPUがアプリケーションのRESET2セクション(FFFF_FFFC番地から4バイト)をリードする

    アプリケーションのPowerON_Reset_PC()

    アプリケーションのmain()

     

  • togashiさん、こんにちは。NoMaYです。

    > ((void (*)(void)) 0xXXXXXXXX)(); //XXXXXXXX=main関数のアドレス

    ふと頭に思い浮かんだのですけれども、ひょっとしたら、マイコンのプログラムでmain関数に来るまでの動作を全く知らない世代なのかな、、、

  • 天下り式ですけれども、上側のコードを下側のコードのようにすれば良いですよ。ただし、遷移していく先ですが、main()では無くて、PowerON_Reset_PC()ですよ。

    >ありがとうございます。アプリケーション側のRESETVECTを0xFFEFFFFCに配置し、

    (*((void (**)(void)) 0xFFEFFFFC))();

    PowerON_Reset_PC()→main()を実行できました。テスト用に2つのプロジェクトを用意し、ROM領域が被らないように配置して試してみたところ、問題なくNoMaYさんの流れで動作いたしました。

     

    ふと頭に思い浮かんだのですけれども、ひょっとしたら、マイコンのプログラムでmain関数に来るまでの動作を全く知らない世代なのかな、、、

    >お恥ずかしい話ではありますが、PowerON_Reset_PC()→main()の流れ程度しか知りません…。そのため説明にお手数おかけしてしまい、申し訳ありません。今後のためにも勉強いたします。