У меня есть встроенный проект, содержащий как файлы c (драйверы из SDK), так и файлы c ++ (.cpp) (мой собственный код). Я пытаюсь настроить режим обслуживания прерываний. Я обнаружил, что он работает нормально, если ISR находится в файле .c. Однако та же самая функция, перемещенная в файл .cpp, не работает.
В MK64F12_Vector.s;
_vectors:
...
.word PORTD_MyIRQHandler
Некоторый связанный код инициализации, который вызывается один раз при запуске;
CLOCK_EnableClock(kCLOCK_PortD);
EnableIRQ(PORTD_IRQn);
PORT_SetPinInterruptConfig(PORTD, 0, kPORT_InterruptFallingEdge);
В .c файле;
void PORTD_MyIRQHandler()
{
while (1) ; // put breakpoint here
}
Вышеприведенное работает нормально, если PORTD_MyIRQHandler () находится в файле .c. Но если я переместу его в файл .cpp (где я хочу!), Я получу ошибку ниже. Обратите внимание, я просто копирую и вставляю его, ничего не меняя.
(. Vectors + 0x138): неопределенная ссылка на `PORTD_MyIRQHandler '
Есть ли что-то еще, что мне нужно сделать, чтобы заставить его работать? Возможно, компилятор или компоновщик? Я безуспешно пробовал следующее:
__attribute__((interrupt)) void PORTD_MyIRQHandler() {..}
#pragma interrupt
void PORTD_MyIRQHandler() {..}
Я использую Segger Embedded Studio с gcc.