|
Работа с константами в CodeVision |
|
|
|
Jul 10 2007, 20:15
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 10-07-07
Из: Москва
Пользователь №: 29 044

|
Подскажите как указать компилятору на размещение константы в нужном адресе во FLASH в CodeVision?
|
|
|
|
|
Jul 11 2007, 05:38
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(Apollo @ Jul 11 2007, 02:15)  Подскажите как указать компилятору на размещение константы в нужном адресе во FLASH в CodeVision? Никак. Зачем тебе это? Фёмвеа защитить что-ли хочешь?
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Jul 11 2007, 07:22
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(pokos @ Jul 11 2007, 14:34)  Чото я не пойму, что тут имеется в виду под константами. Вообще, константы используются только на этапе компиляции. Поэтому они нигде не размещаются. #define - это команда препроцессору С, вообще-то. #define это макрос для препроцессора. Но ни что не мешает использовать подобное выражение const unsigned char ABC; при этом в СИ это будет обыкновенная переменная, но защищенная от записи и разместиться она в ОЗУ. СИ++ по возможности уже постарается не занимать память под константу, если это возможно. В случае CodeVision делается примерно так __flash (или flash) тип_переменной имя_переменной. Подобная переменная будет размещена во FLASH памяти. Какой смысл размещать что-то по определенному адресу, не знаю... Наверно проще потом указатель взять от такой переменной. Вот здесь довольно интересные сведения и ссылка на хорошую книжку по СИ/СИ++. Очень рекомендую!
--------------------
Выбор.
|
|
|
|
|
Jul 11 2007, 07:33
|
Местный
  
Группа: Участник
Сообщений: 270
Регистрация: 29-06-06
Пользователь №: 18 445

|
Ага. Если про то, что называется константами в CV, так оно в хелпе написано:
Constants are stored in FLASH memory, to specify this you must use the flash or const keywords. Constant expressions are automatically evaluated during compilation. Example:
flash int integer_constant=1234+5; flash char char_constant=’a’; flash long long_int_constant1=99L; flash long long_int_constant2=0x10000000; flash int integer_array1[]={1,2,3}; /* The first two elements will be 1 and 2, the rest will be 0 */ flash int integer_array2[10]={1,2}; flash int multidim_array[2,3]={{1,2,3},{4,5,6}}; flash char string_constant1[]=”This is a string constant”; const char string_constant2[]=”This is also a string constant”;
Constants can’t be declared inside functions.
|
|
|
|
|
Jul 11 2007, 08:48
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 10-07-07
Из: Москва
Пользователь №: 29 044

