内蔵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"

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

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

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

Parents
  • 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バイト?

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

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

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

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

Children

  • 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~)で動かすにはどのようにすればいいのでしょうか。。。

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

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

    ここは、こうですよ。

    08000500│B_1,R_1,B_2,R_2,B,R,P,C_1,D_1,C_2,D_2,VECT,C,D,W*,L,C$DSEC,C$BSEC│外部SDRAM

    [追記]

    それから、PRAMセクションやRPRAMセクションは無しにして下さい。

  • NoMaYさん こんにちは

    やってみたのですが、上手くいきません。

    RAM関係の初期化の前に止まってしまいます。。。

    お手上げ状態になっています。

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

    > RAM関係の初期化の前に止まってしまいます。。。

    これは具体的には、どのソースのどこで止まるのですか?
    あと、念の為の確認ですが、デバッガのCPUリセットボタンを押した時、resetprg.cのスタートアップルーチンの
    先頭に実行マークが表示されて、ステップ実行するとちゃんとステップ実行されていきますでしょうか?

    今のやり方の考え方は素朴で、

    (1) デバッガでSDRAM制御レジスタの設定を正しく行いプログラムを丸ごとSDRAM領域にデバッガでダウンロードする(リセットベクタは除く)
    (2) リセットベクタは内蔵フラッシュメモリに配置する(というか、0xFFFFFFFC番地以外に配置することは出来ない)
    (3) CPUリセットするとPCがresetprg.cのスタートアップルーチンの先頭に来る(スタートアップルーチンは上記(1)でSDRAM上にダウンロードされている)
    (4) ステップ実行するとSDRAM上にダウンロードされたスタートアップルーチンをステップ実行していく

    (5) ステップ実行していくと、やがてmain()へPCが移る(このmain()も上記(1)でSDRAM上にダウンロードされている)
    (6) そこから、Go実行すると、main()から呼ばれるNORTiの初期化ルーチンやら最初のタスクやら後続のタスクやら、上記(1)でSDRAM上にダウンロードされたものが、どんどんSDRAM上で実行されていく
    (7) 割り込みベクタテーブルも割り込みルーチンも、上記(1)でSDRAM上にダウンロードされたものが、どんどんSDRAM上で実行されていく

    というものなのですけれども。

    すみません、MAPファイルをzipファイルに固めてリプライに添付して頂くなどして、見せて頂けませんか?

    あと、上記(1)で、SDRAM制御レジスタの設定、と書いてしまったのですが、SDRAMが普通に使えるようになる為の全ての設定が必要です。もしかしたら、SDRAM制御レジスタという範疇から少し外れたレジスタの設定も必要かも知れません。

  • NoMaYさん こんにちは

    NORTiのプログラムなので少しことなるのですが、リセット処理といったらいいのでしょうか。
    CPUの初期化(RAMの初期化、CPUのモード設定)の前で止まっており、そもそもステップ実行が

    一回もできない状態です。

    以下のマップファイルはプログラムをROMで動かしているときのマップです。
    map.zip

    おおまかな処理の流れはわかりました。

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

    ステップ実行が1回も出来ないとのことですけれども、その状況が分る画面コピーを見せて頂けないでしょうか?また、無意識に(今までのクセで)つい最初にデバッガのCPUリセットボタンを押してしまったりしていないでしょうか?(押してしまうとSDRAM制御レジスタが初期化されますので、スタートアップルーチンのフェッチも出来なくなります。)

    それで、そのことで思い出したのですけれども、NORTi独自のスタートアップルーチンがある(というかFIT/CGは使っていない)ですけれども、ダウンロード後のPCの値は、そのスタートアップルーチンの先頭でしょうか?CPUリセットしてはいけませんので、プログラム中(リンカが生成したabsファイル中)の、とある情報、を使いデバッガがPCの値をスタートアップルーチンの先頭に移動させるというのを想定していたのですが、その、とある情報、を生成させるようなソースコードなりリンカオプションなりになっているのかどうか気になります。また、正直なところ今更ですが、e2 studioでやったくれていたかな?、とも気になり始めています。(でも、もしそうなら、皆さんどうされていたのかな、とも。)

    ソースの記述の場合: #pragma entry 関数名
    リンカオプションの場合: -entry=_関数名

    それで、MAPファイルですが、SDRAMにダウンロードする場合のものも見せて頂けませんか?それと、先ほど頂いたROMにダウンロードする場合のものを見て気付いたのですが、以下のセクションが含まれていましたけれども、これらはどうなっていますか?今まで頂いた投稿の中で記載されていなかっただけで、実際はセクション設定されていますか?それともリンク時にワーニングになっていたりしませんか?

    B_8 (現状サイズ0)
    R_8
    C_8
    D_8