Apollo 0 10 июля, 2007 Опубликовано 10 июля, 2007 · Жалоба Подскажите как указать компилятору на размещение константы в нужном адресе во FLASH в CodeVision? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zhevak 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба Подскажите как указать компилятору на размещение константы в нужном адресе во FLASH в CodeVision? Никак. Зачем тебе это? Фёмвеа защитить что-ли хочешь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jasper 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба В WinAVR можно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokos 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба Чото я не пойму, что тут имеется в виду под константами. Вообще, константы используются только на этапе компиляции. Поэтому они нигде не размещаются. #define - это команда препроцессору С, вообще-то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба ничто не мешает обращаться к нужному адресу через указатель. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба Чото я не пойму, что тут имеется в виду под константами. Вообще, константы используются только на этапе компиляции. Поэтому они нигде не размещаются. #define - это команда препроцессору С, вообще-то. #define это макрос для препроцессора. Но ни что не мешает использовать подобное выражение const unsigned char ABC; при этом в СИ это будет обыкновенная переменная, но защищенная от записи и разместиться она в ОЗУ. СИ++ по возможности уже постарается не занимать память под константу, если это возможно. В случае CodeVision делается примерно так __flash (или flash) тип_переменной имя_переменной. Подобная переменная будет размещена во FLASH памяти. Какой смысл размещать что-то по определенному адресу, не знаю... Наверно проще потом указатель взять от такой переменной. Вот здесь довольно интересные сведения и ссылка на хорошую книжку по СИ/СИ++. Очень рекомендую! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokos 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба Ага. Если про то, что называется константами в 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 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба Ага. Если про то, что называется константами в CV, так оно в хелпе написано: Это я читал, но в том-то и дело, что о способе размещения констант по определённому адресу ничего не написано. Упоминается лишь оператор @ для указания адреса в ОЗУ. Никак. Зачем тебе это? Фёмвеа защитить что-ли хочешь? Нет. Просто есть загрузчик написаный ранее и расположенный в конце FLASH, а также есть перед загрузчиком область памяти основной программы с некими нужными коэффициентами - константами, используемыми МК в работе. Константы олжны находиться в определённой странице FLASH так, чтобы при обновлении ПО загрузчиком можно было отдельно перезаписать только страницу с константами. Сейчас я пишу основную программу, которая должна считывать эти константы из FLASH. Проблема в том как их разместить начинаяс нужного адреса. В АСМе проблем не было. просто указывал типа .org 0x0123 и всё, после этой строчки можно было обьявлять строку байт, а вот в CodeVision я не нашёл ничего по этому поводу. Выходит какой-то недоделышь этот CVAVR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zhevak 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба Ой! Уважаемый, Вы пожалуйста не сердитесь на нас, на прожженых паяльниками и дебаггерами, а поясните цель своего весьма экстравагантного подхода. Возможно, Ваша проблема (ради которой нужно размещать константу только по указанному заранее адресу во флеш-памяти) будет решена более простым способом. Или делайте как уже тут ранее предлагали: обращайтесь к константе через указатель на нее. А адрес памяти, где она будет размещена, оставьте на откуп компилятору/линковщику. Ну, еще как не гарантированный вариант: попробуйте поиграться с ассемблерным файлом, который CV всегда создает при компиляци проекта. Поправьте этот файл ручками так, как Вам надо, и отдайте его на "съедение" какому-либо ассемблеру. Нет. Просто есть загрузчик написаный ранее и расположенный в конце FLASH, а также есть перед загрузчиком область памяти основной программы с некими нужными коэффициентами - константами, используемыми МК в работе. Константы олжны находиться в определённой странице FLASH так, чтобы при обновлении ПО загрузчиком можно было отдельно перезаписать только страницу с константами. Сейчас я пишу основную программу, которая должна считывать эти константы из FLASH. Проблема в том как их разместить начинаяс нужного адреса. Хм... задача. Если это действительно константы, то какая разница, на каком адресе они сидят при компиляции новой версии? Значения констант изначально опредены в программе. Если прога претерпевает изменения и ее новую версию нужно заново "залить" в МК, то и заливайте ее вместе с теми же констаттами. Пусть они находятся по другим адресам. Минусы -- ну чуть больше нужно будет времени на программирование. Если констант не очень много, может воспользоваться внутренним EEPROM? Если много -- внешний подвесить (SPI или I2C). В АСМе проблем не было. просто указывал типа .org 0x0123 и всё, после этой строчки можно было обьявлять строку байт, а вот в CodeVision я не нашёл ничего по этому поводу. Выходит какой-то недоделышь этот CVAVR? Асм -- на то и Асм, что бы ручками указывать адреса. Си -- как раз и был создан для того, что бы у программера мозги работали на решение задачи, а не отвлекались на рапределение памяти. Что же касается "недоделыша", это Вы зря так. У каждой среды разработки и компилятора есть сильные и слабые стороны. Если компилятор что-то в принципе не умеет делать, просто, смените компилятор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndryG 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба CVAVR недоделышь ... всё больше в этом убеждаюсь. Была заморочка ... делал так: В cvavr.exe заменяете avrasm2.exe на avrasm2.bat и рядом с ним кладете avrasm2.bat, в котором вызываете уже сам exe-файл ... этому батнику передается куча параметров ... Так вот. Из батника перед асмомо вызывал утилиту ... не помню названия, которая заменяла строки определенных коментов на нужные доп. асм-вставки ... получалось очень даже прикольно :) Но так я делал, ибо задачка была почти сделана и переписывать под другой компилятор было лень ... теперь вот WinAvr колупаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokos 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба Если я правильно понял, то нужно прикрутить новую программу к существующему загрузчику? Кстати, а почему загрузчик находится не в области загрузчика? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndryG 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба _____ P.S. Если вы возмущены, кто это недоделыш ... то спешу исправится ... он хорош ... для начала ... может я просто уже подрос немного .. вот он и кажется таким :) а также есть перед загрузчиком область памяти основной программы с некими нужными коэффициентами Загрузчик, видать, на своем месте ... константы ПЕРЕД загрузчиком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokos 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба Загрузчик, видать, на своем месте ... константы ПЕРЕД загрузчиком. Тогда непонятно беспокойство. zhevak всё прекрасно написал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Apollo 0 11 июля, 2007 Опубликовано 11 июля, 2007 (изменено) · Жалоба Ну, еще как не гарантированный вариант: попробуйте поиграться с ассемблерным файлом, который CV всегда создает при компиляци проекта. Поправьте этот файл ручками так, как Вам надо, и отдайте его на "съедение" какому-либо ассемблеру. А, кстати, идея! Но к сожалению этот продукт я должен отдать другим людям и объяснять им в описании как надо лечить кривизну CVAVR не очень красиво. Им нужно написать тупо, чтобы изменить то-то надо залезть туда-то и потом откомпилировать. Хм... задача. Если это действительно константы, то какая разница, на каком адресе они сидят при компиляции новой версии? Значения констант изначально опредены в программе. Если прога претерпевает изменения и ее новую версию нужно заново "залить" в МК, то и заливайте ее вместе с теми же констаттами. Пусть они находятся по другим адресам. Минусы -- ну чуть больше нужно будет времени на программирование. Эти константы нужно будет считывать и загрузчиком (находящемся в области загрузчика) и из основной программы. Поэтому их адрес должен быть неизменен, так как загрузчик меняться не будет. При перезаливке ПО через загрузчик возможны варианты, когда полностью переписывается и ПО и область констант, а возможен вариант, когда переписывается только ПО. Но адрес констант должен быть один и тот же Изменено 11 июля, 2007 пользователем Apollo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndryG 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба А как можно перелить ПО, не переливая константы. если они будут в проекте с ПО? Может разделить Вашу задачу на ТРИ части: загрузчик - залили и забыли константы - проект представляет из себя просто набор констант ПО - основная программа, в которой к константам обращаемся через указатели. Это я к чему .. просто порылся в CVAVR ... нашел параметр RESETVECTOR в файле проекта. Попробуйте сделать проект для меги16-загрузчик ... и посмотреть параметры в файле проекта ... может еще что найдете. А может вообще вынести константы с проекта и "набивать" их редактируя файл для прошивки? если константы должны изменятся юзерами ... может им простейшую программку-конфигуратор на комп надо? Если Ваш загрузчик пишет HEX файлы .. то этот конфигуратор может генерить небольшой HEX с нужными адресами ... или редактировать готовый файл ... конфигуратор получится элементарный ... в отдельном файле прописываем название параметра и адрес его в HEX. мало инфы ... давайте подробней о загрузчике и константах .. кто они и для кого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться