Keil5 C工程转C++工程报错用中断函数

Transform Keil5 C Project to C++ Project Error with the Interrupt Function

我把项目从C转成C++后,程序好像卡在了中断函数里

我用C写过一个keil嵌入式项目,后来尝试用C++写。然后我发现程序卡在了中断函数中,即使我正确地编写了 IRQHandler 函数(它们在 C 项目中工作)。 USART1 将被卡住,而 CAN receive/transmit 仍在工作。

// this is the USART_IRQHandler   

void USART1_IRQHandler(void)      
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   
    {                                                                        
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}

如果使用 C++ 编译,中断处理程序需要 C linkage:

extern "C" void USART1_IRQHandler(void)      
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   
    {                                                                        
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}

没有 C linkage 函数 USART1_IRQHandler 将不会替换同名的默认处理程序,而是替换为 C linkage 的默认处理程序,这是一个无限循环,因此它似乎是“卡在中断函数中”,这是...只是一个不同的中断函数。

C linkage 防止 C++ "name mangling" 否则会导致符号与中断处理程序 weak-link 符号名称不同。