前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Component之C++

Component之C++

作者头像
Taishan3721
发布2019-07-10 15:30:23
1K0
发布2019-07-10 15:30:23
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks

首先,VxWorks支持C++编程,毕竟面向对象语言功能强大。不过因为性能的原因,在实时系统里,更多的还是使用C语言来编程。尤其在信号和中断处理函数里调用C++的话,一些动态行为不能使用,例如非静态成员函数、实例化对象、删除对象、exception、run-time type identification(RTTI)等

VxWorks中的C++组件有

  • INCLUDE_CTORS_DTORS - 默认包含,确保内核启动时调用编译器生成的初始化函数(包含C++静态对象的初始化)
  • INCLUDE_CPLUS - C++应用的基本支持,通常与INCLUDE_CPLUS_LANG一起使用
  • INCLUDE_CPLUS_LANG - C++语言特性的支持,例如new、delete、异常处理等
  • INCLUDE_CPLUS_IOSTREAMS - 包含所有类库功能
  • INCLUDE_CPLUS_DEMANGLER - C++符号的还原(demangler),使用Kernel Shell加载器时,会用到它。使用INCLUDE_CPLUS和INCLUDE_SYM_TBL时,会包含它

风河集成的两个编译器(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语言。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档