3

我是一名固件开发人员,我通常用 C 或汇编开发固件。但是,我在我们的嵌入式库中遇到了一个完全用 C++ 实现的项目。现在我知道面向对象的语言可以在硬件级别上使用,但我想知道为什么它们在开发嵌入式系统时不那么流行。

4

5 回答 5

6

真正的原因:因为概念的复杂性。C 和汇编提供了一个简单的思维模型来跟踪系统中发生的事情。面向对象的程序需要一个更复杂的模型,这使得对正在发生的事情进行推理变得更加困难。

嵌入式系统往往是要求对系统中发生的事情进行非常严格控制的环境,而不是更开放的服务器和 PC 环境。这需要简单和透明的编程结构。C 和汇编都提供了对最低硬件级别系统中实际情况的高度可见性。

一般的面向对象语言,特别是 C++,在代码执行时抽象出系统中发生的许多细节,从而使得推理系统的内部工作变得更加困难。

这是一个例子来解释我的意思。考虑以下代码片段:

i++;

在 C 程序中看到这一点可以让我们大致准确地了解它的作用,以及使用多少 CPU 周期、涉及多少寄存器等等。

现在,同一行在 C++ 程序中会做什么?这要看情况。取决于 i 是什么类型以及 ++ 运算符是如何重载的。明白了吗?

这些都不是说 C++ 或面向对象是不好的。它不是。如果人们对系统中真正发生的事情的微小细节感兴趣,它确实需要一个更复杂的心理模型,因为许多嵌入式开发人员认为他们需要。

于 2013-10-28T10:21:25.300 回答
3

从技术角度来看,嵌入式系统资源有限。面向对象的语言倾向于创建比纯过程语言更大的二进制文件,因此许多人会选择尽可能轻的东西。例如,我在一家智能卡公司工作,我的团队负责处理成本极低的卡,RAM 的范围仅为 1.5 - 1.75 KB,EEPROM 的范围为 96 - 136 KB。对于这种嵌入式环境,大多数面向对象的语言(尤其是 Java 等重度语言)都不适合。我们甚至不使用任何标准 C 库,一切都是从头开始编写的。C++ 可能适合,通过适当的编码技术和使用不生成 rtti、最小化 vmt、仅使用基于堆栈的对象等的编译器选项,但这只是我的猜测。

于 2013-10-28T08:45:37.070 回答
2

“OO 语言”太宽泛了。有许多面向对象的语言具有完全不同的特征。“它可以用 C++ 完成”并不意味着“它可以用任何 OO 语言完成”。例如,为功能较弱的 AVR MCU 编写 Python 程序祝你好运。该设备有 2kB 的 RAM 和 32kB 的闪存,Python 解释器本身甚至不适合它们。


C++ 是一种同时具有高级低级部分的语言它是面向对象的,但最后,您漂亮的 OO 代码将被编译为原始机器代码,就像您直接用 C 或汇编编写一样。其他一些被认为是“高级”(或仅高级)的面向对象语言不能做同样的事情。真的,这都是关于特定语言的实现。

于 2013-10-28T08:41:31.827 回答
2

所有其他人所说的一个补充:

我们不会编写太多 C++ 嵌入式代码,因为客户需要它。在我的领域代码可能需要获得认证,认证指南只存在于 C,而不是 C++。

因此,即使 C++ 会带来更好的产品,该项目也必须用 C 来实现。

于 2013-10-28T10:48:28.477 回答
0

因为很多开发者“认为”C++因为代码大小和性能的原因根本不适合嵌入式环境!在大多数情况下这不是真的!

我强烈建议阅读那些讨论嵌入式 C++ 使用和讨论 C++ 神话的幻灯片,例如:

“膨胀”神话!

“表现不佳”的神话!

许多嵌入式目标的编译器供应商提供 C++ 编译器,如 Keil、IAR、CodeRed,处理器制造商也为其工具链提供 C++ 编译器,例如德州仪器、飞思卡尔、...

通常,开发人员在开始一个新项目时需要考虑 C++,并根据项目需求以及 OOP/C++ 可以提​​供什么来按时按时完成工作来决定是否使用它!

于 2013-10-28T10:06:06.667 回答