3

ATtiny2313Vが7x5LEDマトリックスを制御して、スクロールするテキストを表示するプロジェクトがあります。テキストを表示するために、プログラムの残りの部分と一緒にフラッシュに保存されるフォントを作成しました。

フォント全体を含むプログラム全体は、1106バイトを使用します。しかし、それをチップにロードすると、実行されていないようです。代わりに、いくつかのLEDを点灯させるだけで、それだけです。

ただし、ほとんどのフォントを削除し、AからJの文字だけでコンパイルすると、プログラムのサイズは878バイトで、問題なく動作します。

これは、AVRフラッシュメモリのある種のオーバーフローが原因ですか?

ATtiny2313Vのデータシートには、2Kバイトのフラッシュがあると書かれています。1106バイトが多すぎるのはどうしてですか?

更新:明確にするために、私が使用しているツールチェーンはAVR Studio(コードをコンパイルするため)であり、次にAVRDudeを使用してマイクロコントローラーにアップロードします。私の知る限り、AVRStudioはavr-gccのバージョンを使用してコードをコンパイルします。

4

3 に答える 3

7

使用しているツールチェーンはわかりませんが、avr-gccでは、データをフラッシュに保存してアクセスするためにヘッダーを使用する必要があります。データはまだメモリにロードされているため<avr/pgmspace.h>、データを宣言するだけでは不十分です。constランタイムであるため、フラッシュとRAMの両方でスペースを占有します(他の初期化された変数と同様)。

詳細については、ユーザーマニュアルヘッダードキュメントを確認してください。使用法は非常に簡単です。フラッシュでchar配列を宣言するには、次のPROGMEMマクロを使用します。

char data[] PROGMEM = {0xc4, 0x77}; // etc

次に、データにアクセスするには、提供されているマクロを使用する必要があります

char d = pgm_read_byte(&(data[i]));

編集:avrdudeは、グローバル変数や静的変数などのRAMの静的に割り当てられた部分(.dataおよび.bss)のみを報告することにも注意してください。スタック用のスペースを残す必要があります-プログラムに正確に依存します(ヒント:再帰悪い)。

于 2009-10-27T06:05:50.227 に答える
2

SOには魔法のようなものがあることを誓います。私は何週間も頭を悩ませ、これを理解しようとしました、そしてここで質問をした後-私はついに私を顔で見つめているものを見ることができます!

以下は、フォントにAJ文字のみを使用してコンパイルするためのメモリ使用量です。

AVR Memory Usage
----------------
Device: attiny2313

Program:     872 bytes (42.6% Full)
(.text + .data + .bootloader)

Data:         82 bytes (64.1% Full)
(.data + .bss + .noinit)

そして、ここでも、AZという文字が付いています。

AVR Memory Usage
----------------
Device: attiny2313

Program:     952 bytes (46.5% Full)
(.text + .data + .bootloader)

Data:        162 bytes (126.6% Full)
(.data + .bss + .noinit)

データのを参照してください126.6%?おっと!本当にあふれました!

于 2009-10-19T20:41:58.737 に答える
1

スタックがオーバーフローしていないことを確認しますか?これにより、検出が難しいクラッシュが発生する可能性があります。スタックサイズは、コンパイラ/リンカー設定のどこかに設定するか、一部のローカル変数をグローバル変数に変換することができます。組み込みプロセッサは通常、スタックオーバーフローのチェックを行わず、クラッシュするだけです。

于 2009-10-19T10:04:06.060 に答える