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

标签 c++ arm embedded startup keil

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

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

// 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 链接:

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

如果没有 C 链接,函数 USART1_IRQHandler 将不会替换同名的默认处理程序,但使用 C 链接是一个无限循环,因此它似乎“卡在中断中function”,它是……只是一个不同的中断函数。

C 链接可防止 C++“名称改组”,否则会导致符号与中断处理程序弱链接符号名称不同。

关于c++ - Keil5 C工程转C++工程报错用中断函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54217269/

相关文章:

security - ARM TrustZone 的安全/普通世界与操作系统的内核/用户模式还是 x86 的 Ring0/1/2/3?

c++ - 变量如何在自己的声明中获取自身的地址?

c++ - 在 VS 2010 中链接 WASAPI

C++对许多项目使用数组或 vector

arm - vmlaq_s16的有效使用

embedded - 虚拟 COM 通信问题

c++ - 生产者/消费者模式的 STL 容器线程安全

assembly - 与 Cortex-A53 相比,NEON 汇编代码在 Cortex-A72 上需要更多周期

c - dm365 mpeg4 编码器 P 帧

linux - 将 shell 脚本与内核操作同步