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 符号名称不同。
我把项目从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 符号名称不同。