Фокусы компилятора при работе с памятью

Обсуждаем контроллеры компании Atmel.
Ответить
Yoruk91
Родился
Сообщения: 12
Зарегистрирован: Вс май 23, 2010 15:19:36

Фокусы компилятора при работе с памятью

Сообщение Yoruk91 »

Здравствуйте уважаемые радиолюбители!

Хотел бы узнать ваше мнение по поводу маленькой проблемы, а то скоро разобью себе голову об стол. :kill: :kill: :kill:
Я делаю устройство, которое по замыслу должно активно взаимодействовать с пользователем через интерфейс RS-485, т.е оно будет находиться на удалений и будет трудно досягаемым для пользователей. Устройство активно взаимодействует с пользователем посредством текстовых сообщений на каждый чих. Т.е в Flash памяти МК должен храниться полный набор текстовых сообщений на все случаи жизни.
Проблема :
Не могу стандартными средствами заставить поместить массив с указателями на строки в Flash память.
В кусочке кода демонстрируется фрагмент работы с часами DS3231

//Дни недели

Код: Выделить всё

const char DS3231_Day1 [] PROGMEM ="Sun ";
const char DS3231_Day2 [] PROGMEM ="Mon ";
const char DS3231_Day3 [] PROGMEM ="Tue ";
const char DS3231_Day4 [] PROGMEM ="Wed ";
const char DS3231_Day5 [] PROGMEM ="Thu ";
const char DS3231_Day6 [] PROGMEM ="Fri ";
const char DS3231_Day7 [] PROGMEM ="Sat ";


Вот тут по замыслу из часов пришла циферка 2 из регистра «День недели» и мы плавно передаем данные в обрабатывающий центр "Mon ";
Собственно, вычисление нужной строки происходит тут :

Код: Выделить всё

char* Day_Pointer [] PROGMEM = { DS3231_Day1,DS3231_Day2,
                  DS3231_Day3,DS3231_Day4,
                  DS3231_Day5,DS3231_Day6,
                  DS3231_Day7};


И почему то стала появляться ошибка, которой раньше не было.

Error 1 variable 'Day_Pointer' must be const in order to be put into read-only section by means of '__attribute__((progmem))' C:\Work\Protos\Task_2\Task_2.c 38 7 Rob

Он просит сделать константой, но это не помогает

Без директивы Progmem программа не ругается, но из массива «Day_Pointer» попадается не то что надо. Использовались стандартные директивы чтения а-ля:

(pgm_read_word(&Day_Pointer [val]));

И тому подобные…

Так же использовалось следующее руководство

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=38003&start=all&postdays=0&postorder=asc


Замена массив на :

Код: Выделить всё

PGM_P Day_Pointer [] PROGMEM = { DS3231_Day1,DS3231_Day2,
                          DS3231_Day3,DS3231_Day4,
                          DS3231_Day5,DS3231_Day6,
                          DS3231_Day7};


Завенчалась успехом с ошибкой

Error 1 variable 'Day_Pointer' must be const in order to be put into read-only section by means of '__attribute__((progmem))' C:\Work\Protos\Task_2\Task_2.c 38 7 Rob

Хотя сама директива PGM_P подразумевает const char*

Прошу вашей помощи.

Целевой МК : Xmega32a4u
IDE: AVR Studio 6.1.2730 SP-2

Перейти на IAR не предлагать !!!

P.S Левой пяткой последнее время подумываю перейти на какие ни будь-мелкие АРМы (LPC800/LPC11xx), а то сюрпризы вроде работающего драгона по PDI только с последними ревизиями микросхем (особенно серия A1), ремонта кабеля для jtag ice 3 начинают утомлять.
mrFox
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Пт сен 21, 2007 17:53:23
Откуда: Зарайск

Re: Фокусы компилятора при работе с памятью

Сообщение mrFox »

Yoruk91 писал(а):Здравствуйте уважаемые радиолюбители!
...

Код: Выделить всё

PGM_P Day_Pointer [] PROGMEM = { DS3231_Day1,DS3231_Day2,
              DS3231_Day3,DS3231_Day4,
              DS3231_Day5,DS3231_Day6,
              DS3231_Day7};

...

есть такое подозрение, что компилятор ARM пошлет туда-же
- здесь нужен const массив указателей на const (еще одие const забыл)
вроде вот так

Код: Выделить всё

PGM_P const Day_Pointer [] PROGMEM = {...}; 

или

Код: Выделить всё

PGM_P *const Day_Pointer PROGMEM = {...}; 
Ответить

Вернуться в «AVR»