ビルドが通らない…配列のサイズがtoo large?
すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。
ぼちぼちっとソフトのほう、ATmega128に移植中なのですが、困ったことにビルドが通りません。変だなーと思って、問題の部分を抜き出してやってみましたが、やっぱりビルドが通りません。抜き出してみたプログラムはこんな感じです。
#include <avr/io.h>
#include <avr/pgmspace.h>
const char GacData[32768] PROGMEM = { 0 };
void main( void )
{
while( 1 );
}
色の違う行が問題のポイントです。これは、「32kByteのデータをプログラム領域にとる」というものですが、これをGDL(V1.7.6.0)にてビルドすると、”error: size of aray ‘GacData’ is too large”というメッセージが出て、コンパイルが通りません。「GacData配列のサイズが大きすぎます」ということでしょうけど、32kByteだけです。Flash ROMはATmega128の場合、128kByteも載っています。
で、この配列数を「32768」から「32767」にすると、今度は問題なくビルドできます。なんだか微妙に中途半端!?現在、調査中ですが、今のところさっぱりわかっていません。不思議だなぁ。誰かわかる方、いらっしゃいますか?
2006/12/13追記
いずみかわさんと織田さんからコメントがあったので、ちょっと追試をしてみました。
short型…16383まではOK。
long型…8191まではOK。
GDLでもWinAVRでも同じ(って、コンパイラが同じだから同じなんでしょうねー)。ということで、いずみかわさんの言われるように、配列一発で取れるサイズの限界値を符号付きの16bitで見ている、という見解が正しそうです。いずみかわさん、織田さん、コメントありがとうございます。うーん、こまった。far型アクセスというのもあるようですが、どうも使い方がわからんです。上記以下の配列は複数宣言(PROGMEM一杯まで)できるので、それであとはアクセス関数かまして、ストレージな感じでアクセスできるような仕組みにしようかな。
コンパイラが16ビットを『符号付』で判定してるっぽいですねぇ...