[H8-ML(365)] Re: 秋月Cコン広域変数の件
From: Kenji Arai <kenjia@xxxxxxxxxxxx>
Date: 1999年10月08日(金)22時14分50秒
新井と申します。

On Fri,  8 Oct 1999 19:48:02 +0900
mikami.16@xxxxxxxxxxxx wrote:
> 開発は秋月のCコンパイラを使用してますが、最近気になることが発生。
> 広域変数の動作がおかしく、思うように動きません。
> 熊谷研のHP(大変参考になってます)を見ると、対策が載っているのですが、アセン
> ブラで記入しないといけないみたいで...

全くの憶測ですが、
(1)パワーオン後に熊谷研のHPにある様に単に_mainにジャンプしてませんか?
(2)広域変数は、初期値を設定していませんか?
例えば下記の様に、
/***********  Extern Data in RAM ************/
char	Buf = 0;			/* RS232 receive char */
int     data0 = 2;
unsigned int data1 = 1;

この二つの条件を満たしていれば、秋月のCコンパイラのバグではなく、使い方が
悪いだけです。
ANSI準拠の仕様を展開すると、大域変数は、(宣言の際の)初期化を許しています。
従って、コンパイラはこの値を何らかの形で、実行ファイルに引き継ぐ必要があ
ります。パソコンの様に、RAM内でプログラムが実行されるのであれば、初期値を
持つデータと実行ファイルを、RAMに単純にロードすれば済みます。しかしAKI
H8のボードで動作する場合は、ROM(FLASH)内にプログラムを予め書いておきます
が、初期値を持つデータはどうすれば良いでしょうか?
一般的には、ROM内に書いておきます。但し、ROMですからその値を変え様とする
と変えられません。そこで、ROMデータを_mainにサブルーチンコールする前に、
RAM内にコピーします。
MAPファイルを覗いてみて下さい。広域変数が、RAMに割り付けられているか否か
が見られるはずです。

解決方法
-------簡単な方法--------
広域変数の初期値を入れないで下さい。
/***********  Extern Data in RAM ************/
char	Buf;			/* RS232 receive char */
int     data0;
unsigned int data1;
とだけ書きます。次に、
void main(void)
{
	Buf = 0;
	data0 = 2;
	data1 = 1;
	.
	.
	.
	
}
の様に、初めにプログラムの最初に初期化します。これで動くはずです。何故で
しょうか? Cコンパイラは、初期化データ領域Dと未初期化データ領域Bを識別し
ます。従って先の例は、D領域(ROM)に入り、単に変数を定義した場合はB領域
(RAM)に入ります。
残念ながら、熊谷研のHPの方法では、初期値を持つ大域変数がうまく設定出来ま
せん。

--------本格的な対策-------------------
私のホームページを10月10日以降にアクセスして下さい。(日本語の方に書いてお
きます)


-------------------------------------------
Kenji Arai
E-mail:  kenjia@xxxxxxxxxxxx
         jh1pjl@xxxxxxxx 
URL http://www.page.sannet.ne.jp/kenjia/
スレッド概略
[表示中](起点)


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


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