Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с константами в CodeVision
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Apollo
Подскажите как указать компилятору на размещение константы в нужном адресе во FLASH в CodeVision?
zhevak
Цитата(Apollo @ Jul 11 2007, 02:15) *
Подскажите как указать компилятору на размещение константы в нужном адресе во FLASH в CodeVision?


Никак.
Зачем тебе это? Фёмвеа защитить что-ли хочешь?
jasper
В WinAVR можно.
pokos
Чото я не пойму, что тут имеется в виду под константами. Вообще, константы используются только на этапе компиляции. Поэтому они нигде не размещаются. #define - это команда препроцессору С, вообще-то.
vet
ничто не мешает обращаться к нужному адресу через указатель.
haker_fox
Цитата(pokos @ Jul 11 2007, 14:34) *
Чото я не пойму, что тут имеется в виду под константами. Вообще, константы используются только на этапе компиляции. Поэтому они нигде не размещаются. #define - это команда препроцессору С, вообще-то.

#define это макрос для препроцессора. Но ни что не мешает использовать подобное выражение const unsigned char ABC; при этом в СИ это будет обыкновенная переменная, но защищенная от записи и разместиться она в ОЗУ. СИ++ по возможности уже постарается не занимать память под константу, если это возможно.
В случае CodeVision делается примерно так __flash (или flash) тип_переменной имя_переменной. Подобная переменная будет размещена во FLASH памяти.
Какой смысл размещать что-то по определенному адресу, не знаю... Наверно проще потом указатель взять от такой переменной.
Вот здесь довольно интересные сведения и ссылка на хорошую книжку по СИ/СИ++. Очень рекомендую!
pokos
Ага. Если про то, что называется константами в 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.
Apollo
Цитата(pokos @ Jul 11 2007, 10:33) *
Ага. Если про то, что называется константами в CV, так оно в хелпе написано:


Это я читал, но в том-то и дело, что о способе размещения констант по определённому адресу ничего не написано. Упоминается лишь оператор @ для указания адреса в ОЗУ.



Цитата(zhevak @ Jul 11 2007, 08:38) *
Никак.
Зачем тебе это? Фёмвеа защитить что-ли хочешь?


Нет. Просто есть загрузчик написаный ранее и расположенный в конце FLASH, а также есть перед загрузчиком область памяти основной программы с некими нужными коэффициентами - константами, используемыми МК в работе. Константы олжны находиться в определённой странице FLASH так, чтобы при обновлении ПО загрузчиком можно было отдельно перезаписать только страницу с константами. Сейчас я пишу основную программу, которая должна считывать эти константы из FLASH. Проблема в том как их разместить начинаяс нужного адреса.
В АСМе проблем не было. просто указывал типа .org 0x0123 и всё, после этой строчки можно было обьявлять строку байт, а вот в CodeVision я не нашёл ничего по этому поводу. Выходит какой-то недоделышь этот CVAVR?
zhevak
Ой!

Уважаемый, Вы пожалуйста не сердитесь на нас, на прожженых паяльниками и дебаггерами, а поясните цель своего весьма экстравагантного подхода. Возможно, Ваша проблема (ради которой нужно размещать константу только по указанному заранее адресу во флеш-памяти) будет решена более простым способом.

Или делайте как уже тут ранее предлагали: обращайтесь к константе через указатель на нее. А адрес памяти, где она будет размещена, оставьте на откуп компилятору/линковщику.

Ну, еще как не гарантированный вариант: попробуйте поиграться с ассемблерным файлом, который CV всегда создает при компиляци проекта. Поправьте этот файл ручками так, как Вам надо, и отдайте его на "съедение" какому-либо ассемблеру.

Цитата(Apollo @ Jul 11 2007, 14:48) *
Нет. Просто есть загрузчик написаный ранее и расположенный в конце FLASH, а также есть перед загрузчиком область памяти основной программы с некими нужными коэффициентами - константами, используемыми МК в работе. Константы олжны находиться в определённой странице FLASH так, чтобы при обновлении ПО загрузчиком можно было отдельно перезаписать только страницу с константами. Сейчас я пишу основную программу, которая должна считывать эти константы из FLASH. Проблема в том как их разместить начинаяс нужного адреса.


Хм... задача.

Если это действительно константы, то какая разница, на каком адресе они сидят при компиляции новой версии? Значения констант изначально опредены в программе. Если прога претерпевает изменения и ее новую версию нужно заново "залить" в МК, то и заливайте ее вместе с теми же констаттами. Пусть они находятся по другим адресам. Минусы -- ну чуть больше нужно будет времени на программирование.

Если констант не очень много, может воспользоваться внутренним EEPROM? Если много -- внешний подвесить (SPI или I2C).

Цитата
В АСМе проблем не было. просто указывал типа .org 0x0123 и всё, после этой строчки можно было обьявлять строку байт, а вот в CodeVision я не нашёл ничего по этому поводу. Выходит какой-то недоделышь этот CVAVR?


Асм -- на то и Асм, что бы ручками указывать адреса. Си -- как раз и был создан для того, что бы у программера мозги работали на решение задачи, а не отвлекались на рапределение памяти.
Что же касается "недоделыша", это Вы зря так. У каждой среды разработки и компилятора есть сильные и слабые стороны. Если компилятор что-то в принципе не умеет делать, просто, смените компилятор.
AndryG
CVAVR недоделышь ... всё больше в этом убеждаюсь.

Была заморочка ... делал так:
В cvavr.exe заменяете avrasm2.exe на avrasm2.bat и рядом с ним кладете avrasm2.bat, в котором вызываете уже сам exe-файл ... этому батнику передается куча параметров ...
Так вот. Из батника перед асмомо вызывал утилиту ... не помню названия, которая заменяла строки определенных коментов на нужные доп. асм-вставки ... получалось очень даже прикольно smile.gif

Но так я делал, ибо задачка была почти сделана и переписывать под другой компилятор было лень ... теперь вот WinAvr колупаю.
pokos
Если я правильно понял, то нужно прикрутить новую программу к существующему загрузчику?
Кстати, а почему загрузчик находится не в области загрузчика?
AndryG
_____
P.S.
Если вы возмущены, кто это недоделыш ... то спешу исправится ... он хорош ... для начала ... может я просто уже подрос немного .. вот он и кажется таким smile.gif




Цитата
а также есть перед загрузчиком область памяти основной программы с некими нужными коэффициентами

Загрузчик, видать, на своем месте ... константы ПЕРЕД загрузчиком.
pokos
Цитата(AndryG @ Jul 11 2007, 13:39) *
Загрузчик, видать, на своем месте ... константы ПЕРЕД загрузчиком.

Тогда непонятно беспокойство. zhevak всё прекрасно написал.
Apollo
Цитата(zhevak @ Jul 11 2007, 13:23) *
Ну, еще как не гарантированный вариант: попробуйте поиграться с ассемблерным файлом, который CV всегда создает при компиляци проекта. Поправьте этот файл ручками так, как Вам надо, и отдайте его на "съедение" какому-либо ассемблеру.

А, кстати, идея! Но к сожалению этот продукт я должен отдать другим людям и объяснять им в описании как надо лечить кривизну CVAVR не очень красиво. Им нужно написать тупо, чтобы изменить то-то надо залезть туда-то и потом откомпилировать.



Цитата(zhevak @ Jul 11 2007, 13:23) *
Хм... задача.

Если это действительно константы, то какая разница, на каком адресе они сидят при компиляции новой версии? Значения констант изначально опредены в программе. Если прога претерпевает изменения и ее новую версию нужно заново "залить" в МК, то и заливайте ее вместе с теми же констаттами. Пусть они находятся по другим адресам. Минусы -- ну чуть больше нужно будет времени на программирование.


Эти константы нужно будет считывать и загрузчиком (находящемся в области загрузчика) и из основной программы. Поэтому их адрес должен быть неизменен, так как загрузчик меняться не будет. При перезаливке ПО через загрузчик возможны варианты, когда полностью переписывается и ПО и область констант, а возможен вариант, когда переписывается только ПО. Но адрес констант должен быть один и тот же
AndryG
А как можно перелить ПО, не переливая константы. если они будут в проекте с ПО?

Может разделить Вашу задачу на ТРИ части:
загрузчик - залили и забыли
константы - проект представляет из себя просто набор констант
ПО - основная программа, в которой к константам обращаемся через указатели.

Это я к чему .. просто порылся в CVAVR ... нашел параметр RESETVECTOR в файле проекта.
Попробуйте сделать проект для меги16-загрузчик ... и посмотреть параметры в файле проекта ... может еще что найдете.

А может вообще вынести константы с проекта и "набивать" их редактируя файл для прошивки?

если константы должны изменятся юзерами ... может им простейшую программку-конфигуратор на комп надо?

Если Ваш загрузчик пишет HEX файлы .. то этот конфигуратор может генерить небольшой HEX с нужными адресами ... или редактировать готовый файл ... конфигуратор получится элементарный ... в отдельном файле прописываем название параметра и адрес его в HEX.

мало инфы ... давайте подробней о загрузчике и константах .. кто они и для кого.
Apollo
Цитата(AndryG @ Jul 11 2007, 15:13) *
А как можно перелить ПО, не переливая константы. если они будут в проекте с ПО?

Может разделить Вашу задачу на ТРИ части:
загрузчик - залили и забыли
константы - проект представляет из себя просто набор констант
ПО - основная программа, в которой к константам обращаемся через указатели.

Хочу сделать первичную прошивку, которая будет зашиваться при изготовлении устройства и иметь в себе все три части: приложение, константы и загрузчик.

Цитата(AndryG @ Jul 11 2007, 15:13) *
А может вообще вынести константы с проекта и "набивать" их редактируя файл для прошивки?

если константы должны изменятся юзерами ... может им простейшую программку-конфигуратор на комп надо?

Возможно придётся поступить так.

