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

Необходимо иметь возможность обновлять микрокод мк через последовательный интерфейс. Для экономии места в мк (МЕГА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 размер загрезчика в словах?

 

И как на Си будут выглядеть команды стирания страниц и загрузки буфера?

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


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

посмотрите в примере от Atmel. Там не совсем то что вы хотите, но зато показано как в ИАР писать из бута в память кода.

Самопрограммирование.zip

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


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

Это приложение к ан109. уже взял, уже ковыряю.... Куча вопросов по С++. Во строеном в IAR хелпе мало и фигово описано.

Вопрос к тем кто делал в одном проекте с прогой и бутлоадер:

Для последующего "срастания" обновления с функциями лежащими в бутлоадере, Вы использовали при вызове функций указатели на них? А указатели приравнивали к адресам получившиеся в бутлоадере.

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


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

Что означает __C_task void loader(void)?

Я только понял что это влияет на модель памяти и размещение используемых в функции переменных

 

Забыл зарегистрироваться. От гостя можно удалить

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


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

Если я правильно понял, то:

_C - указывает что нужно сгенерить сегмент. Начальный адрес указывается где-то далее;

_task - объявляет функцию как не использующию стек. А зачем это и для чего?

 

Адреса прерываний нужно указывать самому (они будут в загрузчике).

напрмер так?

#pragma vector=0xC1A

__interrupt void my_interrupt_handler(void)

{

asm("NOP");

}

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


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

Еще вопрос по адресам прерываний:

В табл 18 и 19 ан даны адреса.

В табл 19 Reset adres 0x0000 Interrupt vector stsrt adres 0x0001. И это смещение на 1 и при переносе векторов в область загрузчика.

Почему смещение на 1?

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


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

Если я правильно понял, то:

_C - указывает что нужно сгенерить сегмент. Начальный адрес указывается где-то далее;

_task - объявляет функцию как не использующию стек. А зачем это и для чего?

Вы не правильно поняли.

_C_task это то же что и __task - указание компилятору не сохранять регистры в прологе функции и не восстанавливать в эпилоге.

Применяется в основном для тех функций, из которых не ожидается выходить, т. е. main или различные функции процессов при применении RTOS.

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


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

Спасибо! Хоть один не отсылает к докам по IARу. В них не все понятно.

Если я правильно понял, то в примерах bootloaderов это фича для красоты.

А по адресам прерываний на Мегу8 ошибка столо быть: начинаются они или с 0х0000 или с начала секции загрузчика. В последнем случае адреса надо самому указать векторов.

А как объяснить IARу что main находиться в секции бутлоадера и в вектор прерывания по ресету в бутлоадере лег правильный адрем main?

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


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

посмотрите в примере от Atmel. Там не совсем то что вы хотите, но зато показано как в ИАР писать из бута в память кода.

 

Посмотрел Modified_for_Butterfly (другой загружится в IAR не захотел. его смотрел редактором), попробовал скомпилировать. Ошибка: нужно -v3. Ставлю в проекте -v3 ->

Fatal Error[Pe035]: #error directive: This file should not have RAMPZ enabled, use --cpu or --64k_flash

 

У Вас скомпилировалась?

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


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

Если я правильно понял, то в примерах bootloaderов это фича для красоты.

Ну не столько для красоты сколько для экономии памяти кода (у 8-й меги её не так уж много) да ещё из предположения, что функция main не предполагает выхода, а прыжок на 0-й адрес основной программы предполагает переинициализацию (C_Startup) оперативной памяти, периферии и указателей стеков заново.

А по адресам прерываний на Мегу8 ошибка столо быть: начинаются они или с 0х0000 или с начала секции загрузчика. В последнем случае адреса надо самому указать векторов.

А как объяснить IARу что main находиться в секции бутлоадера и в вектор прерывания по ресету в бутлоадере лег правильный адрем main?

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

Делал два независимых проекта: приложение и бутлоадер.

Программа всегда стартовала на бутлоадер, без прерываний, только поллинг флагов ЮАРТа (хватало и этого вплоть до скорости 115200). Если не надо было грузить программу (опрос состояния пина), то делался прыжок по адресу 0x0000 к приложению. В этом случае был небольшой оверхед по коду (процедуры чтения/записи байта в порт), но для меги128 это не существенно.

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

Может можно и совместно использовать некоторые функции, но это как по мне слегка вяжет руки.

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


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

Ограниченость памяти меги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

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


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

Есть вообще возможность разместить 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();

}

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


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

Ограниченость памяти меги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

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


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

Вопрос о переносе векторов в загрузщик:

Я устанавливаю 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 что бы было верно?

Сначала признайся - будешь делать один проект или два? Будешь использовать одну таблицу векторов или две?

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


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

arttab, Вы взяли для модифицирования не тот конфигурационный файл.

Чтобы было намного гибче и предсказуемее, сделайте следующее:

1. lnkm8s.xcl из папки \avr\config это то что нужно, скопируйте этот файл в папку проекта

2. в General Options снимите галочку в поле Configure system using dialogs...

3. в опциях XLINK/Include в поле XCL file name укажите путь к Вашему файлу xcl.

 

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

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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