新井と申します。
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/