嵌入式中,什么情况用C?什么情况用C++?

253d6f2cdadd69314d3b077551b4fc16.png

C 与 C++ 的选择其实是“面向过程”与“面向对象”的选择。Sugar 认为这两种编程思想的选择取决于软件的特性,软件特性包括几个方面,都是 Sugar 总结出来的经验。本文力求把“软件特性”与“语言选择”结合图示理清晰。

嵌入式最简 IO 模型

“最简 IO 模型”自然是输入直接输出,比如房间里的照明灯给电就亮,这是不需要嵌入式的。按现在的潮流说法,加嵌入式进去那得叫智能硬件。因此,嵌入式的最简 IO 模型就是在输入和输出之间加入“嵌入式运算平台”,如“图1”。

6bc601db1b50f1cbbe3a5bdbf8ff9b10.png

图1. 嵌入式最简 IO 模型

在嵌入式最简 IO 模型下的产品功能大多都相对简单,有明确的输入和明确的输出,也就是说嵌入式软件的运算过程是明确的。这是自然“面向过程”的情况,这种情况下选 C 还是 C++ 没有多大差别。简单的控制过程就算选 C++ 也是写面向过程的软件。

举个例子来说就是现在小孩子都玩儿腻了的“巡线小车”,上电就跟着线跑。这个用 Arduino C 来实现就可以了,其实 Arduino 是 C++ 库,在这种简单功能上体现不出 C 和 C++ 有多大区别。

嵌入式受控 IO 模型

所谓“嵌入式受控 IO 模型”可以认为是一个遥控智能车一样的设备。在受控模型下,嵌入式硬件平台多了一路“指令”输入。这时候不妨再加个显示器,用于显示当前处于“受控模式”还是“自动模式”,如“图2”。

f13531fd0f6cbdf30068941b05f427b5.png

图2. 嵌入式受控 IO 模型

这里引入的“模式”是一个软件概念,软件是有无限可能的,能加一个模式进去就有可能再加很多个模式。模式在软件流程上是一个环节,但这个环节如上所述有多种不同的可能,这种情况最适合用 C++ 的面向对象思想来写程序。

即:软件上“单点多样”的情况下用 C++ 使软件模块化,用父、子类来实现,代码的可读性和可维护性都会远强于用 C 来写。有关“模式”的详细展开请看《从 ArduPilot 学习模式管理机制并移植和改进》

嵌入式终级 IO 模型

随着人工智能的逐步发展,越来越多的算法需要强劲的 CPU 甚至 GPU,这都不是嵌入式平台能做的。嵌入式平台长于实时控制而非快速大量运算,因此需要与机载 PC 配合工作。这样种情况下的模型如“图3”。

0f546f3f9501a7c592fb54daef11fcd4.png

图3. 嵌入式终级 IO 模型

这样的模型毫无疑问用 C++ 会得到可维护性更好的嵌入式软件。如上所述 C++ 用在“单点多样”的环节,也就是说在考虑 C++ 代码之前要先确认有“哪些点”以及每个点有“哪些样”。

嵌入式软件的语言选择

下面基于“嵌入式终极 IO 模型”展开说嵌入式软件的语言选择。在嵌软部分从前往后展开,首先是传感器输入数据。

传感器输入部分的语言选择

92d03cdddfded1743b7e5fa6246e2f93.png

图4. 传感器输入部分语言选择

软件特性语言
软件运行平台的相关硬件不经常改变C
软件运行平台的相关硬件经常改变C++

上表根据软件的运行平台差异直接给出了选择建议,平台差异也决定了软件特性的不同。

对于医疗、工业、运输/铁路、航空航天设备、汽车、核应用、家电系列产品,一般生产出来之后嵌入式硬件将不再改变,这类产品开发就适合选择 C 语言。在这些产品上 C 语言占用资源相对少、较率相对高。因为硬件固定所以软件源文件数量也是明确的,源码文件管理的负担也不重。另外传感器驱动开发这件事本身就是“面向过程”的,开发经验是决定开发效率的关键,“面向对象”在开发效率上的优势于这种情况下很难体现出来。

对于玩具、教具类产品或者是开源软件,灵活适配同类硬件是基本要求。这类嵌软的特点是同一种硬件需要适配不同厂家、不同型号的“同功能设备”,这就符合“面向对象”的思想。就以 GPS 来说,不论哪个厂家都要输出经纬度、速度、时间戳这些数据,我们可以把这些共性数据做成 C++ 的基类,用子类解决厂家差异。这部分 Sugar 在《一文读懂 ArduPilot 的前后台架构》中有详述。

嵌入式运算部分的语言选择

cb262a1e4f72ce1fcafdc2736597d5e5.png

图5. 嵌入式运算部分语言选择

这一部分的软件特性是:算法与硬件平台无关。算法本身是数学和逻辑,平台提供运算能力,因此运算部分理应在任何运算能力达到要求的平台上都能够运行。另外算法本身具有多样性,一个目标往往不只一种算法可以达到。

“单点多样”、“跨平台”这两点对软件代码的文件管理都有比较高的要求,这些要求用 C++ 就非常容易满足。

协议数据部分的语言选择

a685e4cca536e0d0c168156222f47d0c.png

图6. 协议数据部分语言选择

协议本质是对传输数据的打包和解包,这是一个面向过程的事,所以用 C 语言来实现协议代码最合适。

从数据传输方面考虑,在把数据送给协议代码打包前,最好将数据分类,以明确数据是“给谁”和“干什么”的,这些事 Sugar 统称为“协议数据管理”。从嵌入式软件整体来看“协议数据管理”就是整体中的“一个点”,而嵌入式平台的通信对象可能不唯一,比如“图6”中就有给显示器的和给机载 PC 的,也就是说管理起来是“多样的”。这从软件整体来看也是一个典型的“单点多样”,所以协议数据管理这部分选 C++ 面向对象写软件更有优势。

f460feb3d0ab4b10af7f52af66a22f9d.png

1.芯片都去哪了?美国SIA年度报告揭秘~

2.树莓派偷偷换上新SoC!

3.MCU从入门到躺平

4.车规级MCU国产替代下的选择题:车厂策略激进,直供能成为未来主流?

5.编程语言成功的几大要素

6.碳中和,不确定世界里的确定性

4e03a1c2a25e4602e1d477d457bfbfba.gif

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值