前言
在讨论C++是否适合单片机开发之前,我们先了解嵌入式开发的发展特点。
- 传统开发方式: 几十年来, C一直在嵌入式开发中占有主导作用,其简单的语法、高效的空间利用和运行效率、强大的底层控制能力,使得C成为嵌入式固件开发的理想选择。在业界知名的嵌入式操作系统,RT-Thread,FreeRtos,UCos等,都是使用C开发,各种单片机的外设库无一例外都是使用C来开发驱动。
- 新的开发需求: 随着嵌入式系统复杂性的的不断增加,越来越多的应用需要利用面向对象的编程思想搭建编程框架,降低维护难度。在应用编程领域,C则不如C++方便,面向对象编程是C++的核心,它能有效的管理开发的框架,方便搭建应用框架。
- C++的发展: C++几乎完全兼容C,同时引入类、多态、继承、模板等特性,这些新特性能极大方便开发人员模块化编写代码,降低程序难度、提高模块的可重用性,可移植性,提高开发效率。
- 处理器的进化: 尽管嵌入式开发中主流的架构任然是32位的Arm或其他内核,但芯片的存储空间越来越大、从原来的几K到现在的几M,开发人员无需过于担心存储空间不够使用的情况,芯片的运行主频也越来越高,由原来的几M到现在的几百M甚至1G,让芯片也能高速的运行高级代码如C++甚至Python。这些改变能让开发者在单片机中实现更加复杂的应用,让C++开发者无需再担心程序过大和运行效率低的问题。
使用C++开发嵌入式的优点
在我看来,使用C++开发嵌入式,有以下几个优点:
- 面向对象编程:在嵌入式系统中使用 C++ 的主要优势之一是它对面向对象编程的支持。这使开发人员能够快速创建类和对象,管理和使用对象,从而促进代码重用和模块化。这在嵌入式系统中尤其有利,因为代码的复杂度和可维护性至关重要。
- 可移植性:由于部分 C++ 代码可以轻松重用,因此该代码也可以轻松从一个芯片移植到另一台芯片。
- 多范式编程:使用 C++,可以支持多种范式,例如结构化编程、面向对象编程、泛型编程、函数式和并发编程范式。这些特点能提高编程效率,规范模块接口,缩短开发周期。
- 标准模板库 (STL):C++ 拥有强大的 STL,可提供广泛的数据结构和算法。由于C++使用代码和标准库的组合,因此它可以轻松得使用,简化了代码开发,并提高了代码质量和安全,因为开发人员可以利用经过良好测试的高效 STL 组件。
- 安全和抽象:C++ 支持封装和抽象等功能,使开发人员能够隐藏复杂的实现细节并公开更干净、更安全的接口。这可以产生更健壮和可维护的代码。这使得它成为每个人的语言,方便开发者非常简单的入手成熟的框架,即使是小白也能轻松理解,如Arduno的流行,即展示了使用C++的优势,让更多的创客能快速开发自己想要的功能,因为无需去探究接口内部的逻辑。
- 强类型系统:C++ 是一种功能强大的编程语言,旨在以易于使用的方式发展,这就是程序易于阅读、理解、编写和维护的原因。C++编译器强制检查数据类型,减少了类型相关错误的可能性,避免无意的非法修改行为。
- 权限管理:C++对于类对象的数据管理区分保护、私有、公开三种类型,保证类对象的数据安全。
使用C++开发嵌入式的缺点
- 资源限制:使用嵌入式 C++ 的担忧之一是性能下降,因为嵌入式系统在严格的资源限制下运行,包括有限的内存和处理速度/功率。大多数 C++ 功能都可以在运行 Linux 等操作系统的设备上使用。但嵌入式 C++ 由于其特性而引入了一些开销,这在资源受限的环境中可能会敏感。但是,C++也有零开销原则,固件无需为不使用的内容付出代价。
- 编译器和工具链支持:C++ 背后有一个强大的用户和开发人员社区。然而,并非所有现有的嵌入式系统平台都具有成熟的 C++ 工具链和库。且兼容性问题可能会给采用带来重大障碍。
- 学习曲线:从 C 过渡到 C++ 对于习惯前者的开发人员来说可能需要一个学习曲线。团队可能需要一段时间才能精通 C++ 并充分发挥其优势。这可能特别困难,因为语言总是在不断发展。
- 性能敏感:一些嵌入式系统需要精确控制程序执行和计时。 C++ 的抽象和功能(例如动态内存分配)可能会引入不确定性行为,因此这可能并不适合所有应用程序。
使用C++开发的优秀的开源项目
如今,也有非常多的开源项目使用C++作为主要的开发语言。
- Arduno:是一个开源嵌入式软硬件平台,用来供用户制作可交互式的嵌入式项目,使用C++提供接口,让开发者更加便捷的使用不同类型MCU和传感器,使用统一的接口。
- Marlin:著名的3D打印开源固件,80%的代码都由C++实现,方便玩家DIY自己的3D打印机,甚至在代码中增加新功能。
- Reprap:也是一个著名的3D打印开源固件,功能比Marlin更加丰富,使用更加简单,代码中应用了非常多的C++的高级特性,需要一定C++基础才能看懂,但是它非常值得去学习,是个提高C++技能的好材料。
- TouchGFX:STM32官方的GUI开发平台,能让用户快速搭建出酷炫的UI,在单片机中运行效率也非常高。
总结
那么,C++ 是嵌入式开发的未来吗?在我看来,很明显,C++ 具有很多优势,特别是在代码独立性、模块化、可维护性和抽象方面。随着嵌入式系统的复杂性不断增加,这些优势变得越来越有价值。然而,C 和 C++ 之间的选择最终应该由项目需求决定。在资源受限的环境中或当严格的效率、实时性至关重要时,C可能仍然是首选,但C++也许能够胜任部分开发。另一方面,对于资源更加丰富、注重代码可维护性和可扩展性的项目来说,C++可以提供广阔的前景。在实践中证明,使用C++去完成一些特定的场景开发,将是一个不错的选择。
原文作者:Rust嵌入式;如有侵权,请联系管理员删除。