|
const в ИАР |
|
|
|
Jun 8 2006, 07:13
|

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

|
Цитата(at90 @ Jun 8 2006, 09:07)  Раньше работал в кодэвижен. Но теперь нада портировать Uc/gui для AVR. В кодэвижене это проблемно. Cобрал проект для меги 128 + внешнее озу 32kb + индикатор 320 на 240. Но постоянно не хватает стэка. Походу он переменные с CONST не помещает во влэш. Пытался вместо const посавить __flash. Но много ошибок на нессответсвие типов. И проект сдишком огромный. кучу текста нада перелопачивать. Можно как нить побороть эту беду. 1) использовать const __flash 2) обратить внимание на описание параметров функций, которым эти константы передаются (тоже должны быть описаны как const __flash)
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 9 2006, 04:20
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(GetSmart @ Jun 9 2006, 07:09)  Может не по делу, но... Если описывать const внутри процедуры, то она будет в ram. Надо писать static const ... Зависит от... В С const по умолчанию имеет внешнее связывание, поэтому компилятор должен размещать этот объект в памяти - вдруг на него есть ссылки из других единиц компиляции (ЕК). В С++ const имеет внутреннее связывание, поэтому у компилятора нет никаких причин пихать объект в память при условии, что он не объявлен extern и нигде внутри этой ЕК не берется адрес этого констатнтого объекта. Чтобы в С добиться ++ного поведения, можно, как Вы и сказали, использовать static, указывая, что объект локальный (для данной ЕК), снаружи не виден. Т.ч. по умолчанию зависит от того, включен ли режим ++ (--ec++, --eec++).
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 22 2009, 22:29
|
Группа: Участник
Сообщений: 14
Регистрация: 21-05-08
Из: Беларусь, г. Минск
Пользователь №: 37 699

|
Цитата(at90 @ Jun 9 2006, 08:07)  Вроде с такой вот штукой скомпилировалось нормально. #pragma constseg=FAR_F скомпилироваться-то оно скомпилируется. а будет ли работать?  у меня - нет  занимаюсь тем же самым что и автор темы в 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-ой год....
Сообщение отредактировал Nikson1200 - Jan 22 2009, 23:11
|
|
|
|
|
Jan 23 2009, 01:12
|

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

|
Цитата(Nikson1200 @ Jan 23 2009, 00:29)  или дописывать __flash перед константой (и править много-много функций, использующих их), Именно так. Или менять архитектуру процессора на другую, с одним адресным пространством. Это ведь не прихоть авторов компилятора - процессору действительно нужны другие команды, чтобы обращаться к данным во флеш (вы в этом убедились наглядно). И нет никакого другого способа сообщить компилятору об этом. Ведь ключевое слово const всего лишь указывает, что данные нельзя изменять. Вы можете объявить параметр функции с квалификатором const и компилятор будет следить, чтобы вы случайно не изменили этот параметр, только и всего. Сделать вывод о расположении данных и, следовательно, способе доступа к ним он не может, необходима ваша подсказка в виде квалификатора __flash, __eeprom или его отсутсвия.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 23 2009, 08:52
|
Группа: Участник
Сообщений: 14
Регистрация: 21-05-08
Из: Беларусь, г. Минск
Пользователь №: 37 699

|
Сергей Борщ, спасибо!
|
|
|
|
|
Jan 28 2009, 13:24
|
Группа: Участник
Сообщений: 14
Регистрация: 21-05-08
Из: Беларусь, г. Минск
Пользователь №: 37 699

|
Цитата(Сергей Борщ @ Jan 23 2009, 04:12)  Именно так. Или менять архитектуру процессора на другую, с одним адресным пространством. Это ведь не прихоть авторов компилятора - процессору действительно нужны другие команды, чтобы обращаться к данным во флеш (вы в этом убедились наглядно). И нет никакого другого способа сообщить компилятору об этом. Ведь ключевое слово const всего лишь указывает, что данные нельзя изменять. Вы можете объявить параметр функции с квалификатором const и компилятор будет следить, чтобы вы случайно не изменили этот параметр, только и всего. Сделать вывод о расположении данных и, следовательно, способе доступа к ним он не может, необходима ваша подсказка в виде квалификатора __flash, __eeprom или его отсутсвия. значит так.... редактирую я исходники библиотеки и чувствую что терпения не хватает - слишком много надо всего перелопатить. быть может есть какой-нить компилятор который автоматически решает проблему размещения const во flash и последующего обращения к этим данным? (чувствую что наверное проще будет внешнюю RAM поставить и пускай шрифты туда ложаться  )
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|