找不到.cpp文件中的ISR

时间:2018-09-16 04:16:08

标签: c++ gcc embedded interrupt

我有一个嵌入式项目,其中包含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 :(得分:1)

尝试

extern "C" void PORTD_MyIRQHandler(){
}

C ++根据功能的输入和返回值类型在功能名称中添加字符。

此功能(名称名称类型更改)的存在是为了避免使用错误的参数类型链接函数并允许函数重载。使用extern“ C”禁用它。