Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Два вектора на одно прерывание
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
SasaVitebsk
Мне необходимо для двух векторов назначить одно и то же прерывание. Я пробую это сделать так.

#pragma vector=TIMER3_COMPA_vect // Отображение картинки Master
#pragma vector=INT7_vect // Отображение картинки Slave
__interrupt void Regeneration(void)

Система выдаёт предупреждение, что типо только одна является активной. Ну и нафига она за меня думает. smile.gif В данном случае это очень красивый и продуманный шаг. Но как сделать?
arttab
Непонятно из Вашего кода как Вы это объявляете.
А вариант с обычным определением векторов и вызовом из них одной и той же функции Вас не устроит?
Andy Mozzhevilov
Цитата(SasaVitebsk @ Jul 18 2006, 04:59) *
Мне необходимо для двух векторов назначить одно и то же прерывание. Я пробую это сделать так.

#pragma vector=TIMER3_COMPA_vect // Отображение картинки Master
#pragma vector=INT7_vect // Отображение картинки Slave
__interrupt void Regeneration(void)

Система выдаёт предупреждение, что типо только одна является активной. Ну и нафига она за меня думает. smile.gif В данном случае это очень красивый и продуманный шаг. Но как сделать?


#pragma vector относится к функции, определенной следом. В вашем случае компилятор не может разобраться, какой вектор вы хотите назначить своей функции.

Код
void Regeneration(void)
{
...
}


#pragma vector=TIMER3_COMPA_vect                
__interrupt void T3_isr(void)
{
    Regeneration();
}

#pragma vector=INT7_vect                              
__interrupt void INT7_isr(void)
{
    Regeneration();
}
andrvisht
Цитата(SasaVitebsk @ Jul 18 2006, 01:59) *
Мне необходимо для двух векторов назначить одно и то же прерывание. Я пробую это сделать так.

#pragma vector=TIMER3_COMPA_vect // Отображение картинки Master
#pragma vector=INT7_vect // Отображение картинки Slave
__interrupt void Regeneration(void)

Система выдаёт предупреждение, что типо только одна является активной. Ну и нафига она за меня думает. smile.gif В данном случае это очень красивый и продуманный шаг. Но как сделать?


Z пробовал так, в симуляторе работает, думаю в железке тоже пойдет.
Код
#pragma vector = USART0_UDRE_vect, USART0_TXC_vect
#pragma inline = forced
__interrupt static void UDRE_TXC_INT(void)
{
Сергей Борщ
Цитата(Andy Mozzhevilov @ Jul 18 2006, 06:25) *
Код
void Regeneration(void)
{
...
}

Я бы даже сказал
Код
static void Regeneration(void)
{
...
}



Цитата(&-rey @ Jul 18 2006, 09:20) *
Код
#pragma vector = USART0_UDRE_vect, USART0_TXC_vect
Красиво! Даже и в голову не приходило такое :-)
SasaVitebsk
Спасибо ребята. Почти всё понял.
Только начинаю разбираться с С. Написал и практически полностью отладил первую большую прогу. Горд собой. smile.gif

А Вы меня деталями своих ответов ставите в тупик. smile.gif
Например
1) static void Regeneration(void) - Что даёт тут статик?
2) #pragma inline = forced - несовсем разобрался для чего это применяется
andrvisht
Цитата(SasaVitebsk @ Jul 19 2006, 01:17) *
Спасибо ребята. Почти всё понял.
Только начинаю разбираться с С. Написал и практически полностью отладил первую большую прогу. Горд собой. smile.gif

А Вы меня деталями своих ответов ставите в тупик. smile.gif
Например
1) static void Regeneration(void) - Что даёт тут статик?
2) #pragma inline = forced - несовсем разобрался для чего это применяется

это все можно и поиском найти.
Static говорит что данная функция будет вызываться только из этого модуля.
#pragma inline = forced заставляет всраивать функцию несмотря ни на какие мысли компилятора.
это нужно в прерываниях чтобы сэкономить на сохраняемых в стеке регистрах.
SasaVitebsk
Спасибо огромное за пояснения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.