0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用在搭载了RT-Thread系统的STM32平台上使用C++

GReq_mcu168 来源:玩转单片机 2019-12-08 10:27 次阅读

简介

本文描述了如何使用在搭载了 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)、控制(CANUARTI2C)、存储(FMC、2/4/8 bits SPI、SDMMC)外设。

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

如何在STM32上使用C++

准备工作

1、下载RT-Thread 源码

2、下载ENV 工具

3、进入rt-threadspstm32f411-st-nucleo目录,检查 BSPrtconfig.py文件和SConstruct文件是否支持C++配置,如下图所示

检查rtconfig.py文件中对C++的支持

检查SConstruct文件中对C++的支持

打开C++支持:

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

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

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

运行C++程序:

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

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

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

crt_init.c文件完成了C++系统的初始化工作

C++系统初始化部分:

1RT_WEAKintcplusplus_system_init(void) 2{ 3typedefvoid(*pfunc)(); 4externpfunc__ctors_start__[]; 5externpfunc__ctors_end__[]; 6pfunc*p; 7 8for(p=__ctors_start__;p< __ctors_end__; p++) 9        (*p)(); 10 11    return 0; 12} 13INIT_COMPONENT_EXPORT(cplusplus_system_init);

在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=.; 2ARM.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#defineMIN_VALUE(1e-4) 4#defineIS_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 "); 22            div_func(4, 0);                                   /* create exception*/ 23            rt_kprintf("you can run here? "); 24        } 25        catch(double)                                         /* catch exception */      26        { 27            rt_kprintf("error of dividing zero "); 28        } 29    } 30 31    MSH_CMD_EXPORT(throw_exceptions, throw cpp exceptions);

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2264

    文章

    10852

    浏览量

    354171
  • C++
    C++
    +关注

    关注

    21

    文章

    2094

    浏览量

    73446
  • RT-Thread
    +关注

    关注

    31

    文章

    1257

    浏览量

    39811

原文标题:在 STM32 上使用 C++ 指南

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【QEMU系列】不用开发板运行RT-Thread指南-ARM架构

    成为一个门槛。本文将详细介绍如何在QEMU虚拟机的Vexpress-A9平台上运行RT-Thread,帮助开发者在没有实际硬件开发板的情况下,轻松体验和学习RT-Th
    的头像 发表于 08-09 08:35 719次阅读
    【QEMU系列】不用开发板运行<b class='flag-5'>RT-Thread</b>指南-ARM架构

    杭州站RT-Thread混合部署Workshop圆满落幕!

    参与。非常感谢睿赛德科技工程师张康带来精彩的技术讲解,并与大家深入探讨了在瑞芯微RK3568平台上实现RT-Thread与Linux的高效混合运行方法。本次Wor
    的头像 发表于 06-08 08:35 405次阅读
    杭州站<b class='flag-5'>RT-Thread</b>混合部署Workshop圆满落幕!

    6月6日杭州站RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    嵌入式软件工程师郭占鑫老师为您讲解有关技术知识和实践经验。通过本次workshop能深入理解RT-Thread专业版与混合部署的潜力,在RK3568平台上提升系统实时
    的头像 发表于 05-28 08:35 373次阅读
    6月6日杭州站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    5月16日南京站RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    嵌入式软件工程师郭占鑫老师为您讲解有关技术知识和实践经验。通过本次workshop能深入理解RT-Thread专业版与混合部署的潜力,在RK3568平台上提升系统
    的头像 发表于 05-01 08:35 296次阅读
    5月16日南京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    RT-Thread混合部署Workshop北京站来啦!

    嵌入式软件工程师郭占鑫老师为您讲解有关技术知识和实践经验。通过本次workshop能深入理解RT-Thread专业版与混合部署的潜力,在RK3568平台上提升系统
    的头像 发表于 04-19 08:34 379次阅读
    <b class='flag-5'>RT-Thread</b>混合部署Workshop北京站来啦!

    4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式

    嵌入式软件工程师郭占鑫老师为您讲解有关技术知识和实践经验。通过本次workshop能深入理解RT-Thread专业版与混合部署的潜力,在RK3568平台上提升系统
    的头像 发表于 04-16 08:35 374次阅读
    4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    【4月10日-深圳-workshop】RT-Thread带你探索混合部署新模式

    嵌入式软件工程师农晓明老师为您讲解有关技术知识和实践经验。通过本次workshop能深入理解RT-Thread专业版与混合部署的潜力,在RK3568平台上提升系统
    的头像 发表于 04-04 08:34 279次阅读
    【4月10日-深圳-workshop】<b class='flag-5'>RT-Thread</b>带你探索混合部署新模式

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread
    的头像 发表于 03-27 11:36 733次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    嵌入式软件工程师农晓明老师为您讲解有关技术知识和实践经验。通过本次workshop能深入理解RT-Thread专业版与混合部署的潜力,在RK3568平台上提升系统
    的头像 发表于 03-27 08:34 457次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    RT-Thread混合部署Workshop在上海张江成功举行

    软件工程师郭老师,向参与者们分享在瑞芯微RK3568平台上实现RT-Thread与Linux混合运行的技术内容和实践经验。此次Workshop的核心,是能让参与
    的头像 发表于 03-23 08:34 313次阅读
    <b class='flag-5'>RT-Thread</b>混合部署Workshop在上海张江成功举行

    就在本周四!探索RT-Thread混合部署新模式!

    嵌入式软件工程师郭老师为您讲解有关技术知识和实践经验。通过本次workshop能深入理解RT-Thread专业版与混合部署的潜力,在RK3568平台上提升系统实时性
    的头像 发表于 03-20 08:34 479次阅读
    就在本周四!探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    【PSoC™62 for RT-ThreadRT-Thread携手英飞凌举办嵌入式网络应用开发沙龙,圆满落幕!

    题的线下沙龙!此次沙龙聚焦使用英飞凌科技PSoC62在RT-Thread Studio平台上进行开发,并结合智能数据网关动手培训为开发者们提供深入了解英飞凌与学习使用RT-Thread
    的头像 发表于 12-14 16:25 507次阅读
    【PSoC™62 for <b class='flag-5'>RT-Thread</b>】<b class='flag-5'>RT-Thread</b>携手英飞凌举办嵌入式网络应用开发沙龙,圆满落幕!

    RT-thread源码移植到STM32F10x和STM32F4xx

    的application.c和startup.c。 --F:RT-Thread源码 t-thread-2.1.0spstm32f10
    的头像 发表于 11-15 09:38 2317次阅读
    <b class='flag-5'>RT-thread</b>源码移植到<b class='flag-5'>STM32</b>F10x和<b class='flag-5'>STM32</b>F4xx

    i.MX RT1170:VGLite移植RT-Thread Nano过程讲解(下)

    上篇介绍了如何移植 RT-Thread Nano 内核与 Finsh 控制RT1170。本篇继续介绍如何将 NXP 官方的 VGLite API 移植到 RT-Thread Na
    的头像 发表于 11-09 11:22 838次阅读

    i.MX RT1170:VGLite移植RT-Thread Nano过程讲解()

    RT-Thread 是国人自主研发的开源实时操作系统(RTOS),RT-Thread Nano 是极简版的硬实时内核,内存占用小,移植简单。VGLite 是 NXP 提供的轻量级 2D 图形 API,基于 FreeRTOS 实现
    的头像 发表于 11-09 11:20 2429次阅读
    i.MX <b class='flag-5'>RT</b>1170:VGLite移植<b class='flag-5'>RT-Thread</b> Nano过程讲解(<b class='flag-5'>上</b>)