Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: const в ИАР
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
at90
Раньше работал в кодэвижен. Но теперь нада портировать Uc/gui для AVR.
В кодэвижене это проблемно.
Cобрал проект для меги 128 + внешнее озу 32kb + индикатор 320 на 240.
Но постоянно не хватает стэка. Походу он переменные с CONST не помещает во влэш.
Пытался вместо const посавить __flash. Но много ошибок на нессответсвие типов.
И проект сдишком огромный. кучу текста нада перелопачивать.
Можно как нить побороть эту беду.
Сергей Борщ
Цитата(at90 @ Jun 8 2006, 09:07) *
Раньше работал в кодэвижен. Но теперь нада портировать Uc/gui для AVR.
В кодэвижене это проблемно.
Cобрал проект для меги 128 + внешнее озу 32kb + индикатор 320 на 240.
Но постоянно не хватает стэка. Походу он переменные с CONST не помещает во влэш.
Пытался вместо const посавить __flash. Но много ошибок на нессответсвие типов.
И проект сдишком огромный. кучу текста нада перелопачивать.
Можно как нить побороть эту беду.

1) использовать const __flash
2) обратить внимание на описание параметров функций, которым эти константы передаются (тоже должны быть описаны как const __flash)
rezident
Может имеет смысл константы объединить в структуру и работать с ней через указатели?
IgorKossak
Чтобы не так много было переделывать, определите макроподстановку
Код
#define const __flash

в каком-нибудь заголовочном файле и включите этот файл во все файлы проекта или, что проще, но требует работы в IDE, включите это определение в опции компилятора (где-то в препроцессоре, сейчас не вспомню).
_Sam_
могу ошибаться, но попробуйте добавить к опциям компилятора параметр -y, по идее это должно помочь.
at90
Цитата(_Sam_ @ Jun 8 2006, 16:41) *
могу ошибаться, но попробуйте добавить к опциям компилятора параметр -y, по идее это должно помочь.


А ГДЕ В ОПЦИЯХ ЕГО ДОБАВИТЬ?
GetSmart
Может не по делу, но...
Если описывать const внутри процедуры, то она будет в ram. Надо писать static const ...
dxp
Цитата(GetSmart @ Jun 9 2006, 07:09) *
Может не по делу, но...
Если описывать const внутри процедуры, то она будет в ram. Надо писать static const ...

Зависит от... В С const по умолчанию имеет внешнее связывание, поэтому компилятор должен размещать этот объект в памяти - вдруг на него есть ссылки из других единиц компиляции (ЕК). В С++ const имеет внутреннее связывание, поэтому у компилятора нет никаких причин пихать объект в память при условии, что он не объявлен extern и нигде внутри этой ЕК не берется адрес этого констатнтого объекта. Чтобы в С добиться ++ного поведения, можно, как Вы и сказали, использовать static, указывая, что объект локальный (для данной ЕК), снаружи не виден. Т.ч. по умолчанию зависит от того, включен ли режим ++ (--ec++, --eec++).
at90
Вроде с такой вот штукой скомпилировалось нормально.

#pragma constseg=FAR_F
Nikson1200
Цитата(at90 @ Jun 9 2006, 08:07) *
Вроде с такой вот штукой скомпилировалось нормально.
#pragma constseg=FAR_F


скомпилироваться-то оно скомпилируется. а будет ли работать? smile.gif
у меня - нет sad.gif

занимаюсь тем же самым что и автор темы в 2006-ом году и пришёл к той же проблеме - большие массивы (шрифты для ucGUI) добровольно не хотят размещаться во flash. или дописывать __flash перед константой (и править много-много функций, использующих их), или попробовать вот таким вышеуказанным методом. да, массив разместили во flash, компилятор проглотил. а теперь все эти функции пытаются использовать данные, расположенные совсем не там где надо (отсюда или мусор вместо букв, или пустота).

насколько я понял, происходит вот это (из мануала):
"if you want to place an object in flash, you can use any of the memory attributes __tinyflash, __flash, __farflash, or __hugeflash. The object becomes a flash object, which means you cannot take the address of it and store it in a default pointer.

However, it is possible to store the address in either a __flash pointer or a __generic pointer, though neither of these are default pointers.

