2016-10-12 4 views
-1

グッド日、(アトメル)

私はローカリゼーションプロジェクトを開始し、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に格納するための適切な構文に関するアドバイスは、非常に高く評価されます。

+1

だから、 'PGM_P'とは何ですか? – Olaf

+1

問題は変数 'string_table'です。 Constとしてそれを宣言してください。また、 'int i'を初期化していません。 – Swanand

+0

@Swanand:[mcve]がなければ、これは答えることができません。 – Olaf

答えて

0

一日中、多くの試行錯誤の試みこれで騒ぎの後、私は次のを思い付いた:

変更コンパイルするようだ

`PGM_P string_table[5] PROGMEM =` 

`PGM_P const string_table[5] PROGMEM =` 

に行私はディスプレイ上に文字列 "buffer"の内容を表示することができます( "String 1"は実際にディスプレイに送られるものです)。私はこれがROMの内外で定数を取得する同様の問題を抱えている他の人に役立つことを願っています。

+0

エラーメッセージがあなたにする必要があることを正確に察知してください! – Clifford

関連する問題