ビルドが通らない…配列のサイズがtoo large?

公開日:  最終更新日:2014/06/05

すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。

ℹ️本記事にはPRが含まれています。

ぼちぼちっとソフトのほう、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一杯まで)できるので、それであとはアクセス関数かまして、ストレージな感じでアクセスできるような仕組みにしようかな。

  • このエントリーをはてなブックマークに追加
  • Pocket

関連前後記事

Comment

  1. いずみかわ より:

    コンパイラが16ビットを『符号付』で判定してるっぽいですねぇ...

  2. 織田 より:

    多分、コンパイラの仕様だと思います。
    違うタイプのデータ(int etc)で総数が 32768 前後を試してみてください。

  3. SiSO より:

    いずみかわさん、織田さん、コメントありがとうございます。ちょっといろいろ試してみたんですが、どうも「サイズを符号付きで16bit判定している」ような感じです。何か、別の方法を考える事にします。

  4. 仕事中にチラ見でレス。
    mallocしてポインタでアクセスとか。

  5. いずみかわ より:

    ~出張帰りの新幹線車中から~
    AVRのプログラム領域のFLASHはアーキテクチャ上、基本的にはワード単位のアクセスなので、そのせいですかね?

  6. SiSO より:

    C:olonたんの中の人(技)さん>
    仕事中コメントありがとうございます。うーん、でも欲しいのが、FLASH(ROM)エリアでの宣言(しかも初期化付き)なんで、mallocは無理っぽいです。
    いずみかわさん>
    そうですねー、それでも16kジャストならともかく、16k-1というのは微妙な感じ(気が付いたときはちょっと苦笑してしまいました)。さて、どうしたものかな。

  7. いずみかわ より:

    そうなるとおっしゃるように4Kとか8Kとかの配列に区切って、それらに対して仮想的にリニアにアクセスするような関数を用意するのがよさげですね。
    それだとデータを格納しているメモリが変わっても(例えば外部ROMやSDカード等)、関数の内部実装変えるだけで互換性が保てそうですし
    ところで、FLASHに保持しようとしているのはモーションデータですか?

  8. SiSO より:

    いずみかわさん>
    うわ、さすがいずみかわさん、「ストレージ」という言葉を使った理由を既に把握されている~!入れるデータは、サーボ補正定義、モーションなどです。目標は、シリアルEEPROM等の代わりにストレージとして使い、アプリケーションから書き込みできるようにすることです。ATmega128の場合、1万回(LPC2138なら10万回いけます)書き換えが可能なので、実用範囲だと思っています。そうすることで、開発環境のないPCからでもシリアルでちょいちょいとモーションデータ修正できるようになるといいな、と思っています。…が、1年計画ぐらいで実装予定です。(^_^;
    当面は、データ初期値設定のソースコードを吐き出して、それをビルドしてプログラムと一緒に流し込むつもりです。

  9. SiSO より:

    前のコメントで「16k」は「32k」の間違い…。

  10. いずみかわ より:

    いやいや、自分である程度プログラム書く人ならみんなそう思いますよ。
    お手軽という事なら、miniSDやmicroSDがおすすめです。
    これならPCからメディアリーダ使って書き込めますから。
    次号のトラ技で特集やるみたいですし、C用のライブラリはどこかにありましたよ。
    このへん、「初歩の初歩、まとめて公開しますよ」といしかわさん、人形つかいさんに言ったままでした。冬休みの宿題かな。

  11. SiSO より:

    SDカードもおもしろそうですねー。次のトラ技は買うことにします。いずみかわさんのは、miniSDでしたよね!

織田 へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*

PAGE TOP ↑