内蔵ROM(コードフラッシュメモリ)で動くプログラムを外部SDRAMで動かしたいのですが、上手くいきません。。。

こんにちは。お世話になっております。

RX72Nを使っておりまして、現在、CPUの内蔵ROM(コードフラッシュメモリ)でプログラムが動いております。
プログラムを外付けSDRAMで動かしたいのですが、上手くいきません。外部SDRAMに関しては、初期化後、
値をwrite,readして読めています。(0x08000000~0x09FFFFFF、 外部アドレス空間(SDRAM 領域)、SDRAM 32MByte)
初期値ありの変数Dなどに関しては内蔵RAMにセクション設定など設定して展開してあります。

-動作環境--
使用マイコン:RX72N(ROM容量4MByte)
開発環境:e2stdio
リアルタイムOS:NORTi
ビルド・ツール:CC-RX V3

CC-RXコンパイラ仕様書、ネット情報を見て書いてみたのですが、理解ができていません。

以下、SDRAMへの展開で、追加で書いてみた箇所です。

#pragma section C C$DSEC
extern const struct {
unsigned char *rom_s; /* 初期化データセクションのROM上の先頭アドレス */
unsigned char *rom_e; /* 初期化データセクションのROM上の最終アドレス */
unsigned char *ram_s; /* 初期化データセクションのRAM上の先頭アドレス */
} _DTBL[] = {
{ __sectop("D_8"), __secend("D_8"), __sectop("R_8") },
{ __sectop("D"), __secend("D"), __sectop("R") },
{ __sectop("D_2"), __secend("D_2"), __sectop("R_2") },
{ __sectop("D_1"), __secend("D_1"), __sectop("R_1") },
{ __sectop("PRAM"), __secend("PRAM"), __sectop("RPRAM") }  //←ここを追加

};

