内蔵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バイト?


  • 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を使えば良い/配置すれば良いですよね。

Reply
  • 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を使えば良い/配置すれば良いですよね。

Children
No Data