在嵌入式环境中使用C++

7

今天我和一位同事进行了一次非常有趣的对话,其中一个主题让我今晚思考并搜索了一下。在嵌入式环境中使用C++(而不是C)。看看周围,似乎有一些正反双方关于C++提供的功能,但其他人Meyers明确支持它。因此,我想知道谁能够为这个话题提供一些见解,以及社区的普遍共识是什么。


我应该补充说明,这次讨论部分基于我们经理不愿在大多数库中采用C++。我们从事“嵌入式”工作,只是它大部分时间都存在机器人上。99%的时间,我们不使用RTOS或任何具有极限内存的系统。 - jdt141
请参见https://dev59.com/c3RB5IYBdhLWcg3wWGEH - Suma
相关问题:https://dev59.com/wXRA5IYBdhLWcg3w0xfk - Steve Melnikoff
11个回答

6
嵌入式开发人员对C++的恐惧在很大程度上已经成为过去,当时C++编译器不如C编译器(优化和代码质量方面)。这尤其适用于具有32位体系结构的现代平台。但是,C仍然是更加受限环境的首选(8位或4位目标的汇编语言也是如此)。因此,它真正取决于目标平台提供的资源以及您实际需要多少这些资源,即如果您知道几乎没有关于内存或CPU限制的问题,那么您是否能够承担使用C++(甚至Java)进行嵌入式开发的“奢侈品”。现在,许多现代嵌入式平台(例如游戏机、手机、PDA等)已经成为非常有能力的目标,具有RISC体系结构、数MB的RAM和3D硬件加速。仅出于无知的性能考虑而使用C甚至汇编语言来编写此类平台的程序将是一个糟糕的决定,另一方面,在C++中编程16位PIC也可能是一个有争议的决定。因此,这实际上是一个询问自己需要多少功率以及可以牺牲多少来提高开发体验(高级语言、更快的开发速度、较少繁琐/冗余任务)的问题。

6

在嵌入式平台上使用C++是完全可以的,只要你把它当作更好的C来使用。我喜欢这门语言稍微更加结构化的特点。你仍然可以用C做所有想做的事情。只需记得使用像Newlib或uClibc这样的嵌入式C库。

我特别喜欢我们可以使用C ++构建的抽象层,尤其是对于I/O设备。因此,我们可以为UART和GPIO等设备创建一个类。这比拥有一堆函数(在我看来)更加简洁。


5

取决于您的嵌入式系统的特定性质和您使用的C++功能。 语言本身并不一定比C生成更笨重的代码。

例如,如果内存是您最紧迫的限制,您可以只使用直接成员函数、禁用RTTI并且没有任何虚拟函数或模板来使用C++,就像“带类的C”一样。因为您没有类型信息、vtable或多余的函数来混杂事情,这将与等效的C代码几乎占用相同的空间。

当内存非常紧张时,我发现要避免的最大问题是模板,因为每个模板函数都会为其专门化的每个类型复制一个副本,这可能会迅速膨胀代码段。

在控制台视频游戏行业(这是嵌入式世界的强悍一端)中,C++是王者。我们的限制是内存上的硬限制(在当前世代上为512MB)和实时性能。通常使用虚拟函数和模板,但不使用异常,因为它们会使堆栈膨胀并且成本过高。实际上,一个主要制造商的编译器甚至根本不支持异常。


2
在我以前的公司,由于安全(SIL-2)和内存原因,所有嵌入式代码都是用C语言的一小部分编写的。在这种情况下引入像C ++这样更丰富的语言可能会带来更多的问题而不是好处。
尽管我非常喜欢C ++这门语言,但我认为在我们特定的场景中,选择C更好。
我敢打赌,在某些情况下,对于嵌入式应用程序使用C++也完全没问题,但这确实取决于应用程序 - 如果您的程序正在控制核电站或管理手机通讯录,则有所不同。

1

我不知道“普遍共识”,只知道我工作的公司(该公司为手机、汽车导航系统、DPF等开发了很多项目)。

在嵌入式平台上使用C++相对于C的主要缺点是它不太可移植 - 有许多编译器不遵循标准,这可能会在您需要使用多个编译器构建代码或实现中直接出现错误时引起问题。然后还有一些环境,C++代码根本无法运行 - BREW的可重定位代码问题和其“本地OOP”与“常规”C++类和继承不兼容。

最终,如果您只针对一个平台,我会建议您使用您认为更好(更快,更少的错误,更好的设计)的开发方式 - 在大多数情况下,这些问题可以很容易地解决。


1

这取决于你正在进行什么类型的嵌入式开发。我曾在各种平台上使用C++、C和汇编语言进行嵌入式开发,甚至可以使用Java编写智能手机应用程序。

例如,在运行Windows CE 5的类似智能手机的设备上,几乎所有代码都是C++,包括操作系统。只有一小部分是用C或汇编语言编写的。

另一方面,我曾为MSP430微控制器编写过C代码,如果编译器更可靠且符合标准,我可能会使用C++。

此外,我记得我的一位大学讲师谈到了使用Forth或其他语言编写嵌入式代码的情况。因此,任何语言都可以胜任。


1

现在,一切都取决于平台对C++运行支持的情况。您可能会发现使用GCC将C++代码编译成几乎适用于任何嵌入式平台的方法,但是如果无法找到适合该平台的C++运行时,则您的努力将徒劳无功,除非您自己编写C++运行时。


0

C++适用于没有操作系统的微控制器和设备。您只需要了解系统的架构,并在进行关键任务编程时特别注意时间和空间限制。

使用C++可以进行抽象,但这通常会导致代码占用更多的内存空间。当为资源受限的机器(如8位MCU)编程时,不希望出现这种情况。

一般而言,应避免以下情况:

  • 动态内存分配,因为它代表着时间上的不确定性
  • 重载
  • RTTI,因为内存成本很大
  • 异常,因为会降低执行速度

对虚函数要谨慎,因为每个类都有一个vtable的资源成本,每个对象都有一个指向vtable的指针。此外,应该使用const来替换#define。

当您转向具有10到100 MB RAM的16位和32位MCU时,可以使用上述较重的功能。

总的来说,C++在嵌入式系统中非常有用。其主要优点是当你想要抽象微控制器的某些方面时,面向对象编程(OOP)非常有用,例如UART或状态机。但是,根据你所编程的目标,你可能希望始终避免某些功能,有时只使用部分功能。

0

我目前正在处理一个嵌入式Linux应用程序中的异常问题。我们试图移植为另一个平台编写的软件,该平台似乎很好地支持异常,但新的编译器工具(gcc的一个移植版本)在创建eh_frame时报告错误。我反对在这个工具中使用异常,但开发人员向我保证现代编译器会很好地支持它。

我的观点是C++有一些优势,但我会避免使用异常和标准模板库。我们使用虚函数没有遇到问题。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接