RT-Thread 与 C++ 的美满姻缘

关于作者:
hello 我叫Sugar 一名爱动脑、爱动手并且不断在进步的极客,开源作品有 ArduPilotLog(飞控日志分析软件)、car_407ve(结合 RT-Thread 和 ardupilot 的麦轮车)、QGC 飞控调试插件等。

背景介绍:RT-Thread C++”发现可参考的文章不算多。亲密配合https://www.rt-thread.org/qa/thread-11707-1-1.htmlhttps://github.com/SuWeipeng/car_407ve

RT-Thread 的 C++ 组件

  • 组件在哪里

    RT-Thread 与 C++ 的美满姻缘_第1张图片

  • 组件的依赖

    RT-Thread 与 C++ 的美满姻缘_第2张图片

给 RT-Thread 和 C++ 牵红线的过程

Sugar 只是做个媒,其实大多数工作 RT-Thread 都做完了。

  • 同平台下的 libc

    Sugar 开源代码不维护工程,只维护配置文件,工程可以交给 progen 自动生成

    这样的好处之一就是:通过配置文件能够很清楚地知道哪些代码参与了编译。

    对于配置文件的介绍请见《一招通吃 MDK5、IAR、GCC》和《【升级】一招通吃 MDK5、IAR、GCC》(1) MDK5 下的 libc

    RT-Thread 与 C++ 的美满姻缘_第3张图片

    (2) IAR 下的 libc

    RT-Thread 与 C++ 的美满姻缘_第4张图片

    (3) GCC 下的 libc

    RT-Thread 与 C++ 的美满姻缘_第5张图片

    GCC 下需要注意的地方

    RT-Thread 与 C++ 的美满姻缘_第6张图片所以 Sugar 没有用 RT-Thread 官网推荐的 env。

    这样在 gcc 编译的时候就要定义一个宏,防止 RT-Thread 的 libc 和系统的 libc 冲突。

    RT-Thread 与 C++ 的美满姻缘_第7张图片

  • GCC 下的链接脚本:

    链接脚本使用 rt-thread 官方代码里的 link.lds 最省事了,该折腾的 RT-Thread 官方都折腾好了。

    以前 Sugar 使用 CubeMX 生成的 链接脚本,要是用 C++ 的话要改的地方比较多。

    因为 Sugar 没有用 env,所以用 link.lds 的时候遇到了这个错误:

    /opt/gcc-arm-none-eabi-4_9-2015q3/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld: section .ARM.extab.text._Z15constrain_floatfff loaded at [08058358,08058363] overlaps section .data loaded at [08058358,0805871f]
    collect2: error: ld returned 1 exit status
    Makefile:145: recipe for target 'build/stm32f407ze-rtt.elf' failed
    make: *** [build/stm32f407ze-rtt.elf] Error 1

    别担心,其实在链接脚本里加一行就能解决这个问题了。

    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >CODE

    RT-Thread 与 C++ 的美满姻缘_第8张图片

  • 代码上要注意的地方

    (1) IAR 下不能有重名文件的解决办法。

    RT-Thread 与 C++ 的美满姻缘_第9张图片

    (2) C++11 标准与 RT-Thread。

    在遥控车的开源代码里 Sugar 移了 ardupilot 的库,ArduPilot 代码使用 C++11 标准。

    为了增加 rt-thread 和 C++11 的亲密度,让遥控车代码能三平台(MDK5、IAR、GCC)通用。

  • 这里 Sugar 花了不少时间。

    最终没有找到完美解决办法,MDK5下折了个中

    RT-Thread 与 C++ 的美满姻缘_第10张图片

    IAR 下 RT-Thread 和 C++11 兼容的办法。

    RT-Thread 与 C++ 的美满姻缘_第11张图片

    MDK 下 rt-thread 与 C++ 编译要注意的地方。

    RT-Thread 与 C++ 的美满姻缘_第12张图片

    GCC 下就不说了(因为要说的话比较多,背景介绍里那个引用的链接已经说得比较全面了)。

    (3) C++ 使用 rtthread 命名空间

    using namespace rtthread;

    RT-Thread 与 C++ 的美满姻缘_第13张图片

说了半天,这个代码控制效果到底是啥样?

这部分就要上 ArduPilotLog 来展示了。控制效果主要取决于算法和参数,rt-thread 为算法和日志的记录提供了良好的运行环境。

RT-Thread 与 C++ 的美满姻缘_第14张图片

RT-Thread 与 C++ 的美满姻缘_第15张图片

RT-Thread 与 C++ 的美满姻缘_第16张图片

从数据可以看出控制效果是相当不错的哦。

PS

不是 Sugar 造的代码,Sugar 只是代码的搬运工。

PID 是搬的 ardupilot 最新的 AC_PID 库。Log 是移植 ardupilot 的日志系统(改为 C 语言版)。用上国产 RTOS 实时系统 RT-Thread。

懂架构的好处就是:可以当个合格的搬运工。(这么说真是 LOW 到家了)懂架构可以用一点点吹灰之力就能高效的完成一整套优质可靠的代码实现目标任务。(这么说有没有更有吸引力?)

如果读者有想提高软件架构能力的意愿,欢迎加入 Sugar 的《软件架构训练计划》

END

RT-Thread线上活动

1、【RT-Thread能力认证考试12月——RCEA】经过第一次考试的验证,

能力认证官网链接:https://www.rt-thread.org/page/rac.html(在外部浏览器打开)

RT-Thread 与 C++ 的美满姻缘_第17张图片

立即报名

#题外话# 喜欢RT-Thread不要忘了在GitHub上留下你的640?wx_fmt=pngSTAR640?wx_fmt=png哦,你的star对我们来说非常重要!链接地址:https://github.com/RT-Thread/rt-thread

RT-Thread线下活动

1、STM32全国研讨会,RT-Thread近期参展城市预告:上海、广州、顺德

你可以添加微信18917005679为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群

640?wx_fmt=jpeg

RT-Thread

长按二维码,关注我们

640?wx_fmt=png
看这里,求赞!求转发!
640?wx_fmt=gif

640?wx_fmt=gif点击阅读原文进入RT-Thread官网

你可能感兴趣的:(RT-Thread 与 C++ 的美满姻缘)