本文描述了如何使用在搭载了 RT-Thread 系统的 STM32 平台上使用 C++,包括 C++ 的配置和应用等。并给出了在STM32F411 NUCLEO开发板上验证的代码示例。

硬件平台简介

本文基于意法半导体 STM32F411 NUCLEO开发板,给出了 C++ 的具体应用示例代码,由于RT-Thread上层应用API的通用性,因此这些代码不局限于具体的硬件平台,用户可以轻松将它移植到其它平台上。

STM32F411 NUCLEO是意法半导体推出的一款基于ARM Cortex-M4内核的开发板,最高主频为100Mhz,该开发板具有丰富的板载资源,可以充分发挥STM32F411RE 的芯片性能。

STM32F411RE从属于销量名列前茅的STM32F4系列,众所周知,F4是STM32主打高性能和数字信号处理的“轻奢”系列。

“奢侈”在F4作为内核为Cortex-M4 (DSP+FPU)的MCU,可选180MHz 主频、2M Flash/384KB RAM、Chrom-ART加速器、MPI-DSI接口、延伸到125度的工作温度、DFSDM数字滤波器以及各种常见的音频(SAI)、连接(Ethernet、Camera、USB)、控制(CAN、UART、I2C)、存储(FMC、2/4/8 bits SPI、SDMMC)外设。

“轻”在价格让人“轻松”、尺寸“轻巧”(不到3mm*3mm的封装)、功耗“轻微”。

如何在 STM32 上使用 C++

准备工作

1、下载 RT-Thread 源码

2、下载 ENV 工具

3、进入rt-thread\bsp\stm32f411-st-nucleo 目录,检查 BSP rtconfig.py 文件和 SConstruct 文件是否支持 C++ 配置,如下图所示检查 rtconfig.py 文件中对 C++ 的支持,检查 SConstruct 文件中对 C++ 的支持

打开 C++ 支持:

打开 Env 工具,在 Env 命令行中输入 menuconfig,进入配置界面,使用 menuconfig 工具(学习如何使用)配置工程。在 menuconfig 配置界面依次选择 RT-Thread Components ---> C++ features ---> Support C++ features,如图所示:

编译工程: scons --target=mdk5 1. 生成 mdk5 工程,将示例代码附带的 main.cpp 替换掉 BSP 中的 main.c 并重新加入到工程中,如图所示:

编译,下载程序,在终端输入 help 命令可以看到 test_cpp 已经添加成功了。

运行 C++ 程序:

在终端输入 test_cpp 运行结果如下图所示。

C++ 全局对象构造函数的调用

RT-Thread 中对全局对象构造函数的实现中,以 GNUC 为例,在 rt-thread\components\cplusplus 目录下的 crt_init.c 文件中对 C++ 进行了系统初始化, 在特定的 BSP 目录下,连接脚本文件 link.lds 为 C++ 全局构造函数的代码分配了段,使 C++ 全局对象构造函数链接后能够存放在指定的段中。如下图所示:

在 cplusplus_system_init 函数中,将全局对象的构造函数依次链接到了链接脚本文件中为其分配的段中,并且调用了 RT-Thread 组件自动初始化的宏 INIT_COMPONENT_EXPORT,所以在链接的时候,C++全局对象构造函数所产生的目标文件就被链接到了__ctors_start__和__ctors_end__组成的段中。

链接脚本中为 C++ 全局构造函数分配的段部分:

1PROVIDE(__ctors_start__ = .);

2KEEP (*(SORT(.init_array.*)))

3KEEP (*(.init_array))

4PROVIDE(__ctors_end__ = .);

__ctors_start__ 分配了 C++ 全局构造函数段的起始地址, __ctors_end__ 分配了 C++ 全局构造函数段的结束地址,所以全局构造函数在系统初始化的时候,就会被链接到这里分配的段地址中。

RT-Thread C++ 异常说明

同样,在链接脚本文件 link.lds 中,也为 C++ 异常分配了段地址:

1 __exidx_start = .;

2 ARM.exidx :

3 {

4 *(.ARM.exidx* .gnu.linkonce.armexidx.*)

5 _sidata = .;

6 } > CODE

7 __exidx_end = .;

__exidx_start 分配了 C++ 异常的起始地址, __exidx_end 分配了 C++ 异常的结束地址,当异常产生的时候,就会被分配到指定的段地址中。

这里以一个 C++ 除零异常的抛出和捕获为例:

1 #include

2

3 #define MIN_VALUE (1e-4)

4 #define IS_DOUBLE_ZERO(d) (abs(d) < MIN_VALUE)

5

6 double div_func(double x, double y)

7 {

8 if (IS_DOUBLE_ZERO(y))

9 {

10 throw y; /* throw exception */

11 }

12

13 return x / y;

14 }

15

16 void throw_exceptions(void *args)

17 {

18 try

19 {

20 div_func(6, 3);

21 rt_kprintf("there is no err\n");

22 div_func(4, 0); /* create exception*/

23 rt_kprintf("you can run here?\n");

24 }

25 catch(double) /* catch exception */

26 {

27 rt_kprintf("error of dividing zero\n");

28 }

29 }

30

31 MSH_CMD_EXPORT(throw_exceptions, throw cpp exceptions);

