Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Почему константа не ложится во флэш?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Sirko
Вот строчка кода,
Код
const int Var PROGMEM = -628;

а вот к ней матюк.
Цитата
./src/menu.cpp:30: warning: only initialized variables can be placed into program memory area


Причем матюк справедливый, поскольку int x = Var; отрабатывает корректно, значит Var сидит в оперативке.

Вопрос: че компилятору от меня нужно. laughing.gif

AVR GCC
WinAVR-2010.01.10
Makefile взят из примеров scmRTOS.
rezident
Там нет ответа?
Sirko
В ТАМ нарисовано много всяких полезностей, а чуть рядышком, в соседней ТАМ, деже есть примеры.
Но в примерах использованы строки и массивы, а что самое удивительное, то строки и уменя сидят там, где им положено сидеть. А вот с константой, чето не срастается. Если можно носом куда-нибудь по конкретнее.
Сергей Борщ
QUOTE (Sirko @ Feb 24 2011, 23:01) *
а вот к ней матюк.
это бага гцц.
Sirko
Спасибо Сергей.

Я по нерусски к сожалению, только с букварем.
Насколько я понял из "Бага ГСС", то народ пришел к выводу, что от сообщений можно избавиться,
заменив PROGMEM на __attribute((section(".progmem.something"))).

т.е. в моем случае сторка будет выглядеть так:
static int __attribute((section(".progmem.something"))) Var = -628;

Эффект действительно есть, предупреждение не выводится, значение константы теперь не в озу, но где оно???

int x = *((int*)(pgm_read_word(&Var)));
на экране мусор.

И опять таки, народ на форуме обсуждал строки. Возможно я делаю что то не так?
Сергей Борщ
QUOTE (Sirko @ Feb 25 2011, 02:01) *
т.е. в моем случае сторка будет выглядеть так:static int __attribute((section(".progmem.something"))) Var = -628;

Я делаю
CODE
__attribute__((section(".progmem.filename.variable_name")))
static int Var  = -628;
Т.е. располагаю атрибут строкой выше и имя секции начинается (обязательно) c .progmem, а далее идет либо просто имя переменной для глобальной, либо имя_файла.имя_переменной для глобальной статической либо имя_класса::имя_переменной. Т.е. имя секции для каждой переменной должно быть уникальным - это позволит линкеру выкинуть неиспользуемые (ключ --gc-sections).
QUOTE (Sirko @ Feb 25 2011, 02:01) *
Эффект действительно есть, предупреждение не выводится, значение константы теперь не в озу, но где оно???
Можно поискать в листинге.
QUOTE (Sirko @ Feb 25 2011, 02:01) *
int x = *((int*)(pgm_read_word(&Var)));
на экране мусор.
Оно и понятно - вы запутались в указателях. Все проще. int x = pgm_read_word(&Var);
Sirko
Большое спасибо.
Сергей Борщ
Забыл const:
CODE
__attribute__((section(".progmem.filename.variable_name")))
static int const Var  = -628;
То, что avr-gcc пропускает такие косяки - плохо sad.gif На днях, правда, начали исправлять, но начали почему-то с несущественного. Самое главное "still need to be addressed"
ARV
хм... а я не смог повторить багу - PROGMEM в любом месте не вызывает никаких проблем:
PROGMEM const int Var = -623;
const PROGMEM int Var = -623;
const int PROGMEM Var = -632;
const int Var PROGMEM = -623;

может, компилятор дюже древний у вас? у меня 20100110
Сергей Борщ
QUOTE (ARV @ Feb 25 2011, 11:43) *
хм... а я не смог повторить багу - PROGMEM в любом месте не вызывает никаких проблем:
А вы C++ включите и получите в полном объеме - не только warning но и в некоторых случаях размещение не в тех секциях.
ARV
Цитата(Сергей Борщ @ Feb 25 2011, 14:00) *
А вы C++ включите и получите в полном объеме - не только warning но и в некоторых случаях размещение не в тех секциях.
ах вон оно что!
Сергей Борщ
QUOTE (ARV @ Feb 25 2011, 13:06) *
ах вон оно что!
Дык
QUOTE
./src/menu.cpp

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.