嵌入式中,什么情况用C?什么情况用C++?
Posted 嵌入式大杂烩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式中,什么情况用C?什么情况用C++?相关的知识,希望对你有一定的参考价值。
C
与 C++
的选择其实是“面向过程”与“面向对象”的选择。Sugar 认为这两种编程思想的选择取决于软件的特性,软件特性包括几个方面,都是 Sugar 总结出来的经验。本文力求把“软件特性”与“语言选择”结合图示理清晰。
嵌入式最简 IO 模型
“最简 IO 模型”自然是输入直接输出,比如房间里的照明灯给电就亮,这是不需要嵌入式的。按现在的潮流说法,加嵌入式进去那得叫智能硬件。因此,嵌入式的最简 IO 模型就是在输入和输出之间加入“嵌入式运算平台”,如“图1”。
图1. 嵌入式最简 IO 模型
在嵌入式最简 IO 模型下的产品功能大多都相对简单,有明确的输入和明确的输出,也就是说嵌入式软件的运算过程是明确的。这是自然“面向过程”的情况,这种情况下选 C
还是 C++
没有多大差别。简单的控制过程就算选 C++
也是写面向过程的软件。
举个例子来说就是现在小孩子都玩儿腻了的“巡线小车”,上电就跟着线跑。这个用 Arduino C 来实现就可以了,其实 Arduino 是 C++
库,在这种简单功能上体现不出 C
和 C++
有多大区别。
嵌入式受控 IO 模型
所谓“嵌入式受控 IO 模型”可以认为是一个遥控智能车一样的设备。在受控模型下,嵌入式硬件平台多了一路“指令”输入。这时候不妨再加个显示器,用于显示当前处于“受控模式”还是“自动模式”,如“图2”。
图2. 嵌入式受控 IO 模型
这里引入的“模式”是一个软件概念,软件是有无限可能的,能加一个模式进去就有可能再加很多个模式。模式在软件流程上是一个环节,但这个环节如上所述有多种不同的可能,这种情况最适合用 C++
的面向对象思想来写程序。
即:软件上“单点多样”的情况下用 C++
使软件模块化,用父、子类来实现,代码的可读性和可维护性都会远强于用 C
来写。有关“模式”的详细展开请看《从 ArduPilot 学习模式管理机制并移植和改进》
嵌入式终级 IO 模型
随着人工智能的逐步发展,越来越多的算法需要强劲的 CPU 甚至 GPU,这都不是嵌入式平台能做的。嵌入式平台长于实时控制而非快速大量运算,因此需要与机载 PC 配合工作。这样种情况下的模型如“图3”。
图3. 嵌入式终级 IO 模型
这样的模型毫无疑问用 C++
会得到可维护性更好的嵌入式软件。如上所述 C++
用在“单点多样”的环节,也就是说在考虑 C++
代码之前要先确认有“哪些点”以及每个点有“哪些样”。
嵌入式软件的语言选择
下面基于“嵌入式终极 IO 模型”展开说嵌入式软件的语言选择。在嵌软部分从前往后展开,首先是传感器输入数据。
传感器输入部分的语言选择
图4. 传感器输入部分语言选择
软件特性 | 语言 |
---|---|
软件运行平台的相关硬件不经常改变 | C |
软件运行平台的相关硬件经常改变 | C++ |
上表根据软件的运行平台差异直接给出了选择建议,平台差异也决定了软件特性的不同。
对于医疗、工业、运输/铁路、航空航天设备、汽车、核应用、家电系列产品,一般生产出来之后嵌入式硬件将不再改变,这类产品开发就适合选择 C 语言。在这些产品上 C 语言占用资源相对少、较率相对高。因为硬件固定所以软件源文件数量也是明确的,源码文件管理的负担也不重。另外传感器驱动开发这件事本身就是“面向过程”的,开发经验是决定开发效率的关键,“面向对象”在开发效率上的优势于这种情况下很难体现出来。
对于玩具、教具类产品或者是开源软件,灵活适配同类硬件是基本要求。这类嵌软的特点是同一种硬件需要适配不同厂家、不同型号的“同功能设备”,这就符合“面向对象”的思想。就以 GPS 来说,不论哪个厂家都要输出经纬度、速度、时间戳这些数据,我们可以把这些共性数据做成 C++
的基类,用子类解决厂家差异。这部分 Sugar 在《一文读懂 ArduPilot 的前后台架构》
嵌入式运算部分的语言选择
图5. 嵌入式运算部分语言选择
这一部分的软件特性是:算法与硬件平台无关。算法本身是数学和逻辑,平台提供运算能力,因此运算部分理应在任何运算能力达到要求的平台上都能够运行。另外算法本身具有多样性,一个目标往往不只一种算法可以达到。
“单点多样”、“跨平台”这两点对软件代码的文件管理都有比较高的要求,这些要求用 C++
就非常容易满足。
协议数据部分的语言选择
图6. 协议数据部分语言选择
协议本质是对传输数据的打包和解包,这是一个面向过程的事,所以用 C
语言来实现协议代码最合适。
从数据传输方面考虑,在把数据送给协议代码打包前,最好将数据分类,以明确数据是“给谁”和“干什么”的,这些事 Sugar 统称为“协议数据管理”。从嵌入式软件整体来看“协议数据管理”就是整体中的“一个点”,而嵌入式平台的通信对象可能不唯一,比如“图6”中就有给显示器的和给机载 PC 的,也就是说管理起来是“多样的”。这从软件整体来看也是一个典型的“单点多样”,所以协议数据管理这部分选 C++
面向对象写软件更有优势。
往期推荐:
在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总。
点击阅读原文,查看更多分享。
以上是关于嵌入式中,什么情况用C?什么情况用C++?的主要内容,如果未能解决你的问题,请参考以下文章