C++在嵌入式MCU开发中的应用与实践
2025/12/3大约 2 分钟
我们都知道编译c语言用的是gcc,编译c++用的是g++,而嵌入式MCU的gcc工具链是早就支持了C++的。
我觉得C++最好的一点是“零成本抽象”,你不需要损耗任何性能就能获得较高层级的抽象
注意事项
- 尽量避免堆内存分配
- 不要使用异常
- 不要使用RTTI(运行时类型识别)
- 各种需要动态确定的东西最好都别用,用了就有开销
推荐的方式
- 使用模板类(一会会说模板是什么)
- 使用静态成员函数
与C语言交互
在C++中如果想要函数能被C语言调用需要在extern "C"块内定义,因为C++在编译时会对符号进行修饰,导致链接时C语言报错:符号未定义。如果C++想调用C语言的函数也要在extern "C"块内声明,包括想要使用的C的全局变量也要声明,C++与C的全局变量是不共享的。也就是说C++所有和C交互的地方都要在这个块内,否则链接错误。
我们可以在一个.cpp文件中写一个简单的函数让.c的文件调用,看看效果
C++语法
模板
模板简而言之就是根据你的代码,编译器来帮你生成代码。C++的泛型编程也是基于模板的
静态成员函数
如无必要,勿增实体。对于不是特别复杂的类,一般不创建对象
意思是这个方法不是属于某个对象的,而是属于这个类的。调用是使用类名而不是对象
工程分层
我们在写C语言的时候也是这样的分层,不过到了C++,就更清晰了:PAC->HAL->驱动/中间件->应用层
每一层都只最对外声明自己需要的接口并对外声明提供的接口。而且在使用泛型的情况下,极大的降低了每一层耦合度
我们一般都是在HAL之后的层开发,接下来我们写一个LED的驱动作为示例
示例工程
LED提供的接口:点亮、熄灭、翻转
LED需求的接口:GPIO类的SET、RESET、TOGGLE方法
对于GPIO类,我们可以HAL/LL库,也可以直接操作寄存器,只要实现了上层(驱动层)需要的接口就可以
