ISR в .cpp файле не найден - PullRequest
       38

ISR в .cpp файле не найден

0 голосов
/ 16 сентября 2018

У меня есть встроенный проект, содержащий как файлы 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.

1 Ответ

0 голосов
/ 16 сентября 2018

Попробуйте

extern "C" void PORTD_MyIRQHandler(){
}

C ++ добавляет символы к имени функции, которые зависят от типов входных и возвращаемых значений функции.

Эта функция, искажение имени типа, существует, чтобы избежать связыванияфункции с неправильными параметрами и разрешить перегрузку функций.Использование extern "C" отключает это.

...