[H8-ML(4504)] Re: SRAM増設時のSUB ファイル等の設定について行き詰まりました
From: "T. Kosaka" <kosaka@xxxxxxxxxxxxxx>
Date: 2004年02月23日(月)02時22分58秒
wakuさん

こんばんは。小坂です。

---- Original message From: "Yuki WAKUDA"---- 
>これによると,例えば,X[500]は今,main内で
>#######
>int    X[500];
>for(i=0;i<500;i++){
>X[i] = ○○;
>}
>#######
>というような使い方をしていますが,これはRセクションとBセクシ
ョンのどちらなのでしょうか.

main()
{
    int x[500];
    :
}
この記述で,配列xは自動変数なのでスタック領域に実行時に作られ
ます。

>  mov.l #H'0FFF10,er7 
でしたので,スタック領域は0FFF10からアドレスの若い方に向かっ
て確保されます。xはリンク時に作られる変数ではないので,Rとか
Bセクションにはなりません。それでmapファイルにはなにも表示さ
れないのです。
この例ではスタック領域が内部RAM(4kbyteだったかな)におかれる
設定になっているので,大きな配列はとれません。

CASE1 外部RAM領域にスタックを置きたいならer7に外部RAMの最終
アドレス+1以下で最大の2の倍数を設定します。こうすると大きな
配列をスタックに取ることができます。(このようなスタイルは好
まれないと思いますが)

CASE2 スタックの置き場を変更せずに,大きな配列をBセクション
に置きたいなら
main()
{
    static int x[2000];
    :
}
のように記述します。(この方法が自然だと思います)
static変数は隠蔽された変数なのでmapファイルには現れませんが,
Bセクションのサイズが大きくなってそれとわかると思います。

CASE3 他の関数からこの配列をアクセスすることがあるのなら関数
の外部に

int x[2000];

main()
{
    :
}

と記述します。
この記述では変数xがmapファイルに現れます。


蛇足ですが,500個の定数を記述するなら
関数の内部外部を問わず
const int x[500]={
    123,345,654,23,123,...........500個の定数
}
のように記述するとCセクション(ROM領域)に配置され,貴重なRAM
資源を無駄にしません。
外部RAMが1Mもある場合には関係ないかもしれませんが。
東京高専 情報工学科 小坂敏文
スレッド概略
[表示中](起点)


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]