2016-10-12 2 views
-1

Добрый день,Как хранить константы в ROM (Atmel)

Я пишу прошивки для ATMega645A с помощью AtmelStudio 7. Я начинаю проект локализации и необходимость вывода сообщений на дисплей 16х2 символов в 3-х различных языках , Существующие (английские сообщения) хранятся в SRAM, но в конечном итоге я переполняю это пространство для хранения данных, если мне нужно утроить количество сообщений.

ТАК, я пытаюсь сохранить сообщения в ПЗУ, где пространство - много. Проблема заключается в том, что примечания приложения Atmel либо (а) неверны, либо (б) неполны, потому что я попробовал несколько методов в соответствии с их предложением и код не компилируется (ref: Atmel Tips & Tricks App Note doc8453.pdf page 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 
}; 

внутри основной (пустоты) У меня есть следующий:

char buffer[10]; 
PGM_P p; 
int i; 

memcpy_P(&p, &string_table[i], sizeof(PGM_P)); 
strcpy_P(buffer, p); 

При компиляции, я получаю сообщение: переменной «string_table» должна быть константным для того, чтобы быть помещается в раздел только для чтения с помощью атрибута «» ((progmem)) '

0 Я пытаюсь использовать' char 'вместо' const char ', но ничего не похоже на компиляцию. Любые рекомендации по правильному синтаксису для получения этих статических символьных строк, которые будут храниться в ПЗУ, будут с благодарностью оценены.

+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» на самом деле является тем, что отправлено на дисплей). Я надеюсь, что это поможет другим, у которых были подобные проблемы, получая константы в ПЗУ и из него.

+0

Итак, вы точно знаете, что сообщение об ошибке говорило вам, что вам нужно делать !? – Clifford