嵌入式中,什么情况用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
的基类,用子类解决厂家差异。这部分 Sugar 在《一文读懂 ArduPilot 的前后台架构》中有详述。嵌入式运算部分的语言选择
图5. 嵌入式运算部分语言选择这一部分的软件特性是:算法与硬件平台无关。算法本身是数学和逻辑,平台提供运算能力,因此运算部分理应在任何运算能力达到要求的平台上都能够运行。另外算法本身具有多样性,一个目标往往不只一种算法可以达到。“单点多样”、“跨平台”这两点对软件代码的文件管理都有比较高的要求,这些要求用
C
就非常容易满足。协议数据部分的语言选择
图6. 协议数据部分语言选择协议本质是对传输数据的打包和解包,这是一个面向过程的事,所以用
C
语言来实现协议代码最合适。从数据传输方面考虑,在把数据送给协议代码打包前,最好将数据分类,以明确数据是“给谁”和“干什么”的,这些事 Sugar 统称为“协议数据管理”。从嵌入式软件整体来看“协议数据管理”就是整体中的“一个点”,而嵌入式平台的通信对象可能不唯一,比如“图6”中就有给显示器的和给机载 PC 的,也就是说管理起来是“多样的”。这从软件整体来看也是一个典型的“单点多样”,所以协议数据管理这部分选 C
面向对象写软件更有优势。往期推荐:嵌入式开发小记,实用小知识分享
分享几个Ubuntu必装的软件
嵌入式行业需要什么样的技术人才?
常用的开源协议有哪些?
点击阅读原文,查看更多分享。