|
Цитата(pokos @ Jul 11 2007, 10:33)  Ага. Если про то, что называется константами в CV, так оно в хелпе написано: Это я читал, но в том-то и дело, что о способе размещения констант по определённому адресу ничего не написано. Упоминается лишь оператор @ для указания адреса в ОЗУ. Цитата(zhevak @ Jul 11 2007, 08:38)  Никак. Зачем тебе это? Фёмвеа защитить что-ли хочешь? Нет. Просто есть загрузчик написаный ранее и расположенный в конце FLASH, а также есть перед загрузчиком область памяти основной программы с некими нужными коэффициентами - константами, используемыми МК в работе. Константы олжны находиться в определённой странице FLASH так, чтобы при обновлении ПО загрузчиком можно было отдельно перезаписать только страницу с константами. Сейчас я пишу основную программу, которая должна считывать эти константы из FLASH. Проблема в том как их разместить начинаяс нужного адреса. В АСМе проблем не было. просто указывал типа .org 0x0123 и всё, после этой строчки можно было обьявлять строку байт, а вот в CodeVision я не нашёл ничего по этому поводу. Выходит какой-то недоделышь этот CVAVR?
|
|
|
|
|
Jul 11 2007, 09:23
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Ой! Уважаемый, Вы пожалуйста не сердитесь на нас, на прожженых паяльниками и дебаггерами, а поясните цель своего весьма экстравагантного подхода. Возможно, Ваша проблема (ради которой нужно размещать константу только по указанному заранее адресу во флеш-памяти) будет решена более простым способом. Или делайте как уже тут ранее предлагали: обращайтесь к константе через указатель на нее. А адрес памяти, где она будет размещена, оставьте на откуп компилятору/линковщику. Ну, еще как не гарантированный вариант: попробуйте поиграться с ассемблерным файлом, который CV всегда создает при компиляци проекта. Поправьте этот файл ручками так, как Вам надо, и отдайте его на "съедение" какому-либо ассемблеру. Цитата(Apollo @ Jul 11 2007, 14:48)  Нет. Просто есть загрузчик написаный ранее и расположенный в конце FLASH, а также есть перед загрузчиком область памяти основной программы с некими нужными коэффициентами - константами, используемыми МК в работе. Константы олжны находиться в определённой странице FLASH так, чтобы при обновлении ПО загрузчиком можно было отдельно перезаписать только страницу с константами. Сейчас я пишу основную программу, которая должна считывать эти константы из FLASH. Проблема в том как их разместить начинаяс нужного адреса. Хм... задача. Если это действительно константы, то какая разница, на каком адресе они сидят при компиляции новой версии? Значения констант изначально опредены в программе. Если прога претерпевает изменения и ее новую версию нужно заново "залить" в МК, то и заливайте ее вместе с теми же констаттами. Пусть они находятся по другим адресам. Минусы -- ну чуть больше нужно будет времени на программирование. Если констант не очень много, может воспользоваться внутренним EEPROM? Если много -- внешний подвесить (SPI или I2C). Цитата В АСМе проблем не было. просто указывал типа .org 0x0123 и всё, после этой строчки можно было обьявлять строку байт, а вот в CodeVision я не нашёл ничего по этому поводу. Выходит какой-то недоделышь этот CVAVR? Асм -- на то и Асм, что бы ручками указывать адреса. Си -- как раз и был создан для того, что бы у программера мозги работали на решение задачи, а не отвлекались на рапределение памяти. Что же касается "недоделыша", это Вы зря так. У каждой среды разработки и компилятора есть сильные и слабые стороны. Если компилятор что-то в принципе не умеет делать, просто, смените компилятор.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Jul 11 2007, 09:27
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
CVAVR недоделышь ... всё больше в этом убеждаюсь. Была заморочка ... делал так: В cvavr.exe заменяете avrasm2.exe на avrasm2.bat и рядом с ним кладете avrasm2.bat, в котором вызываете уже сам exe-файл ... этому батнику передается куча параметров ... Так вот. Из батника перед асмомо вызывал утилиту ... не помню названия, которая заменяла строки определенных коментов на нужные доп. асм-вставки ... получалось очень даже прикольно  Но так я делал, ибо задачка была почти сделана и переписывать под другой компилятор было лень ... теперь вот WinAvr колупаю.
|
|
|
|
|
Jul 11 2007, 09:39
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
_____ P.S. Если вы возмущены, кто это недоделыш ... то спешу исправится ... он хорош ... для начала ... может я просто уже подрос немного .. вот он и кажется таким  Цитата а также есть перед загрузчиком область памяти основной программы с некими нужными коэффициентами Загрузчик, видать, на своем месте ... константы ПЕРЕД загрузчиком.
|
|
|
|
|
Jul 11 2007, 10:02
|
Местный
  
Группа: Участник
Сообщений: 270
Регистрация: 29-06-06
Пользователь №: 18 445

|
Цитата(AndryG @ Jul 11 2007, 13:39)  Загрузчик, видать, на своем месте ... константы ПЕРЕД загрузчиком. Тогда непонятно беспокойство. zhevak всё прекрасно написал.
|
|
|
|
|
Jul 11 2007, 10:24
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 10-07-07
Из: Москва
Пользователь №: 29 044

|
Цитата(zhevak @ Jul 11 2007, 13:23)  Ну, еще как не гарантированный вариант: попробуйте поиграться с ассемблерным файлом, который CV всегда создает при компиляци проекта. Поправьте этот файл ручками так, как Вам надо, и отдайте его на "съедение" какому-либо ассемблеру. А, кстати, идея! Но к сожалению этот продукт я должен отдать другим людям и объяснять им в описании как надо лечить кривизну CVAVR не очень красиво. Им нужно написать тупо, чтобы изменить то-то надо залезть туда-то и потом откомпилировать. Цитата(zhevak @ Jul 11 2007, 13:23)  Хм... задача.
Если это действительно константы, то какая разница, на каком адресе они сидят при компиляции новой версии? Значения констант изначально опредены в программе. Если прога претерпевает изменения и ее новую версию нужно заново "залить" в МК, то и заливайте ее вместе с теми же констаттами. Пусть они находятся по другим адресам. Минусы -- ну чуть больше нужно будет времени на программирование. Эти константы нужно будет считывать и загрузчиком (находящемся в области загрузчика) и из основной программы. Поэтому их адрес должен быть неизменен, так как загрузчик меняться не будет. При перезаливке ПО через загрузчик возможны варианты, когда полностью переписывается и ПО и область констант, а возможен вариант, когда переписывается только ПО. Но адрес констант должен быть один и тот же
Сообщение отредактировал Apollo - Jul 11 2007, 10:26
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|