当除零异常发生的时候 div_func 函数会抛出一个异常,在 throw_exceptions 函数中会去捕获这个异常。

下载代码,并在终端输入 throw_exceptions 运行结果如下图所示。

到这一步为止,如何在搭载了 RT-Thread 系统的 STM32 平台上如何使用 C++ 的介绍就结束了。

rtthread工业使用_在STM32平台跑RT-Thread下的C++详尽使用指南相关推荐

  1. 正点原子STM32 H743完成RT Thread下的LAN8720 网卡驱动 LWIP跑起来

    ,目前RT官网对H743的支持力度还不理想,本想按照F407的搞定网卡的套路来搞定H743的网卡(因为phy也是LAN 8720),以为会很轻松,没想到却是一条遍布荆棘的路... 好在已经有不少大佬做 ...

  2. stm32中用到的实时系统_基于STM32平台的实时操作系统

    基于STM32平台且满足实时控制要求操作系统,有以下5种可供移植选择,分别为μClinux.μC/OS-II.eCos.FreeRTOS和都江堰操作系统(djyos). 下面分别介绍这五种嵌入式操作系 ...

  3. rtthread工业使用_基于RTThread 的LwIP使用讲解

    在RT-Thread 1.1.x系列中默认使用lwIP 1.4.0作为TCP/IP协议栈,同时为了保持原有驱动的兼容性, 对lwIP 1.4初始移植做了调整,在驱动编写,初始化顺序上可以完整兼容lwI ...

  4. jpg 神经网络 手势识别_在STM32上跑神经网络做手势识别

    为了在Cortex-M的MCU上成功跑起CNN,用的模型是一个不到10层FCN网络,但是即便如此,对于主频只有不到100MHz,SRAM只有不到100K的单片机来说依然是极其吃力的,模型不做量化的话肯 ...

  5. aosp 本地版本管理_谈 DevOps 平台实施:我在本地跑明明成功的,为什么在你平台跑就报错?...

    我在本地跑明明成功的,为什么在你平台跑就报错? 用户在 Jenkins 上跑构建时,失败了,把日志截图给我看,如下图: 在过去几个月,每个星期都会有一两个 Jenkins 用户就会给我发送类似的错误日 ...

  6. 码支付如何对接网站_码支付,对接自己的网站教程,再也不怕某些支付平台跑路了...

    点击上方"蓝字"关注我们了解更多精彩 一分钱可以买到什么?扫码看看 答应我要看完哦~ --------- ■ ■ ■ -------- 最近听到很多网站的兄弟说某某支付平台跑路了. ...

  7. stm32硬件消抖_在 STM32 上使用 C++ 指南

    结识更多同行,共同讨论"嵌入式"技术.欢迎添加社区客服微信,备注发送"电源+公司名(学校)+职位(专业)"拉您入群. 简介 本文描述了如何使用在搭载了 RT-T ...

  8. 如何在PAI平台跑实验

    PAI平台使用教程 build image upload & run storage system build image 首先去官网下载docker windows,如果系统不适配,就用官网 ...

  9. 阿里云_数加平台类HQL的那些坑

    简介 近期在练习机器学习算法,部分数据本机跑太慢了.恰好阿里云有在线的机器学习平台,所以不妨用阿里云来实现了. 将之前MySQL数据迁移到阿里云上,这个过程主要比较顺利的.但后面修改特征提取sql时就 ...

最新文章

  1. 关于Zigbee的常识
  2. base64图裁剪 php_世界上最好的编程语言PHP图层裁剪服务搭建详解
  3. 正式发布!中国首个LF Edge捐赠项目Baetyl 2.2发布
  4. 蒙特卡洛梯度估计方法(MCGE)简述
  5. linux在shell中获取系统时间,linux在shell中获取时间
  6. lichee linux nfs,SPI Flash 系统编译
  7. 什么样的人才容易被骗?
  8. VOC2007和COCOmAP计算
  9. ideaIU-2019.3.3 百度云下载链接
  10. 刨根问底:什么是yum源,yum的工作原理又是什么
  11. 软件测试与游戏测试文章合集录
  12. DataGrid 嵌套应用
  13. 斗球体育直播app看赛事,选用【抓饭直播】
  14. 压力位和支撑位的理解。
  15. DUL Oracle Data Unloader工具下载
  16. 第四章(1.2)机器学习——在web攻击检测中的应用实践
  17. Linux下的硬件驱动——USB设备配置以及开发
  18. HW机试题字符串分割
  19. 我的 网上商城网站布局 练习(含效果图和源码)
  20. @pack://application:,,,/报错

热门文章

  1. Visio2016通过部署工具的方式进行安装
  2. mt6735 ALSA Driver内部功放如何切到CLASSD
  3. swoft 协程 的使用
  4. 【Hydro】半图解法调洪演算步骤,附Python代码
  5. Unity如何改变和调整粒子系统大小和程序入门,非美术向
  6. linux 安装 iftop
  7. 07 数据库系统设计综合实验 实验报告
  8. 百钱买百鸡(C语言,枚举法)
  9. 正面管教之PHP_正面管教家长互助(PHP)体验课2
  10. 功能简单却流量巨大,你想不到的海外APP