中断中C函数调用C++
来源:互联网 发布:信息安全与网络管理 编辑:程序博客网 时间:2024/05/06 14:55
之前,我们在单片机程序开发时都会面对中断函数。众所周知的,这个中断函数肯定是要用C函数来定义的。我在用C++进行程序开发的时候就发现了一个需要解决了问题:在断函数中怎么调用C++的成员函数?
(1)IRQHandler.c文件重命名为IRQHandle.cpp,让编译器用C++的方式进行编译,从而include C++ 的头文件不会报错。
(2)加 extern "C" 的功能就是告诉编译器不对根据形参类型重新命令函数名,使之与C函数名一致。
我的中断函数定义在文件 IRQHander.c 文件中,我想在串口中断函数调用 gPrinter.Putchar(ch) 函数。用于向 gPrinter 发送字符打印消息。
尝试1:直接将 CDebug.h 文件包含进来。
#include "CDebug.h"void USART1_IRQHandler(){ RxData = USART1->DR; gDebug.Printer(RxData); ...}结果,一大堆错误。原因在于编译器以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" {} 进行修饰,让编译器不修改函数名。
#include "CDebug.h"extern "C" {void USART1_IRQHandler(){ RxData = USART1->DR; gDebug.Printer(RxData); ...}void Other_IRQHandler(){ ... }....}结果,OK了。分析如下:
(1)IRQHandler.c文件重命名为IRQHandle.cpp,让编译器用C++的方式进行编译,从而include C++ 的头文件不会报错。
(2)加 extern "C" 的功能就是告诉编译器不对根据形参类型重新命令函数名,使之与C函数名一致。
所以,要在C函数调用C++的成员函数,就像方案3那么做。
- 中断中C函数调用C++
- C中调用C++函数 C++中调用C函数
- c中断函数
- c中调用c++函数
- C中调用C++函数
- C中调用C++函数
- C中调用C++函数
- c中调用c++函数
- C中调用Lua函数
- Lua中调用C函数
- C中调用Lua函数
- python调用c中函数
- c中调用Lua函数
- ios object-c 中调用c函数
- 在Turbo C下,中断函数中是不可以调用printf函数【经验证,在linux c中同样存在此问题】
- C 函数中调用 C++函数
- C 函数中调用 C++函数
- C 函数中调用 C++函数
- 【C++ STL】深入解析神秘的 --- 仿函数
- 欢乐端午节(CD1732)
- Jack's Notes7——反射案例(主程序加载插件)
- sql基础语法
- Centos5.7x64 上部署 oracle11R2 重点概要
- 中断中C函数调用C++
- [转]3D引擎渲染效率如何提升
- Android客户端关于文件的上传到服务器
- [转]阅读一款3D引擎的方法备忘
- PHP5 Session 浅析I
- Spring3.X第一次接触
- PHP目录以及文件遍历类欢迎大家拍砖
- linux定时器编程
- 各种系统架构图及其简介