arttab 0 5 июля, 2006 Опубликовано 5 июля, 2006 · Жалоба Необходимо иметь возможность обновлять микрокод мк через последовательный интерфейс. Для экономии места в мк (МЕГА8) хочу сделать так: функции отвечающие за протокол связи должны находиться в области загрузчика как и вектора прерываний. За размещение векторов в области загрузчика отвечает fuse. Это понятно. За размер загрузчика др. fusы. Как указать IARу новое место расположения векторов? Было так: #pragma vector=USART_TXC_vect __interrupt void my_USART_TXC_vect(void) { .... Должно быть так: #pragma vector=0xС1A __interrupt void my_interrupt_handler(void) {.... или как то еще можно задать? Далее. Надо указать место размещения некоторых функций в области загрузчика. #pragma location="MYSEGMENT" void f() @ "MYSEGMENT"; void g() @ "MYSEGMENT" { } Так? MYSEGMENT=FLASH_END-BOOT_LOADER_SIZE , Где BOOT_LOADER_SIZE размер загрезчика в словах? И как на Си будут выглядеть команды стирания страниц и загрузки буфера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Faradey 0 5 июля, 2006 Опубликовано 5 июля, 2006 · Жалоба посмотрите в примере от Atmel. Там не совсем то что вы хотите, но зато показано как в ИАР писать из бута в память кода. Самопрограммирование.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 6 июля, 2006 Опубликовано 6 июля, 2006 · Жалоба Это приложение к ан109. уже взял, уже ковыряю.... Куча вопросов по С++. Во строеном в IAR хелпе мало и фигово описано. Вопрос к тем кто делал в одном проекте с прогой и бутлоадер: Для последующего "срастания" обновления с функциями лежащими в бутлоадере, Вы использовали при вызове функций указатели на них? А указатели приравнивали к адресам получившиеся в бутлоадере. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 6 июля, 2006 Опубликовано 6 июля, 2006 · Жалоба Что означает __C_task void loader(void)? Я только понял что это влияет на модель памяти и размещение используемых в функции переменных Забыл зарегистрироваться. От гостя можно удалить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 6 июля, 2006 Опубликовано 6 июля, 2006 · Жалоба Если я правильно понял, то: _C - указывает что нужно сгенерить сегмент. Начальный адрес указывается где-то далее; _task - объявляет функцию как не использующию стек. А зачем это и для чего? Адреса прерываний нужно указывать самому (они будут в загрузчике). напрмер так? #pragma vector=0xC1A __interrupt void my_interrupt_handler(void) { asm("NOP"); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 6 июля, 2006 Опубликовано 6 июля, 2006 · Жалоба Еще вопрос по адресам прерываний: В табл 18 и 19 ан даны адреса. В табл 19 Reset adres 0x0000 Interrupt vector stsrt adres 0x0001. И это смещение на 1 и при переносе векторов в область загрузчика. Почему смещение на 1? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 6 июля, 2006 Опубликовано 6 июля, 2006 · Жалоба Если я правильно понял, то: _C - указывает что нужно сгенерить сегмент. Начальный адрес указывается где-то далее; _task - объявляет функцию как не использующию стек. А зачем это и для чего? Вы не правильно поняли. _C_task это то же что и __task - указание компилятору не сохранять регистры в прологе функции и не восстанавливать в эпилоге. Применяется в основном для тех функций, из которых не ожидается выходить, т. е. main или различные функции процессов при применении RTOS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 6 июля, 2006 Опубликовано 6 июля, 2006 · Жалоба Спасибо! Хоть один не отсылает к докам по IARу. В них не все понятно. Если я правильно понял, то в примерах bootloaderов это фича для красоты. А по адресам прерываний на Мегу8 ошибка столо быть: начинаются они или с 0х0000 или с начала секции загрузчика. В последнем случае адреса надо самому указать векторов. А как объяснить IARу что main находиться в секции бутлоадера и в вектор прерывания по ресету в бутлоадере лег правильный адрем main? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 6 июля, 2006 Опубликовано 6 июля, 2006 · Жалоба посмотрите в примере от Atmel. Там не совсем то что вы хотите, но зато показано как в ИАР писать из бута в память кода. Посмотрел Modified_for_Butterfly (другой загружится в IAR не захотел. его смотрел редактором), попробовал скомпилировать. Ошибка: нужно -v3. Ставлю в проекте -v3 -> Fatal Error[Pe035]: #error directive: This file should not have RAMPZ enabled, use --cpu or --64k_flash У Вас скомпилировалась? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 6 июля, 2006 Опубликовано 6 июля, 2006 · Жалоба Если я правильно понял, то в примерах bootloaderов это фича для красоты. Ну не столько для красоты сколько для экономии памяти кода (у 8-й меги её не так уж много) да ещё из предположения, что функция main не предполагает выхода, а прыжок на 0-й адрес основной программы предполагает переинициализацию (C_Startup) оперативной памяти, периферии и указателей стеков заново. А по адресам прерываний на Мегу8 ошибка столо быть: начинаются они или с 0х0000 или с начала секции загрузчика. В последнем случае адреса надо самому указать векторов. А как объяснить IARу что main находиться в секции бутлоадера и в вектор прерывания по ресету в бутлоадере лег правильный адрем main? Не знаю как изощриться в данной ситуации, но я делал немного по другому. Делал два независимых проекта: приложение и бутлоадер. Программа всегда стартовала на бутлоадер, без прерываний, только поллинг флагов ЮАРТа (хватало и этого вплоть до скорости 115200). Если не надо было грузить программу (опрос состояния пина), то делался прыжок по адресу 0x0000 к приложению. В этом случае был небольшой оверхед по коду (процедуры чтения/записи байта в порт), но для меги128 это не существенно. Просто и сердито, и никакой головной боли, и проекты могут не зависеть один от другого, особенно если применяются раздельные контрольные суммы для приложения и бутлоадера. Может можно и совместно использовать некоторые функции, но это как по мне слегка вяжет руки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 7 июля, 2006 Опубликовано 7 июля, 2006 · Жалоба Ограниченость памяти меги8 и наталкивает на совместное использование некоторых функций. Кстати, добавил к main __C_task и перекомпил - код меньше не стал. Видно, он сам сообразил. Вопрос о переносе векторов в загрузщик: Я устанавливаю fuse BOOTRST=0. Значит после сброса переход будет на BOOTADRES. Тогда пишу #pragma vector=LOADER __interrupt void my_interrupt_RESET(void) { main(); } и прочие нужные вектора. А функции входящие в загрузщик типа так: void main(void) @ "LOADER"; ругается Fatal Error[e72]: Segment LOADER must be defined in a segment definition option (-Z, -b or -P) #define LOADER 0xC00 #pragma location = "LOADER" как надо подправить cfgm8.xcl что бы было верно? cfgm8.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 7 июля, 2006 Опубликовано 7 июля, 2006 · Жалоба Есть вообще возможность разместить 2 таблици векторов прерываний? Если нет, то прописать нодо -Z(CODE)INTVEC=(FLASH_SIZE-BOOT_SIZE)-(FLASH_SIZE-BOOT_SIZE+IVT_SIZE-1) и все? Он сам их правильно расположит? Или как я писал раньше - типа: #pragma vector=LOADER __interrupt void my_interrupt_RESET(void) { main(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 7 июля, 2006 Опубликовано 7 июля, 2006 · Жалоба Ограниченость памяти меги8 и наталкивает на совместное использование некоторых функций. Кстати, добавил к main __C_task и перекомпил - код меньше не стал. Видно, он сам сообразил. Вопрос о переносе векторов в загрузщик: Я устанавливаю fuse BOOTRST=0. Значит после сброса переход будет на BOOTADRES. Тогда пишу #pragma vector=LOADER __interrupt void my_interrupt_RESET(void) { main(); } и прочие нужные вектора. А функции входящие в загрузщик типа так: void main(void) @ "LOADER"; ругается Fatal Error[e72]: Segment LOADER must be defined in a segment definition option (-Z, -b or -P) #define LOADER 0xC00 #pragma location = "LOADER" как надо подправить cfgm8.xcl что бы было верно? В настройках проекта, в разделе linker, в закладке extra options вставте строку, например -Z(CODE)LOADER=1C00-1CFF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 7 июля, 2006 Опубликовано 7 июля, 2006 · Жалоба Вопрос о переносе векторов в загрузщик: Я устанавливаю fuse BOOTRST=0. Значит после сброса переход будет на BOOTADRES. Тогда пишу #pragma vector=LOADER __interrupt void my_interrupt_RESET(void) { main(); } Ужас :-) 1) Все же присоединюсь к Игорю и порекомендую два отдельных проекта. 2) фуз BOOTRST дает только переход по сбросу на BOOTADDRESS. Остальные вектора не трогаются. Остальные вектора переназначаются на загрузчик битом IVSEL. Поэтому можно иметь две таблицы векторов (одну для режима загрузчика вторую для боевого). Только прописывать одну из них надо будет на асме. 3) #pragma vector используется точно так же как в обычной программе. вектор в данном случае означает смещение относительно начала сегмента INTVEC. Чтобы таблица векторов попала в BOOT-область надо в .xcl испавить -Z (CODE) INTVEC = 0-26 на -Z(CODE) INTVEC = 1800-1826 (пишу по памяти, насчет 26 мог ошибиться). А функции входящие в загрузщик типа так: void main(void) @ "LOADER"; ругается Fatal Error[e72]: Segment LOADER must be defined in a segment definition option (-Z, -b or -P) #define LOADER 0xC00 #pragma location = "LOADER" Мимо. перед использованием @ вставить #pragma segment = "LOADER" Только учти, что до main вызывается c_startup, которая живет в библиотеке и попадет в сегмент CODE, а уже из c_startup вызывается main. Тебе придется подключить исходник c_startup к своему проекту и исправить в нем RSEG CODE на RSEG LOADER. Исходник лежит в папке IAR\avr\src\lib как надо подправить cfgm8.xcl что бы было верно? Сначала признайся - будешь делать один проект или два? Будешь использовать одну таблицу векторов или две? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 7 июля, 2006 Опубликовано 7 июля, 2006 · Жалоба arttab, Вы взяли для модифицирования не тот конфигурационный файл. Чтобы было намного гибче и предсказуемее, сделайте следующее: 1. lnkm8s.xcl из папки \avr\config это то что нужно, скопируйте этот файл в папку проекта 2. в General Options снимите галочку в поле Configure system using dialogs... 3. в опциях XLINK/Include в поле XCL file name укажите путь к Вашему файлу xcl. Что касается двух таблиц прерываний, то это скорее всего невозможно сделать автоматически. В этой среде поддерживается идеология: один проект - одно распределение памяти. В таком случае более универсальным будет подход, о котором я уже говорил, сделать два проекта в одном рабочем пространстве. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться