Перейти к содержанию
    

Работа с константами в CodeVision

Подскажите как указать компилятору на размещение константы в нужном адресе во FLASH в CodeVision?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите как указать компилятору на размещение константы в нужном адресе во FLASH в CodeVision?

 

Никак.

Зачем тебе это? Фёмвеа защитить что-ли хочешь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чото я не пойму, что тут имеется в виду под константами. Вообще, константы используются только на этапе компиляции. Поэтому они нигде не размещаются. #define - это команда препроцессору С, вообще-то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чото я не пойму, что тут имеется в виду под константами. Вообще, константы используются только на этапе компиляции. Поэтому они нигде не размещаются. #define - это команда препроцессору С, вообще-то.

#define это макрос для препроцессора. Но ни что не мешает использовать подобное выражение const unsigned char ABC; при этом в СИ это будет обыкновенная переменная, но защищенная от записи и разместиться она в ОЗУ. СИ++ по возможности уже постарается не занимать память под константу, если это возможно.

В случае CodeVision делается примерно так __flash (или flash) тип_переменной имя_переменной. Подобная переменная будет размещена во FLASH памяти.

Какой смысл размещать что-то по определенному адресу, не знаю... Наверно проще потом указатель взять от такой переменной.

Вот здесь довольно интересные сведения и ссылка на хорошую книжку по СИ/СИ++. Очень рекомендую!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ага. Если про то, что называется константами в 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ага. Если про то, что называется константами в CV, так оно в хелпе написано:

 

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

 

 

 

Никак.

Зачем тебе это? Фёмвеа защитить что-ли хочешь?

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ой!

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

Асм -- на то и Асм, что бы ручками указывать адреса. Си -- как раз и был создан для того, что бы у программера мозги работали на решение задачи, а не отвлекались на рапределение памяти.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CVAVR недоделышь ... всё больше в этом убеждаюсь.

 

Была заморочка ... делал так:

В cvavr.exe заменяете avrasm2.exe на avrasm2.bat и рядом с ним кладете avrasm2.bat, в котором вызываете уже сам exe-файл ... этому батнику передается куча параметров ...

Так вот. Из батника перед асмомо вызывал утилиту ... не помню названия, которая заменяла строки определенных коментов на нужные доп. асм-вставки ... получалось очень даже прикольно :)

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если я правильно понял, то нужно прикрутить новую программу к существующему загрузчику?

Кстати, а почему загрузчик находится не в области загрузчика?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

_____

P.S.

Если вы возмущены, кто это недоделыш ... то спешу исправится ... он хорош ... для начала ... может я просто уже подрос немного .. вот он и кажется таким :)

 

 

 

 

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

Загрузчик, видать, на своем месте ... константы ПЕРЕД загрузчиком.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Загрузчик, видать, на своем месте ... константы ПЕРЕД загрузчиком.

Тогда непонятно беспокойство. zhevak всё прекрасно написал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

 

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

 

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

 

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

Изменено пользователем Apollo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как можно перелить ПО, не переливая константы. если они будут в проекте с ПО?

 

Может разделить Вашу задачу на ТРИ части:

загрузчик - залили и забыли

константы - проект представляет из себя просто набор констант

ПО - основная программа, в которой к константам обращаемся через указатели.

 

Это я к чему .. просто порылся в CVAVR ... нашел параметр RESETVECTOR в файле проекта.

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

 

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

 

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

 

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

 

мало инфы ... давайте подробней о загрузчике и константах .. кто они и для кого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...