|
|
  |
bootloader в IARe 3,10, Помогите разобраться как сделать |
|
|
|
Jul 5 2006, 15:18
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638

|
посмотрите в примере от Atmel. Там не совсем то что вы хотите, но зато показано как в ИАР писать из бута в память кода.
--------------------
Завтра пойму, что нужно было сделать вчера...
|
|
|
|
|
Jul 6 2006, 08:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
Цитата(Faradey @ Jul 5 2006, 22:18)  посмотрите в примере от Atmel. Там не совсем то что вы хотите, но зато показано как в ИАР писать из бута в память кода. Посмотрел Modified_for_Butterfly (другой загружится в IAR не захотел. его смотрел редактором), попробовал скомпилировать. Ошибка: нужно -v3. Ставлю в проекте -v3 -> Fatal Error[Pe035]: #error directive: This file should not have RAMPZ enabled, use --cpu or --64k_flash У Вас скомпилировалась?
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Jul 6 2006, 12:46
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(arttab @ Jul 6 2006, 11:22)  Если я правильно понял, то в примерах bootloaderов это фича для красоты. Ну не столько для красоты сколько для экономии памяти кода (у 8-й меги её не так уж много) да ещё из предположения, что функция main не предполагает выхода, а прыжок на 0-й адрес основной программы предполагает переинициализацию (C_Startup) оперативной памяти, периферии и указателей стеков заново. Цитата(arttab @ Jul 6 2006, 11:22)  А по адресам прерываний на Мегу8 ошибка столо быть: начинаются они или с 0х0000 или с начала секции загрузчика. В последнем случае адреса надо самому указать векторов. А как объяснить IARу что main находиться в секции бутлоадера и в вектор прерывания по ресету в бутлоадере лег правильный адрем main? Не знаю как изощриться в данной ситуации, но я делал немного по другому. Делал два независимых проекта: приложение и бутлоадер. Программа всегда стартовала на бутлоадер, без прерываний, только поллинг флагов ЮАРТа (хватало и этого вплоть до скорости 115200). Если не надо было грузить программу (опрос состояния пина), то делался прыжок по адресу 0x0000 к приложению. В этом случае был небольшой оверхед по коду (процедуры чтения/записи байта в порт), но для меги128 это не существенно. Просто и сердито, и никакой головной боли, и проекты могут не зависеть один от другого, особенно если применяются раздельные контрольные суммы для приложения и бутлоадера. Может можно и совместно использовать некоторые функции, но это как по мне слегка вяжет руки.
|
|
|
|
|
Jul 7 2006, 02:32
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
Ограниченость памяти меги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 ( 549 байт )
Кол-во скачиваний: 124
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Jul 7 2006, 07:16
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
Есть вообще возможность разместить 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(); }
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Jul 7 2006, 07:23
|

Знающий
   
Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095

|
Цитата(arttab @ Jul 7 2006, 05:32)  Ограниченость памяти меги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
|
|
|
|
|
Jul 7 2006, 07:24
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(arttab @ Jul 7 2006, 05:32)  Вопрос о переносе векторов в загрузщик: Я устанавливаю 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 что бы было верно? Сначала признайся - будешь делать один проект или два? Будешь использовать одну таблицу векторов или две?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|