单片机该不该用C++?

目前写个不算小的工程,用到了七八种传感器,还跑复杂的算法,发现驱动用C写,后期扩展起来挺费劲的。但目前主流单片机都是用C语言写,于是有了这个问题——单片机该不该用C++写。

我想,Quora上大佬的回答Why can't C++ replace C in embedded systems? 应该还是可靠的吧。

个人的总结如下,待时间去检验它的正确性吧:

  • CPU速率大于100MHz不用考虑C++语言本身对程序运行效率的影响(极少数需要使用C语言和汇编的关键过程除外)。现在都有说用Python来写单片机程序的了,C++还怕什么。当软没达到这个频率的CPU也可以考虑。
  • Flash大于100K,只要不用RTTI, STL库,而且是乖乖用C++中类和常量等基本语法,Flash应该Hold得住。在这个条件用,使用穿插使用C的String.h中的标准函数(除scanf这样的输入函数),大个10KB~20KB吧。
  • 没有很大的向下兼容的需求,如原先在高性能32位MCU上跑,后面要移植到8位MCU这样的问题。
  • 没有换编译器的需求,毕竟C++11、C++14和C++17还是有不小区别的。

C++一个无法逃避的问题是:

But mind you, writing complex code in C can give you nightmares.

But then debugging C++ code can give you nightmares as well.

如果实在不没有用C++的空间,那至少用个C98吧,都过去二十多年了!

若对STL感兴趣的话,可以看下“C:\Keil_v5\ARM\ARMCC\include”下的C++原码及其头头文件。虽然ARM没有开源C原码,但C++的原码还是挺友好的。

补充说明

2021/12/22: 使用STL标准容器时,注意内存分配子(allocator)的存在。

以FreeRTOS系统为例:任务堆栈默认使用一个全局静态数组。在任务中的vector除了将本身的骨架存储在任务栈中外,vector里存储的内容则是存储在中。而根据默认的内存分配子知,vector的内容应该是存储在.s文件所指明的系统堆中,而不是任务堆(任务堆是分配完任务栈后剩余的存储空间)。

2021/12/22:提前分配存储空间,而不是自动分配。

如vector的会在存储不够时,自动使用新的存储空间,并且会以2^n次方来预留空间。虽说一般单片机的内存空间是够跑C++的,但不并意味着可以随便用。推荐使用resize()或reserve()提前确定的一下可用的空间大小。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值