Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как переопределить прерывание в IAR/EC++?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
id_Alx
Подскажите, плз, почему так происходит.
LPC2366, IAR 5.11 Kickstart, модифицированный код мигания светодиодом в прерывании из примеров, JLINK, работа из RAM.
Суть проблемы:
при выборе языка С - все собирается и работает, при выборе EC++ - собирается, но не работает. По коду видно, что функция IRQ_Handler берется не из проекта, а подставляется бесконечная заглушка. Варианты включения и правки vectortrap.s в проект не помогают, даже если полностью исключить упоминания IRQ_Handler кроме cstartup.s, все равно линкер подставляет бесконечную заглушку.

Обработчик в main.cpp:
Код
__irq __arm void IRQ_Handler(void)
{
void (*interrupt_function)();
unsigned int vector;

  vector = VICADDRESS;     // Get interrupt vector.
  interrupt_function = (void(*)())vector;
  if(interrupt_function != NULL)
  {
    interrupt_function();  // Call vectored interrupt function.
  }
  else
  {
    VICADDRESS = 0;      // Clear interrupt in VIC.
  }
}


map-файл:
Код
IRQ_Handler             0x40001ad8         Code  Wk  vectortrap.o [4]


При переопределении, например, putchar все как положено.
AHTOXA
Надо где-то написать

extern "C" void IRQ_Handler(void);

Можно прямо перед собственно функцией. Тогда плюсовый компилятор генерит для неё нормальное сишное имя, и функция успешно встанет вместо заглушки.
id_Alx
Цитата(AHTOXA @ Aug 18 2009, 22:20) *
Надо где-то написать

extern "C" void IRQ_Handler(void);

Можно прямо перед собственно функцией. Тогда плюсовый компилятор генерит для неё нормальное сишное имя, и функция успешно встанет вместо заглушки.


Спасибо огромное!
Помогло
extern "C" __irq __arm void IRQ_Handler(void);
Сергей Борщ
Цитата(AHTOXA @ Aug 18 2009, 22:20) *
Надо где-то написать

extern "C" void IRQ_Handler(void);
Или (для ИАРа) подключить заголовочный файл yvals.h (а он и так подключается практически во всех заголовочных файлах) и обрамить такую функцию в
Код
_EXTERN_C
...
_END_EXTERN_C
Тогда этот код будет собираться и в режиме (E)C++ и в С.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.