This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

static 変数の初期値有りの問題

SuperH RISC engine family V.9.04 Release 03を使用しています。

C言語において、下記の変数の記述が、ROMに配置されて困っています。

static size_t xFreeBytesRemaining = 0U;

mapファイルの内容は下記になります。

_xFreeBytesRemaining 0001f550 4 data ,l * <-ROMのアドレス

期待値は、RAMに配置されて、初期値のみが、ROMとしたいです。

ご指導ください。

  • わわいです

    初期値付きの変数はDセクションに配置されます。

    このDセクションはROMに配置されますが、実行時にはRAMに移動する必要があります

    これには、リンカの設定で、DセクションのコピーをRセクションとして指定し、RセクションをRAMのエリアに配置します。

    ということで、お使いのコンパイラ(ツールチェイン)のマニュアルにそこら辺の解説が書いてありますので読んでみてください。

    また、SuperHではHEWかE2Studioの統合開発環境を使うことになると思いますが、いずれも、新規プロジェクトを生成するとそこら辺のセクションのコピーを前提としたソースが自動生成されますんで、そゆのを見るのも参考になると思います

    追記ですが、この話題は定期的にでてくるようで、以下のスレッドが参考になると思います

    http://japan.renesasrulz.com/cafe_rene/f/69/t/3519.aspx

  • int value=0;

    int data=1;

    void main(void)

    {

    value=1;

    data=2;

    printf("結果=%d,%d \r",value,data);

    }

    結果=1,2

    先の0,1がD(ROM)がvalueとdataがB(RAM),関数内指定ではスタックS、初期値付きではB

    となると思います,

  • プログラム規模が小さいためにRAMに変数領域を取る必要が無いのでは?

    コンパイルリストもチェックしてみるのが良いです。

    static宣言していても汎用レジスタで事が済んでいる可能性もあり得ます。

  • アドバイス頂きました皆様、有難う御座います。

    基本的に、初期化している変数はDATAセクションに配置されるのですね。

    LINKオプションにて次の様にすると、良いことが分かりました。

     -ROM=D=R

    セクション設定にて B,R とする。

    ここからは、余談です。

     実は、修正前は、そのようになっていました。

     この状態で、割込みベクタがRAMに配置されておりました。

     私は、割込みベクタをROMに配置したかったので、上記の指定を削除してしまいました。

     無事ROMに配置されて、OKと思っていたのですが、別の弊害が発生しいたのですね。

     浅はかでした。

  • わわいです

    そういう場合は、割り込みベクタに別のセクション名をつけて、それをROMのエリアに配置するようにします。

    まあ、そこらへんはコンパイラ/リンカのマニュアルを見てください。

  • 本当に大丈夫ですか?カフェルネを見ている多くのユーザーがあります。納得できる結論が必要です。

    例えば、SH7147ならROM(フラッシュ)はアドレスH'00000000からH'003FFFFで割り込み(例外)ベクターは H'00000000から配置されるのでは?「私は、割込みベクタをROMに配置したかった」で「セクション設定を変更して、xFreeBytesRemainingに配置してしまった」、は少し理解に苦しみます。

    SHコンパイラはアンインストールしてしまったので確認ができませんが、全体的な話の流れが理解できません。セクションDやBなどIKUZO さんとわわいさん・osieteさんの書き込みで不一致のように感じます。

    メモリーの具体的な構成と具体的なマイコン名をお教えください。SH4ですか?

  • 混乱を招いてしまった様です。

    CPUは、SH7147です。

    経緯を変更前と変更後で記載します。

    [変更前]

    ベクタの記述部

    #pragma section  ←セクション名無し

    void* INT_Vectors[] = {

    変数の記述

    static size_t xFreeBytesRemaining = 0U;

    LINKオプション

     -ROM=D=R

     セクション B,R/0FFFF8000

    この状態ですと、下記のセクション配置でした。

     INT_Vectors →Rセクション

     xFreeBytesRemaining  →Rセクション

    私は、INT_Vectors をROMに配置したかったので、次の様に変更をした。

    [変更後]

    ベクタの記述部

    #pragma section INTTBL ←セクション名を設定

    void* INT_Vectors[] = {

    変数の記述(変更無し)

    static size_t xFreeBytesRemaining = 0U;

    LINKオプション

     -start=DVECTTBL,DINTTBL,PIntPRG/00 ←VECTTBLの後にINTTBLを配置

     下記の2項目は、削除しました。

      -ROM=D=R

      セクション R (B/0FFFF8000のみの設定)

    この状態で、INT_VectorsがROMに配置されたので、安心した次第です。

    xFreeBytesRemaining = 0U;の様な初期値有りの変数の配置を確認しなかった。

    影響が出ると考えていなかったのです。

    --------------------------------------------------------------------------------

    いざ、プログラムを動作する段階になって、xFreeBytesRemainingがROMに配置されている事に気がついた訳です。

    そこで再変更です。

    [再変更]

    LINKオプション

     下記の2項目は、復活させた。

      -ROM=D=R

      セクションR

    これで、下記の配置と成りました。

     INT_Vectors →ROM

     xFreeBytesRemaining  →(RAM)Rセクション

    以上が経緯と成ります。

  • 割り込みベクタをROMに配置したいなら

    const void* INT_Vectors[] = {
    

    では?

  • わわいです

    えーと、SHコンパイラ、リンカの世界では、デフォルトではプログラムコードはP、定数はC、初期値付きの変数はD、初期値なし変数はBというセクション名に割り当てられます。

    これが理解できないというなら、マニュアルをDLしてきて読んでみましょう。

    #解決済みのものをまぜっかえしてもどーしよーもないとおもいますが。。

    んで、constというキーワードは、あくまで変更できない変数、というだけのはなしで(Cコンパイラの規定)、それを付けたからと言って自動的にROMに割り当てられるというものではありませんです(リンカの設定の問題)。

    #まあ、デフォルトのセクション構成では、constつければたしかにROM に配置されることになりますが(Cセクションになるので)

  • 何かアサッテの方向のレスがされてますが、ROMに配置するデータにconstを付けない理由はないと思います。