Note that if you attempt to take the address of a constant __flash object and use it as a default pointer object, the compiler will issue an error. If you make an explicit cast of the object to a default pointer object, the error message disappears, instead there will be problems at run-time as the cast cannot copy the object from the flash memory to the data memory.
"

получается, выхода нет? или я неправ?

PS. очень интересно было бы услышать мнение автора темы.. хотя 2006-ой год....sad.gif
Сергей Борщ
Цитата(Nikson1200 @ Jan 23 2009, 00:29) *
или дописывать __flash перед константой (и править много-много функций, использующих их),
Именно так. Или менять архитектуру процессора на другую, с одним адресным пространством. Это ведь не прихоть авторов компилятора - процессору действительно нужны другие команды, чтобы обращаться к данным во флеш (вы в этом убедились наглядно). И нет никакого другого способа сообщить компилятору об этом. Ведь ключевое слово const всего лишь указывает, что данные нельзя изменять. Вы можете объявить параметр функции с квалификатором const и компилятор будет следить, чтобы вы случайно не изменили этот параметр, только и всего. Сделать вывод о расположении данных и, следовательно, способе доступа к ним он не может, необходима ваша подсказка в виде квалификатора __flash, __eeprom или его отсутсвия.
Nikson1200
Сергей Борщ,
спасибо! smile.gif
west329_
unsigned char __flash mymac[6] = {0xAA,0xBB,0xCC,0xDD,0xEE,0xFF};
unsigned char __flash ip_google[4] = {81,19,70,1};


__no_init unsigned char __eeprom myip_eeprom[4];
__no_init unsigned char __eeprom ipaddr_gate_eeprom[4];
Nikson1200
Цитата(Сергей Борщ @ Jan 23 2009, 04:12) *
Именно так. Или менять архитектуру процессора на другую, с одним адресным пространством. Это ведь не прихоть авторов компилятора - процессору действительно нужны другие команды, чтобы обращаться к данным во флеш (вы в этом убедились наглядно). И нет никакого другого способа сообщить компилятору об этом. Ведь ключевое слово const всего лишь указывает, что данные нельзя изменять. Вы можете объявить параметр функции с квалификатором const и компилятор будет следить, чтобы вы случайно не изменили этот параметр, только и всего. Сделать вывод о расположении данных и, следовательно, способе доступа к ним он не может, необходима ваша подсказка в виде квалификатора __flash, __eeprom или его отсутсвия.

значит так.... редактирую я исходники библиотеки и чувствую что терпения не хватает - слишком много надо всего перелопатить. быть может есть какой-нить компилятор который автоматически решает проблему размещения const во flash и последующего обращения к этим данным?
(чувствую что наверное проще будет внешнюю RAM поставить и пускай шрифты туда ложаться sad.gif )
Dog Pawlowa
Цитата(Nikson1200 @ Jan 28 2009, 17:24) *
быть может есть какой-нить компилятор который автоматически решает проблему размещения const во flash ..

Конечно! IAR для контроллеров фоннеймановской архитектуры! biggrin.gif
Nikson1200
блин, ощущаю себя полным лузером sad.gif

в недрах ucGUI был найден комментарий
Код
/* Define "universal pointer". Normally, this is not needed (define will expand to nothing)
   However, on some systems (AVR - IAR compiler) it can be necessary ( -> __generic),
   since a default pointer can access RAM only, not the built-in Flash
*/
Сергей Борщ
Цитата(Nikson1200 @ Jan 28 2009, 18:56) *
блин, ощущаю себя полным лузером sad.gif
Доведите работу до конца, а потом сравните результат по скорости и объему. Будет приятно удивлены, почувствуете себя победителем драконов wink.gif
alux
Вставлю и я свои пять копеек smile.gif

1) Если необходимо править много текста, например замена xxx на yyy, пользуйтесь командами IAR:
Edit -> Find and Replace -> Replace.
Многие этого не знают и делают это вручную...

2) Если размер программы превышает 64кБ, необходимо пользоваться __farflash или __hugeflash вместо __flash.
Модификатор __hugeflash отличается от __farflash тем, что указатель на объект во флеши допускает пересечение границы 64кБ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.