Цитата(AndryG @ Jul 11 2007, 15:13) *
мало инфы ... давайте подробней о загрузчике и константах .. кто они и для кого.

Константы нужны для подстройки АЦП, так скажем вывод их на ноль. Собранная и обработанная информация будет передаваться по сети (неважно какой) и по этой же сети нужно при необходимости обновлять приложение или подстраивать АЦП меняя только константы.
zhevak
Цитата(Apollo @ Jul 11 2007, 17:54) *
Хочу сделать первичную прошивку, которая будет зашиваться при изготовлении устройства и иметь в себе все три части: приложение, константы и загрузчик.
Возможно придётся поступить так.
Константы нужны для подстройки АЦП, так скажем вывод их на ноль. Собранная и обработанная информация будет передаваться по сети (неважно какой) и по этой же сети нужно при необходимости обновлять приложение или подстраивать АЦП меняя только константы.


Не-е, что-то я не очень понимаю. 07.gif

1. Почему нельзя использовать ЕЕПРОМ для этих констант?

2. А изначально константы уже прошиты уже где-то во флешке? Или это есть самая первая прошивка МК? Для самой первой прошивки, я думаю, пойдет сособ корреции HEX-файла ручкам. Достаточно один раз это сделать. Потом прошить и забыть про эти константы. А обращение к ним из программы осуществлять по указателю.

3. Рассмотрите такой вариант: чем отличается загрузчик от основной проги, кроме того, что она сидит на других адресах и стартует немного по другому? Может быть научить загрузчик отличать код программы от кода констант, т.е. прогу он прошьет в одно место, а константы отправит в другое?
Сергей Борщ
Цитата(Apollo @ Jul 11 2007, 14:54) *
Слушайте сюда. Есть у меня решение вашей проблемы, не требует шаманства с ассемблерным файлом, но требует использования инлайнового асма, и вообще выглядит ужасно. Вот пример размещения асм-функции по определенному адресу:
Код
#asm
    .CSEG
Magic:    ;****Store current address location
    .org    (0x17F2>>1)
    LDI    R16,1500/100
    RET
    .org    (0x17F6>>1)
    LDI    R16,900/100
    RET

    .org    (0x17FA>>1)
    LDI    R16,600/100
    RET
                                  
    .org    Magic;****Restore address location
#endasm
Я вам даю идею, вы ее развиваете дальше. Естественно, что точно также соответствующими директивами можно разместить не только код, но и данные. Вам осталось только разобраться, как объявить в этом асм-коде видимую из С-кода метку и как присвоить эту метку константному указателю на структуру. А впрочем и это не нужно - адрес вам известен. Минус - работа через указатель. Не знаю, насколько хорошо CV оптимизирует константные указатели. Возможно, что обрамив объявление вашей константы в
Код
#asm
    .CSEG
Magic:    ;****Store current address location
    .org    FREQ_0
#endasm

и

#asm
    .org    Magic;****Restore address location
#endasm
вам удастся разместить и саму структуру и таким образом обойтись без указателя.
Apollo
Спасибо всем! В общем решил .asm файл, полученный при компиляции дополнять ассемблерными вставками в начале с определениями и инклудами и в конце с константами и загрузчиком. В общем получилось так-как хотелось, но конечно криво всё это.
defunct
Цитата(Apollo @ Jul 11 2007, 13:24) *
Эти константы нужно будет считывать и загрузчиком (находящемся в области загрузчика) и из основной программы. Поэтому их адрес должен быть неизменен, так как загрузчик меняться не будет. При перезаливке ПО через загрузчик возможны варианты, когда полностью переписывается и ПО и область констант, а возможен вариант, когда переписывается только ПО. Но адрес констант должен быть один и тот же

Я поступил иначе, я не стал встраивать никаких левых констант в программу прошивки, т.к. программ может быть много, размер флеша в разных кристалах разный, и можно просто механически промазать с адресами. Написал прогу, которая любую откомпилированную программу (.hex) перепаковывает в бинарник и добаляет страничку информации для бутлоадера. Страничка это конечно не главное (в ней хранится CRC всей прошивки, версия программы, тип железа, дата создания и т.п.), основная функция этой программы - зашифровать бинарник, чтобы его можно было свободно высылать пользователям. В этой программе я и задаю все требующиеся константы для бутлоадера.
Apollo
Это я тоже применю, но на следующих этапах разработки продукта. На этом этапе хотелось просто скомпилировать всё одновременно, вот и налетел на такую проблемку.
defunct
Цитата(Apollo @ Jul 11 2007, 19:48) *
Это я тоже применю, но на следующих этапах разработки продукта. На этом этапе хотелось просто скомпилировать всё одновременно, вот и налетел на такую проблемку.

Если вы это будете применять, то сейчас может стоит забыть про константы "по определенному адресу".
Программка которая будет добавлять к "hex'у" нужные вам строки по требуемым адресам пишется за час.
VDG
Цитата(Apollo @ Jul 11 2007, 14:24) *
Им нужно написать тупо, чтобы изменить то-то надо залезть туда-то и потом откомпилировать.

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