中断中C函数调用C++

  之前,我们在单片机程序开发时都会面对中断函数。众所周知的,这个中断函数肯定是要用C函数来定义的。我在用C++进行程序开发的时候就发现了一个需要解决了问题:在断函数中怎么调用C++的成员函数?

    我的中断函数定义在文件 IRQHander.c 文件中,我想在串口中断函数调用 gPrinter.Putchar(ch) 函数。用于向 gPrinter 发送字符打印消息。

   尝试1:直接将 CDebug.h 文件包含进来。


<strong>#include "CDebug.h" 
       
void USART1_IRQHandler()  
{  
    RxData = USART1->DR;  
    gDebug.Printer(RxData);  
    ...  
}</strong>

   结果,一大堆错误。原因在于编译器以C的方试进行编译,然而C不认得 CDebug.h 文件中 class 这样的C++中的关键字。


    尝试2:将 IRQHandle.c 文件重命名为 IRQHandle.cpp ,让其以C++的方式进行编译。

    结果,编译没有问题。一旦触发了中断,系统就死在 startup.s 文件中默认的中断函数中了。这个默认的中断函数为找不到用户定议的中断处理函数默认指定的。原因在于 IRQHandle.cpp 中 USART1_IRQHandler() 在用C++进行编译后会根据参数类型对函数名进行修饰,因为C++要实现重载功能。如:

    原定义函数:int  Func ( int , char * )

    C++编译后:int  Func_i_cp ( int, char* ) 

    尝试3:加 extern "C" {} 进行修饰,让编译器不修改函数名。


<strong>#include "CDebug.h" 
       
extern "C" {  
       
void USART1_IRQHandler()  
{  
    RxData = USART1->DR;  
    gDebug.Printer(RxData);  
    ...  
}  
void Other_IRQHandler()  
{  
  ...    
}  
    ....  
       
    } </strong>

    结果,OK了。分析如下:
    (1)IRQHandler.c文件重命名为IRQHandle.cpp,让编译器用C++的方式进行编译,从而include C++ 的头文件不会报错。

    (2)加 extern "C" 的功能就是告诉编译器不对根据形参类型重新命令函数名,使之与C函数名一致。


    所以,要在C函数调用C++的成员函数,就像方案3那么做。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值