首先,VxWorks支持C++编程,毕竟面向对象语言功能强大。不过因为性能的原因,在实时系统里,更多的还是使用C语言来编程。尤其在信号和中断处理函数里调用C++的话,一些动态行为不能使用,例如非静态成员函数、实例化对象、删除对象、exception、run-time type identification(RTTI)等
VxWorks中的C++组件有
风河集成的两个编译器(diab和gnu)都支持C++,不过它俩基于C++源码编译得到二进制文件并不兼容!当然也包括它俩的C++系统库libcplus.a
另外,它俩的头文件也不相同,而且各自使用自己的路径,而不是系统的target/h
不过开发者不用关心这些信息,编译器会自动识别、自动查找它们的 ^_^
开发者需要注意的是,在启动包含了C++的任务时,需要包含VX_FP_TASK选项,因为C++的异常处理机制使用了浮点寄存器。否则上下文切换时,系统不会保存/恢复浮点寄存器的值,就有可能出现意想不到的错误
幸运的是,Host端的工具(例如Host Shell)默认包含了这个选项
因为C++支持函数重载,这样经过编译器编译后,符号表中的函数名肯定不能与源码中的函数名一致,因此C文件中无法直接访问C++的符号。为了解决这个问题,C++的符号需要使用extern "C"来声明
看个例子
在头文件中,使用宏__cplusplus来声明函数,这样C++和C文件都可以引用它
C++函数如下
C函数如下
跑一下试试
可以看到C与C++相互调用成功了: C里的funC1()调用了C++的funCpp1();funCpp1()又调用了C的funC0()
这正是:
支持但不是推荐,性能要考虑优先。
任务需使能浮点,声明兼容C语言。