реклама на сайте
подробности

 
 
> Две таблицы векторов в одном софте, xmega
xelax
сообщение Apr 20 2011, 08:58
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Привет всем!

Тут некоторых коллег посетила нездоровая идея иметь два вектора прерывания на одну периферию (NVM eeprom и flash).
Одна таблица в application другая в bootloader секции. И всё это должно жить в одной программе. В возможности иметь две таблице векторов прерывания для xmegа я не вижу никаких технических препятствий, то как это реализовать в одном софте средствами компилятора и линкера пока не понимаю. Не могу же я иметь две функции
Код
ISR(NVM_EE_vect)


Пока не вижу другого способа кроме как для application секции формировать таблицу посредством макросов ISR, а для bootloader формировать её в рукопашную, размещая jmp на обработчики по фиксированным адресам из bootloader и добавляя в функции обработки рукописные прологи и эпилоги.

Но уж очень этот вариант на камасутру похож. Может кто-то знает более красивые варианты решения?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
V_G
сообщение May 11 2011, 13:04
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



vvppvv
Тут, по-моему, как раз тот случай, когда помимо хороших знаний языка Си стоит хорошо знать конкретную архитектуру конкретного процессора. Да, в его ассемблере есть команда косвенного перехода IJMP по адресу из r31:30. Но не думаю, что IAR C умеет ее использовать для целей, потребных топикстартеру.
Все-таки 2 отдельных проекта реальнее, чем так извращаться на Си
Go to the top of the page
 
+Quote Post
vvppvv
сообщение May 13 2011, 13:00
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 3-07-05
Пользователь №: 6 485



Цитата(V_G @ May 11 2011, 18:04) *
vvppvv
Тут, по-моему, как раз тот случай, когда помимо хороших знаний языка Си стоит хорошо знать конкретную архитектуру конкретного процессора. Да, в его ассемблере есть команда косвенного перехода IJMP по адресу из r31:30. Но не думаю, что IAR C умеет ее использовать для целей, потребных топикстартеру.


Ну, во-первых, корректней использовать не косвенный переход, а косвенный вызов, раз уж мы о функциях wink.gif

Во-вторых, IAR можно настроить под свои, сугубо специфические заскоки. Вот, навскидку, мой пример, косвенный вызов каких-то функций (их может быть хоть сотня), указатель на которые лежит в регистрах R15:R14 (сделано для быстроты):

__no_init __regvar void (* volatile Ufunc_ptr)(void) @14;

Использование 3х разных прерываний для вызова этих функций (а какая будет вызвана функция, т.е. какой загружен указатель, зависит от предыдущего контекста):

__interrupt __raw void irqOverflowTimer2 (void)
{
interrupt_entry ();
TCCR2=0; // остановить Timer2
(* Ufunc_ptr)();
interrupt_exit ();
}

__interrupt __raw void irqUSART0_UDRE (void)
{
interrupt_entry ();
(* Ufunc_ptr)();
interrupt_exit ();
}

__interrupt __raw void irqUSART0_RXC (void)
{
interrupt_entry ();
(* Ufunc_ptr)();
interrupt_exit ();
}

сам вызов (* Ufunc_ptr)() очень изящен, если он из регистров:

1436 (* Ufunc_ptr)();
\ 0000000E 01F7 MOVW R31:R30, R15:R14
\ 00000010 9509 ICALL


Как-то так.. sm.gif)

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 07:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01379 секунд с 7
ELECTRONIX ©2004-2016