グッド日、(アトメル)
私はローカリゼーションプロジェクトを開始し、3つの異なる言語で16×2の文字表示にメッセージを表示する必要があるのですAtmelStudio 7.使用してATMega645A用のファームウェアを書いています。既存の(英語のメッセージ)はSRAMに保存されていますが、メッセージの数を3倍にしなければならないと、このデータメモリスペースがあふれてしまいます。
だから、スペースが十分あるROMにメッセージを格納しようとしています。問題はAtmelのアプリケーションノートが(a)間違っているか、(b)不完全であるということです。提案ごとに複数のメソッドを試していて、コードがコンパイルされていないためです(Atmel Tips &トリックアプリケーションノートdoc8453.pdf 8ページ、http://www.atmel.com/webdoc/AVRLibcReferenceManual/FAQ_1faq_rom_array.html) 。私は、次のしているメイン(無効)内部
// before main(void)
#include <avr/pgmspace.h>
const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";
const char string_3[] PROGMEM = "String 3";
const char string_4[] PROGMEM = "String 4";
const char string_5[] PROGMEM = "String 5";
PGM_P string_table[5] PROGMEM =
{
string_1,
string_2,
string_3,
string_4,
string_5
};
:ようにするために 変数「string_table」でなければなりませんconstの:
char buffer[10];
PGM_P p;
int i;
memcpy_P(&p, &string_table[i], sizeof(PGM_P));
strcpy_P(buffer, p);
コンパイル、私はメッセージを取得する私のコードは次のようになりますアトリビュート((progmem)) '
私は' const char 'の代わりに' char 'を試しましたが、何もコンパイルされていないようです。これらの静的文字列をROMに格納するための適切な構文に関するアドバイスは、非常に高く評価されます。
だから、 'PGM_P'とは何ですか? – Olaf
問題は変数 'string_table'です。 Constとしてそれを宣言してください。また、 'int i'を初期化していません。 – Swanand
@Swanand:[mcve]がなければ、これは答えることができません。 – Olaf