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