目前写个不算小的工程,用到了七八种传感器,还跑复杂的算法,发现驱动用C写,后期扩展起来挺费劲的。但目前主流单片机都是用C语言写,于是有了这个问题——单片机该不该用C++写。
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()提前确定的一下可用的空间大小。
原文链接:https://blog.csdn.net/NoDistanceY/article/details/104580751
|