Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Векторы прерывания в ИАРе
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
gladov
Простите за глупый вопрос, но как мне повесить в ИАРе (С++) одну функцию-обработчик на несколько векторов?
zltigo
Цитата(gladov @ May 6 2008, 13:43) *
но как мне повесить в ИАРе (С++)..

Если не пользоваться дурацким сервисом с "#pragma vector..", то просто прописать в startup. Если пользоваться, то, например, написать две функции обертки для третьей общей. Для полного счасться воспользоваться #pragma inline = forced для выкидывания излишеств при этом образующихся..
Но лучше startup вариант smile.gif
Непомнящий Евгений
to zltigo: Не могли бы вы пояснить, в чем смысл в написании собственного startup? У меня пока необходимости не возникало, интересно из-за чего вы на это пошли и какие преимущества это дает?
prottoss
Цитата(gladov @ May 6 2008, 18:43) *
как мне повесить в ИАРе (С++) одну функцию-обработчик на несколько векторов?
Один из вариантов -

1. Пишем основную функцию обработки с одним параметром - своим ID

2. Определяем нужные функции-обработчики, которые делают одно-единственное - вызывают основную основную функцию обработки со своим ID в качестве параметра.
dxp
Цитата(zltigo @ May 6 2008, 19:13) *
Если не пользоваться дурацким сервисом с "#pragma vector..", то просто прописать в startup. Если пользоваться, то, например, написать две функции обертки для третьей общей. Для полного счасться воспользоваться #pragma inline = forced для выкидывания излишеств при этом образующихся..
Но лучше startup вариант smile.gif

Почему именно startup? Разве нельзя вектора руками в любом ассемблером файле разместить?
zltigo
Цитата(dxp @ May 6 2008, 14:55) *
Почему именно startup? Разве нельзя вектора руками в любом ассемблером файле разместить?

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


Цитата(Непомнящий Евгений @ May 6 2008, 14:28) *
to zltigo: Не могли бы вы пояснить, в чем смысл в написании собственного startup?

Например, для прямого и естественного решения поставленной задачи smile.gif. Писать его незачем - достаточно подправить используемый по умолчанию.
Сергей Борщ
Все гораздо проще. В последних версиях #pragma vector допускает несколько аргументов:
Цитата
#pragma vector=vector1[, vector2, vector3, ...]
Freeze Anti
а разве нельзя сделать просто?
Код
#pragma vector=vector_1
__interrupt void function(void);

#pragma vector=vector_2
__interrupt void fuction(void);

...

#pragma vector=vector_n
__interrupt void function(void)
{

. . .

}
MrYuran
Цитата(Freeze Anti @ May 7 2008, 11:27) *
а разве нельзя сделать просто?

Попробуйте
smile.gif
Потом поделитесь опытом
prottoss
Цитата(Freeze Anti @ May 7 2008, 15:27) *
а разве нельзя сделать просто?
А как function будет знать, с какого вектора ее вызвали???
Я предлагал вот так:
Код
typedef char VECTOR_ID;


#pragma vector=vector_1
__interrupt void isr_vector_1(void)
{ isr_main(1);
}

#pragma vector=vector_2
__interrupt void isr_vector_2(void)
{ isr_main(2);
}
...

#pragma vector=vector_n
__interrupt void isr_vector_n(void)
{ isr_main(n);
}

void isr_main(VECTOR_ID id)
{  switch(id)
   {  case 1:
      ....
      break;

      case 2:
      ...
      break;

      case n:
      ...
      break;
   }
}
Непомнящий Евгений
насколько я понял топикстартера, ему не надо знать, с какого вектора вызвали. Если надо - то только так как вы предлагаете, наверное.
prottoss
Цитата(Непомнящий Евгений @ May 7 2008, 16:01) *
ему не надо знать, с какого вектора вызвали
07.gif А зачем ОНО вообще тогда нужно?
Сергей Борщ
Цитата(prottoss @ May 7 2008, 12:29) *
07.gif А зачем ОНО вообще тогда нужно?
Самое простое, что приходит в голову - обработчик-заглушка на неиспользуемые вектора.
gladov
Цитата(Непомнящий Евгений @ May 7 2008, 12:01) *
насколько я понял топикстартера, ему не надо знать, с какого вектора вызвали. Если надо - то только так как вы предлагаете, наверное.


Действительно не надо. И это не заглушка, а счетчик событий, причем каждое событие висит на отдельном внешнем прерывании и их НЕ надо разделять. Нужно лишь общее количество.

Спасибо всем откликнувшимся. Если бы не Сергей Борщ с его полезным советом, то единственным нормальным решением в моем случае было бы написание своего startup'а. Но т.к. мой случай очень простой, хватит и #pragma директивы.

Еще раз всем спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.