/*****************************************************************************
* Main Function (Initialize Handler ・・)
*
******************************************************************************/
#pragma section P PRAM  //←ここを追加
int main(void)
{
/* initialize system */
・・・・
/* create application task */
・・・・
/* start task */
・・・・
/* start system */

・・・・

e2stdioのセクション設定も変えてみました。(赤い線の箇所、右図の青選択箇所を追加)

コンパイルすると、以下のエラーが出ています。
E0562330:Relocation size overflow : ".・・\SRC\app\RX72n.obj"-"PRAM"-"00000003"

数日かかっているのですが、どこから手をつけていいのかもあまりわかっていません。

どなたかご教授いただけないでしょうか。

よろしくお願いいたします。

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

    これは以下のFAQの対処方法を試してみて頂けませんか?

    E0562330 (ファイル名.objからの分岐幅)
    ja-support.renesas.com/knowledgeBase/17796702

    [関連リンク]

    Google検索: E0562330 Relocation size overflow
    www.google.com/search?q=E0562330+Relocation+size+overflow

     

  • NoMaYさん こんにちは。

    回答ありがとうございます。
    設定したところ、以下のところがすべてSDRAMで動作しました。
    ありがとうございます。

    /*****************************************************************************
    * Main Function (Initialize Handler ・・)
    *
    ******************************************************************************/
    #pragma section P PRAM  //←ここを追加
    int main(void)
    {
    /* initialize system */
    ・・・・
    /* create application task */
    ・・・・
    /* start task */
    ・・・・
    /* start system */

    ・・・・

    しかし、初めに開始するタスク(start task)をみるとROMで動作していました。

    CCRXのマニュアルでは以下の記載があります。

    セクション切り替え記述

    #pragma section [< セクション種別>] [ △ < 変更セクション名>]
    < セクション種別>: { P | C | D | B }


    セクション種別と変更セクションを指定した場合、セクション種別がP であればその#pragma 宣言以降に記述
    された関数のセクション名を変更します。

    start task以降のプログラムをすべてSDRAMで動作させるためには
    すべての関数に#pragma section P PRAMをつけて、セクション設定で内臓RAMに設定していた
    B,Rをすべて0x08000000側(RPRAMの下)に設定すればいいのでしょうか?

    何か違う気がしています。。

  • 続き

    SDRAMで動作させる理由としては、内臓RAMだと容量が足りないことと、

    プログラムの更新のとき、SDRAMに展開している状態でやりたいためです。

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

    > SDRAMで動作させる理由としては、内臓RAMだと容量が足りないことと、 プログラムの更新のとき、SDRAMに展開している状態でやりたいため

    それで、ふたつ、お尋ねしたいことがあるのです。

    1つ目は、頂いている情報から考えますと、実は、SDRAMへコピーするプログラムのコードがフラッシュメモリ内に、それこそ丸ごと、入っている筈です。つまり、ここまでの話しでは、SDRAMへコピーする必要が無いのでは?という印象なのですが、最終的にやりたいことはどんなことなのでしょう?

    例えば、

    ○ 最終的にはブートローダで外付けシリアルフラッシュからSDRAMへプログラムをダウンロードする予定とか?

    そして2つ目は、SDRAM上で実行させたいプログラムのカテゴリとしては、どのような種類のものが含まれるのでしょう?

    例えば、

    (1) NORTiカーネルもSDRAM上で動かしたい?
    (2) C言語標準ライブラリは?
    (3) もろもろのFITモジュール/CGコンポーネントなどは?
    (4) 自作ライブラリ(libファイルになっているかどうかは関係無しに)などは?

    ひとまず、これら2点を知りたいです。

    正直なところ、hiroroさんがやりたいことが、曇りガラスの向こうにある感じで、ちょっと良く分からない状態です。

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

    > hiroroさんがやりたいことが、曇りガラスの向こうにある感じで、ちょっと良く分からない

    ひょっとして、ミスポさん提供のTCP/IPスタックとかUSBスタックとか他もろもろとか、そういうのが丸ごと動いている状態で(それらの機能を使った上で)、ファームウェアアップデートをしたい、ということでしょうか?

    あと、ちなみに、プログラムサイズは全体で(可能性も含めて)どれくらいでしょうか?2Mバイト以下? 2M~4Mバイト?


  • NoMaYさん こんにちは。

    回答ありがとうございます。

    >ブートローダをつかって、外付けシリアルフラッシュからSDRAMへプログラムをダウンロードする予定とか?
    目的はそのとおりです。

    >ひょっとして、ミスポさん提供のTCP/IPスタックとかUSBスタックとか他もろもろとか、
    >そういうのが丸ごと動いている状態で(それらの機能を使った上で)、ファームウェアアップデートをしたい、ということ>でしょうか?
    そうです。

    >あと、ちなみに、プログラムサイズは全体で(可能性も含めて)どれくらいでしょうか?2Mバイト以下? 2M~4Mバイ>>ト?
    今のところ、4M程度です。

    よろしくお願いいたします。

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

    そういうことでしたか。そして、最終的には外付けシリアルフラッシュから、今のところは実験目的で内蔵フラッシュから、ファームウェアアップデートの本番や実験をしたい(もちろんアプリケーションのデバッグも)、みたいなところでしょうか?(今のところ、というのは、開発フェーズ初期のコーディング/デバッグの作業の話ですかね。)

    そういうことであれば、私は、以下のようなやり方が良いのではないかな、と思いました。(セクション設定に関しては赤文字のとおりにします。)

    (1) プロジェクトを2つ作成する

    (2) ひとつは、以下を行うだけのもの(セクション設定は普通に設定)
    (2-1) resetprg.cからmain()を呼び出す、そしてmain()以降で以下を行う
    (2-2) SDRAMを使うのに必要な初期化 (および 外付けシリアルフラッシュにアクセスするのに必要な初期化)
    (2-2') SDRAMの初期化はもっと前で行えたかも知れません(すみません、実際に使ったことが無くて、、、)
    (2-3) 内蔵フラッシュ(および 外付けシリアルフラッシュ)から全てをSDRAMへコピーする
    (2-4) SDRAM側のプロジェクトのresetprg.cの処理へジャンプ

    (3) もうひとつは、以下を行う本番のもの(セクション設定は全てをSDRAMに配置する設定)
    (3-1) こちらのプロジェクトのresetprg.cからmain()を呼び出す、そしてmain()以降で以下を行う
    (3-2) ミスポさんのNORTiやTCP/IPスタックやUSBスタックやアプリケーションの何もかもの初期化やら実行やらを普通に行う
    (3-3) 内蔵フラッシュ(および 外付けシリアルフラッシュ)の書き換え

    実験目的段階として、

    (4-1) 先の(3)のプログラムをCC-RXのリンカの機能でバイナリファイル化する
    (4-2) そのバイナリファイルをCC-RXのリンカの機能で先の(2)のプログラムに合体させる
    (4-3) 動作確認作業としては、(4-2)で合体させたプログラムをe2 studioでダウンロードして実行させれば良い、筈です

    というように思ったのですが、いきなりそう言われても困惑してしまう、でしょうか?

    上記の(3)の赤文字のセクション設定が本番のセクション設定の筈だろう、という感はとても強いのですけれども、実験目的として簡易的な設定がないかどうか、ちょっと咄嗟に思い浮かばなかったです。

    すみません、ひとまず、ここまでリプライしておきます。

    [追記]

    > (3) もうひとつは、以下を行う本番のもの(セクション設定は全てをSDRAMに配置する設定)

    すみません、全て、では無かったですね。普通の目的のRAMはRX72Nの内蔵RAMを使えば良い/配置すれば良いですよね。

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

    思い出しました。実験目的段階の定番は以下でした。

    (A) e2 studio (or CS+などでも)の機能でダウンロード前にSDRAM制御レジスタを初期化しておく
    (B) 先の投稿の(3)のプログラムをそのまま素朴にSDRAMへダウンロードする

    かふぇルネで、先日、そのような話題に関して他の人にリプライしたような記憶があるのですけれども探してみます。

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

    先ほどの、そのような話題に関するスレッドですけれども、以下のスレッドです。

    e2studioのデバッグ時のGDBコマンドについて
    japan.renesasrulz.com/cafe_rene/f/forum21/7931/e2studio-gdb
     

  • NoMaYさん こんばんは

    回答ありがとうございます。

    (A) e2 studio (or CS+などでも)の機能でダウンロード前にSDRAM制御レジスタを初期化しておく
    (B) 先の投稿の(3)のプログラムをそのまま素朴にSDRAMへダウンロードする

    (3) もうひとつは、以下を行う本番のもの(セクション設定は全てをSDRAMに配置する設定)
    (3-1) こちらのプロジェクトのresetprg.cからmain()を呼び出す、そしてmain()以降で以下を行う
    (3-2) ミスポさんのNORTiやTCP/IPスタックやUSBスタックやアプリケーションの何もかもの初期化やら実行やらを普通に行う
    (3-3) 内蔵フラッシュ(および 外付けシリアルフラッシュ)の書き換え

    上記を参考にして以下のようにやっております。

    セクション設定は全てをSDRAMに配置する設定

    以下のようにしております。間違いあれば指摘ください。

     ────┬───────────────────────┬──────

      アドレスセクション                                    │メモリ

      ────┼───────────────────────┼──────

      08000500│B_1,R_1,B_2,R_2,B,R                             │外部SDRAM

      08800000│STACK                                            │外部SDRAM

      0890000 │STACK_END                                     │

      FFC00000│P,C_1,D_1,C_2,D_2,VECT,C,D,W*,L,C$DSEC,C$BSEC │内蔵ROM

      FFFFFF80│FIXEDVECT                                     │

      ────┴───────────────────────┴──────

    SDRAM制御レジスタを初期化

    main()を呼び出す、そしてmain()以降で以下を行う
    RTOSやTCP/IPスタックやアプリケーションのなどの初期化やら実行やらを普通に行う
    実際に普通に動作はしているのですが、肝心のmain関数以降がデバッカで動かしたところ
    0xFFC00000以降の値になっており、やはりROMで動いている。


    以下のセクションにして

      ────┬───────────────────────┬──────

      アドレスセクション                                    │メモリ

      ────┼───────────────────────┼──────

      08000500│B_1,R_1,B_2,R_2,B,R,RPRAM        │外部SDRAM

      08800000│STACK                                         │外部SDRAM

      0890000 │STACK_END                                     │

      FFC00000│P,C_1,D_1,C_2,D_2,VECT,C,D,W*,L,C$DSEC,C$BSEC │内蔵ROM

                 ,PRAM

      FFFFFF80│FIXEDVECT                                     │

      ────┴───────────────────────┴──────


    main関数の上に#pragma section P PRAMを書くと、
    main関数のところだけSDRAM(08000500~)で動いている。

    main関数以降すべてのプログラムをSDRAM(08000500~)で動かすにはどのようにすればいいのでしょうか。。。