今天这篇文章有点复杂,大家要注意一点看啦!
我们知道KEIL是支持C++的,网上一搜索也能找到一些使用C++的方法,无非是在Keil里的options->C/C++->Misc Controls里添加—cpp,如果要支持c++11,还需要指定—cpp11。事实上这样的C++并不是完整意义的上的C++,本人测试过,有好多C++的新功能都是没有办法实现的。这里需要注明的是,在KEIL5.18a以前的版本(包括5.18a)所支持的Arm Compiler只有ARM Compiler 5以及更低的版本,C++11支持不完整,而对C++11有完整支持就必须要使用Arm Compiler 6 即 AC6。
为了使用对C++11有完整支持的Arm Compiler 6(AC6),今天所使用的KEIL MDK版本至少应用为5.20版本以上(Arm Compiler 6.4)
本文中本人使用的AC6为6.7版本,为KEIL MDK 4.24a所自带的AC6编译器
这里需要注意的是AC6仅支持以下系统
  • Windows Server 2012, 64-bit only.
  • Windows 7 Enterprise SP1.
  • Windows 7 Professional SP1.
  • Windows 8.1, 64-bit only.
  • Windows 10, 64-bit only.
所以大家在试验之前,一定要检查下自己所使用的环境,否则就会浪费时间啦。
关于MDK的下载以及和谐办法,大家自行百度解决啦~
在开始之前,有个东西要了解,那就是microlib,不知道大家知道不知道,本来想写一篇关于microlib的文章,想必这是大家最熟悉的陌生人了。使用STM32CubeMX生成的MDK工程都会自动链接这个系统自带的库。
它就是Code Generation里的Use MicroLIB,默默地被勾上。
那么他最主要的作用是什么呢?
  • 创建栈空间
  • 创建堆空间,如果需要的话,这样才可以使用malloc等一些函数
  • 初始化用户可能用到的系统库
  • 调用用户的main函数
  • Microlib不支持exit函数
如果是C/C++ standardlib 还支持
  • 支持应用程序使用ISO定义的函数
  • 可以捕捉运行时错误并发送信号,如果需要,在错误发生时或行程序退出时还可以停止运行
然而真正的C++开发是不能链接microlib的,因为他只是标准C library的一个精简集。网上能查到microlib的一些限制,这里列举一些出来
  • Microlib和标准的IOS C库不兼容,所以不支持有些ISO所提供的特性或者功能不完整
  • 仅对C99库提供有限的函数支持
  • Microlib不支持C++
  • 不支持位置独立的代码
  • 不支持单个或双个的内存区域模型
  • 不支持Mutex以及不支持宽字符
正常情况下,在STM32CubeMX通过成的.s文件里可以看到一个__main函数,这个就是microlib的入口地址,他会完成上述的初始化动作,最后跳转到我们熟悉的main。
刚才也说过我们要实现真正的C++编程,就不能链接microlib,如果不链接microlib,就会默认链接到我们的C/C++标准库。
现在开始,首先依然是使用STM32CubeMX生成一个带串口的工程,阿圆有依旧是STM32F437ZGT6,工程名为ARMCCTest,要使用完整的C++11特性就必须使用AC6,这里把ARM Compiler设置为V6.7,并勾掉Use MicroLib
这里根据ARM官方的建议,检查下Short enums/wchar是否勾上
这样就设置好了。
但是呢,如果就这样去编译,会有一堆的编译错误
主要是__weak编译失败
AC6己经不支持直接声明 __weak了,需要使用 __attribute__((weak))替代。这里不建议使用全局替代的方法, 如下图所示
因为如果你的的工程里有包含了C++文件,这种方法可能把系统库里的__weak也给替换了,曾经吃过大亏!结果都重装KEIL了
好的,为了测试C++11的功能,我们新建一个CppTest.cpp文件,为了保持和C的兼容性呢我们把main挪到了cpp文件里,将原来Keil生成的main改为cmain即可
这里看到有一个Test类,这就是我们需要对C++11特性进行测试的类
这里面还包含了一个Base和Derived类
这样一个简单的C++测试用例就写好了!
但是!这样是不能执行的!一旦执行系统在跳到__main时之后就跑飞了!
大家可以想一想这是怎么一回事?
留白
留白
留白
好啦,不卖关子啦,事实上本人也找了近两天的时间才找到解决办法,一开始认为是heap和stack没有初始化好,尝试了好久均未成功,后来在网上得到启发,这个问题是出在STDIO初始化上。
如果要使用C/C++标准库就要对其STDIO进行Retarget的,很简单,但却是非常关键的一步,就是这么一回事啦。
下载ARM官方的retarget文件,并加入到工程当中(由于官方的原链接已失效,此处提供CSDN网址)
CSDN网址: https://download.csdn.net/download/qq_39276007/12948887
或者从此文章中复制: https://blog.csdn.net/qq_39276007/article/details/118253710?spm=1001.2014.3001.5501
稍微进行小修改,把它重定向到串口就可以啦!
现在就可以把代码编译运行一下,从SSCOM看到代码正常运行并输出了log
都运行成功了!
要问为什么没有使用std::cout,我也觉得很奇怪啦
../Src/CppTest.cpp(44): error: no member named 'cout' in namespace 'std'
std::cout<< "adsaf" ;
~~~~~^
上面只是简单测试了C++ vector容器,智能指针,auto变量和lambda表达式,当然C++11的内容比这要广泛得多,大家可自行测试!
不过要使用上完整的C++11代价也是非常大的(未开启优化 -O0编译)!上面的代码几乎不做什么有用的功能其大小竟然达到了可怕的231K!
大家还Hold住吗!哈哈!

