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もある場合には関係ないかもしれませんが。
東京高専 情報工学科 小坂敏文