реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Почему константа не ложится во флэш?
Sirko
сообщение Feb 24 2011, 21:01
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Вот строчка кода,
Код
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.
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 24 2011, 21:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Там нет ответа?
Go to the top of the page
 
+Quote Post
Sirko
сообщение Feb 24 2011, 21:50
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



В ТАМ нарисовано много всяких полезностей, а чуть рядышком, в соседней ТАМ, деже есть примеры.
Но в примерах использованы строки и массивы, а что самое удивительное, то строки и уменя сидят там, где им положено сидеть. А вот с константой, чето не срастается. Если можно носом куда-нибудь по конкретнее.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 24 2011, 23:04
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Sirko @ Feb 24 2011, 23:01) *
а вот к ней матюк.
это бага гцц.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Sirko
сообщение Feb 25 2011, 00:01
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Спасибо Сергей.

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

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

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

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

И опять таки, народ на форуме обсуждал строки. Возможно я делаю что то не так?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 25 2011, 00:33
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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);


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Sirko
сообщение Feb 25 2011, 01:39
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Большое спасибо.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 25 2011, 09:32
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Забыл const:
CODE
__attribute__((section(".progmem.filename.variable_name")))
static int const Var  = -628;
То, что avr-gcc пропускает такие косяки - плохо sad.gif На днях, правда, начали исправлять, но начали почему-то с несущественного. Самое главное "still need to be addressed"


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 25 2011, 09:43
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



хм... а я не смог повторить багу - PROGMEM в любом месте не вызывает никаких проблем:
PROGMEM const int Var = -623;
const PROGMEM int Var = -623;
const int PROGMEM Var = -632;
const int Var PROGMEM = -623;

может, компилятор дюже древний у вас? у меня 20100110


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 25 2011, 11:00
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ARV @ Feb 25 2011, 11:43) *
хм... а я не смог повторить багу - PROGMEM в любом месте не вызывает никаких проблем:
А вы C++ включите и получите в полном объеме - не только warning но и в некоторых случаях размещение не в тех секциях.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 25 2011, 11:06
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Сергей Борщ @ Feb 25 2011, 14:00) *
А вы C++ включите и получите в полном объеме - не только warning но и в некоторых случаях размещение не в тех секциях.
ах вон оно что!


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 25 2011, 11:20
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ARV @ Feb 25 2011, 13:06) *
ах вон оно что!
Дык
QUOTE
./src/menu.cpp



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 07:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01459 секунд с 7
ELECTRONIX ©2004-2016