用C++开发STM32程序相关推荐

  1. VS2019+VisualGDB+STM32CubeMx开发stm32程序

    简介 在使用过"宇宙最强" IDE--Visual Studio 之后 ,大有"一入VS深似海,眼中唯此IDE"之感.在接触单片机后,对Keil大失所望亦有&q ...

  2. STM32CubeIDE开发(二十九), 如何结合FreeRTOS开发STM32程序

    目录 一.STM32CubeIDE使用内置的FreeRTOS 二.创建使用FreeRTOS系统的STM32CubeIDE工程 三.使用FreeRTOS功能 四.编译及测试 一.STM32CubeIDE ...

  3. STM32CubeIDE开发(三十), 如何结合RT-Thread开发STM32程序

    目录 一.RT-Thread系统 二.cubeIDE安装RT-Thread支持 三.创建工程并添加RT-Thread支持 四.工程调整 五.编译错误问题解决 六.下载及测试 一.RT-Thread系统 ...

  4. VSCODE修改文字编码格式为GB2312和TAB键为2个空格(MDK5和VSCODE联合开发STM32程序)

    在MDK5中,代码.变量等的高亮显示或代码自动补全做的不是很好,经常会出现在A函数中有变量的高亮功能,在B函数中就没有了.特别是在RT-Thread创建的多个线程中,发现同一文件中的其它函数中的变量都 ...

  5. ubuntu linux下建立stm32开发环境: 程序烧录 openocd+openjtag

    原文出处: http://blog.csdn.net/embbnux/article/details/17619621 之前建立stm32开发环境,程序也已经编译好生成main.bin,接下来就是要把 ...

  6. Vscode开发STM32单片机程序

    STM32单片机非常强大,大多数教程都是使用 keil 编译器,keil 是收费的而 gcc 是开源免费的.这里介绍一些使用 gcc + vscode 开发单片机程序的经验.(这里不解释 gcc 是什 ...

  7. 6-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(远程升级STM32程序,基于Wi-Fi,同时支持升级Wi-Fi,APP控制版)...

    https://www.cnblogs.com/yangfengwu/p/10456306.html 视频教程 https://www.bilibili.com/video/av54942955/ 请 ...

  8. rust做嵌入式开发_Rust 嵌入式开发 STM32 amp; RISC-V

    Rust 嵌入式开发 STM32 & RISC-V 发布于 2020-04-03 11:07:06 本帖最后由 wuhanstudio 于 2020-4-3 11:58 编辑 更新地址: [m ...

  9. python stm32-尝试一下使用Python来开发STM32

    MicroPython是什么 微信图片_20200508183121.jpg (26.41 KB, 下载次数: 0) 2020-5-8 18:39 上传 程序猿中有句俗语: 人生苦短,我用Python ...

最新文章

  1. oracle使用小技巧
  2. Unity3D常用代码总结
  3. python资料库-Python对接六大主流数据库,只需三步
  4. C/C++ 类库开发库参考【资料整理】
  5. mysql 不join的原因
  6. java基础篇--------------配置jdk的环境变量
  7. 阿里星专访丨星罡:因为期待,你需要更出色!
  8. ImportError: No module named _internal
  9. Atitit mvc之道 attilax著 以vue为例 1. Atitti vue的几大概念 1 1.1. 声明式渲染 1 1.2. 条件与循环 2 1.3. 处理用户输入 click事件 2 1
  10. 使用Gps获取经纬度
  11. 软件测试流程图及描述
  12. MAXScript概况
  13. 北京林业大学matlab公选课,北林选课攻略
  14. Python实现网页自动截图
  15. ERP业务流程优化设计之思想和原则
  16. 【千锋】网络安全学习笔记(一)
  17. Premiere Pro 2022带来离线语音转文本教程
  18. 学画画,这些美术集标记好的学习重点拿去用
  19. idea左边项目栏目录结构不见了/文件夹在上面显示
  20. Qt渲染视频常见问题(视频渲染窗口上子窗口设置透明出现阴影问题、主窗口缩放导致视频渲染窗口部分出现视频闪烁问题)

热门文章

  1. phpStudy环境变量
  2. 思科模拟器:让同一交换机下不同VLAN间的电脑相互通信
  3. 虚拟码号的两种形式你了解多少!
  4. RDS Mysql Single-AZ和Multi-AZ性能差异
  5. c++中的sort函数
  6. 钛资本研究院:创业公司如何搭建高管团队,实现组织跃升?
  7. JAVA高频面试题目集锦
  8. CTF-Crypto 密码解密python脚本(一)
  9. Ajax传递数组到后台的两种方式
  10. 史上最详细Mysql免安装版教程