Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
rt-thread 与 C++ 的美满姻缘
发布于 2019-09-10 10:36:41 浏览:1513
订阅该版
[tocm] * 本帖最后由 Sugar 于 2019-9-10 10:42 编辑 * > 背景介绍: > 网上搜关键词“**rt-thread C++**”发现可参考的文章不算多。 > Sugar 在自己开源遥控车代码中促成了 rt-thread 和 C++ 的美满姻缘。 > 美好姻缘是指:不论是用 MDK5、IAR 或者 GCC,都可以**亲密配合**。 > 过程中有参考:**https://www.rt-thread.org/qa/thread-11707-1-1.html** > 遥控车开源地址:**https://github.com/SuWeipeng/car_407ve** rt-thread 的 C++ 组件 --- * 组件在哪里 ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/cpp_1.jpg)) * 组件的依赖 ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/cpp_2.jpg)) 给 rt-thread 和 C++ 牵红线的过程 --- > Sugar 只是做个媒,其实大多数工作 rt-thread 都做完了。 > Sugar 觉得 rt-thread 潜力大的原因之一是:工作做得全面细致。 > 开源代码发展得既健壮又精细真的不容易。 * 不同平台下的 libc Sugar 开源代码不维护工程,只维护配置文件,工程可以交给 progen 自动生成。 这样的好处之一就是:通过配置文件能够很清楚地知道哪些代码参与了编译。 对于配置文件的介绍请见[《一招通吃 MDK5、IAR、GCC》](https://mp.weixin.qq.com/s/aPUbSAndjvs4CaPj3CFsJg)和[《【升级】一招通吃 MDK5、IAR、GCC》](https://mp.weixin.qq.com/s/iVmaQ3S4vcitbJ8iXZyArw) (1) MDK5 下的 libc ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/libc_1.jpg)) (2) IAR 下的 libc ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/libc_2.jpg)) (3) GCC 下的 libc ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/libc_3.jpg)) * GCC 下需要注意的地方 ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/gcc_link_1.jpg)) 由于 Sugar 在自己的 ubuntu 虚拟机里配置了 ardupilot 开发环境,该有的都有了,所以 Sugar 没有用 rt-thread 官网推荐的 env。 这样在 gcc 编译的时候就要定义一个宏,防止 rt-thread 的 libc 和系统的 libc 冲突。 ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/libc_4.jpg)) 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 ``` ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/gcc_link_2.jpg)) * 代码上要注意的地方 (1) IAR 下不能有重名文件的解决办法。 ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/cpp_3.jpg)) (2) `C++11` 标准与 rt-thread。 在遥控车的开源代码里 Sugar 移了 ardupilot 的库,ArduPilot 代码使用 `C++11` 标准。 为了增加 rt-thread 和 `C++11` 的亲密度,让遥控车代码能三平台(MDK5、IAR、GCC)通用。这里 Sugar 花了不少时间。 最终没有找到完美解决办法,折了个中。 ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/cpp11_1.jpg)) IAR 下 rt-thread 和 `C++11` 兼容的办法。 ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/cpp11_2.jpg)) MDK 下 rt-thread 与 C++ 编译要注意的地方。 ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/cpp_4.jpg)) GCC 下就不说了(因为要说的话比较多,且背景介绍时那个引用的链接已经说得比较全面了)。 (3) C++ 使用 rtthread 命名空间 ```cpp using namespace rtthread; ``` ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/12_RT-Thread/cpp_5.jpg)) 至此,rt-thread 和 C++ 已拜过天地,可以共入洞房了。 说了半天,这个代码控制效果到底是啥样? --- > 这部分就要上 ArduPilotLog 来展示了。 > Sugar 不想写这一节,因为与本次推文关系不大。 > 控制效果主要取决于算法和参数,rt-thread 为算法和日志的记录提供了良好的运行环境。 > 上两张 ArduPilotLog 的图,说明 Sugar 本文不是在瞎掰。 ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/13_car/pid_5.jpg)) ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/13_car/pid_4.jpg)) ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/13_car/pid_3.jpg)) 从数据可以看出控制效果是相当不错的哦。 PS --- > 不是 Sugar 造的代码,Sugar 只是代码的搬运工。 > 这么说虽然很 LOW,但咱实事求是。 PID 是搬的 ardupilot 最新的 AC_PID 库。 Log 是移植 ardupilot 的日志系统(改为 C 语言版)。 用上国产 RTOS 实时系统 rt-thread。 懂架构的好处就是:可以当个合格的搬运工。(这么说真是 LOW 到家了) 换个高大上的方式:懂架构可以用一点点吹灰之力就能高效的完成一整套优质可靠的代码实现目标任务。(这么说有没有更有吸引力?) 如果读者有想提高软件架构能力的意愿,欢迎加入 Sugar 的[《软件架构训练计划》](https://mp.weixin.qq.com/s/6wM1kMKWpOJxBatzTNxShQ) 关注作者 --- 欢迎扫码关注我的公众号`MultiMCU EDU`。 ![](![FastAdmin](https://github.com/SuWeipeng/img/raw/master/gongzonghao.jpg)) ### `提示:在公众号“关于我”页面可加作者微信好友。` ### `喜欢本文求点赞,有打赏我会更有动力。`
查看更多
4
个回答
默认排序
按发布时间排序
bernard
2019-09-10
这家伙很懒,什么也没写!
都是
标记:L
Sugar
2019-09-10
这家伙很懒,什么也没写!
>都是 标记 --- 我也发现了,然后一个一个改掉了
wuhanstudio
2019-09-10
这家伙很懒,什么也没写!
现在 C++ 11 是不是支持还不是很好
Sugar
2019-09-10
这家伙很懒,什么也没写!
准确说目前rt-thread还不能用C++11的方式编译,源码里or,and,xor,auto这些与C++11关键字冲突。 文中的方法是区别c文件和cpp文件的编译,这样就可以回避这个问题。 但MDK5默认的编译器要支持C++11要加 --cpp11,这样就是不管是c还是cpp都用C++的方式编译,这不行。misc什么都不加,就是c用c的编译方式,cpp用C++的编译方式,这样可以支持C++,但不支持C++11。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.5k
关于作者
Sugar
这家伙很懒,什么也没写!
提问
3
回答
3
被采纳
0
关注TA
发私信
相关问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
16
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部