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

 
 
> Как переопределить прерывание в IAR/EC++?, Объясните почему так?
id_Alx
сообщение Aug 18 2009, 18:45
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 12-08-06
Из: Минск
Пользователь №: 19 504



Подскажите, плз, почему так происходит.
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 все как положено.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Aug 18 2009, 19:20
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Надо где-то написать

extern "C" void IRQ_Handler(void);

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 18 2009, 20:09
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(AHTOXA @ Aug 18 2009, 22:20) *
Надо где-то написать

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 13:05
Рейтинг@Mail.ru


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