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

时间:2009-05-19 01:34:14

标签: c++ embedded

今天我和一位同事进行了一次非常有趣的对话,其中一个主题让我在今晚思考和谷歌搜索。在嵌入式环境中使用C ++(而不是C)。环顾四周,似乎有一些好的trades支持和反对C ++提供的功能,但其他Meyers显然支持它。所以,我想知道谁能够阐明这个话题,以及社区的普遍共识是什么。

11 个答案:

答案 0 :(得分:6)

当C ++编译器不如C编译器(优化和代码质量明智)时,嵌入式开发人员对C ++的恐惧在很大程度上已成为过去。

这尤其适用于具有32位架构的现代平台。 但是,C当然仍然是更受限制的环境的首选(如8位或4位目标的汇编程序)。

因此,它实际上归结为您的目标平台提供的资源,以及您可能实际需要的这些资源中的多少,即您是否可以承担使用C ++(甚至Java)进行嵌入式开发的“奢侈”那件事,因为你知道你几乎不会有任何关于内存或CPU限制的问题。

如今,许多现代嵌入式平台(比如游戏机,移动电话,PDA等)已经成为非常强大的目标,包括RISC架构,几MB内存和3D硬件加速。

使用C或甚至汇编程序对这些平台进行编程是不好的决定,另外一方面用C ++编写16位PIC也可能是一个有争议的决定。

因此,为了改善开发体验(高水平的语言,更快的开发,更少的繁琐),这真的是要问自己你有多少力量,你真正需要以及你有多少可以牺牲。冗余任务)。

答案 1 :(得分:6)

嵌入式平台的C ++非常好 - 只要你把它当成一个更好的C.我喜欢这种语言稍微有点结构化的事实。你仍然可以做你想用C做的所有事情。只记得坚持使用像Newlib或uClibc这样的嵌入式C库。

我特别喜欢使用C ++构建的抽象,特别是对于I / O设备。因此,我们可以为UART创建一个类,为GPIO创建一个类,以及什么不是。它比拥有一堆功能更清晰(恕我直言)。

答案 2 :(得分:5)

这取决于嵌入式系统的特定性质以及您使用的C ++的哪些功能。语言本身不一定会产生比C更笨重的代码。

例如,如果内存是你最严格的约束,你可以使用像“C with classes”这样的C ++ - 也就是说,只使用直接成员函数,禁用RTTI,没有任何虚函数或模板。这将与等效的C代码几乎相同,因为你没有类型信息,vtable或冗余函数来混乱。

我发现当内存非常紧张时,模板是最大的避免,因为每个模板函数都有一个副本,它可以快速膨胀代码段。

在控制台视频游戏行业(这是嵌入式世界的一个强大的结尾)C ++是王道。我们的限制是对内存(当前一代512mb)和实时性能的严格限制。通常使用虚函数和模板,但不是例外,因为它们使堆栈膨胀并且过于昂贵。实际上,一个主要制造商的编译器甚至根本不支持异常。

答案 3 :(得分:2)

在我之前的公司中,由于安全性(SIL-2)和内存原因,所有嵌入式代码都是用一小部分C代码编写的。通过在特定情况下引入更丰富的C ++语言可能会带来更多麻烦而不是好处。

完全尊重C ++(这是我真正喜欢的语言),但我认为C - 在我们的特定场景中 - 是更好的选择。

我敢打赌,在某些情况下,C ++可以很好地用于嵌入式应用程序,但它实际上取决于应用程序 - 如果您的程序控制核工厂或在手机上管理地址簿,则会有所不同。

答案 4 :(得分:1)

我不知道“普遍共识”,只知道我所工作的公司(对手机,汽车导航系统,DPF等进行了大量的开发)。

我在嵌入式平台上使用C ++而不是C时遇到的主要缺点是它不是那么便携 - 还有更多不符合标准的编译器会导致问题您需要使用多个编译器构建代码,或者直接在实现中存在错误。然后有些环境中C ++代码根本无法运行--BREW的可重定位代码问题及其“本机OOP”在“常规”C ++类和继承方面表现不佳。

最后,如果你只针对1个平台,我会说你的开发使用你认为“更好”(更快,更少的错误,更好的设计)的任何东西 - 在大多数情况下,问题可能是很容易解决。

答案 5 :(得分:1)

取决于您正在进行何种嵌入式开发。我在各种平台上都使用C ++,C和Assembly进行嵌入式开发,甚至可以使用Java在智能手机上编写应用程序。

例如,在运行Windows CE 5的智能手机上,几乎所有代码都是C ++,包括在操作系统中。只有小位用C或汇编写入。

另一方面,我已经编写了一个MSP430微控制器的代码,它在C语言中,如果编译器更可靠且符合标准,我可能会用C ++编写代码。

此外,我似乎还记得我的一位大学讲师正在谈论用Forth或其他东西编写嵌入式代码。所以任何语言都可以做到。

答案 6 :(得分:1)

现在有一天,它将归结为平台的C ++运行时支持。您可能会找到一种方法将C ++代码编译到几乎任何使用GCC的嵌入式平台,但如果您无法为该平台找到合适的C ++运行时,您的工作将是徒劳的,除非您编写自己的C ++运行时。 / p>

答案 7 :(得分:0)

我倾向于同意Linus的一件事是他对C ++的看法http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918

除此之外,如果您真的想要使用C ++,您可能需要查看描述嵌入式C ++的http://www.caravan.net/ec2plus/,或者更好地说您不应该在C ++中使用嵌入式系统。

答案 8 :(得分:0)

让我们长时间使用C ++的重要一点是VxWorks对它的支持,这真的很糟糕。在VxWorks 6上,这种情况已经变得更好了(是的,已经有一段时间了......好的'供应商锁定,缺乏公司愿景让我们陷入了VxWorks 5.5)。

所以对我们来说,这主要是环境问题。在那之后,C ++显然可以和C一样好......这是人们理解他们的工具做什么以及如何使用它的问题。 C ++可能会使编写极其低效的代码变得更容易,但这并不意味着我们必须对其进行改进。

答案 9 :(得分:0)

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

我的观点是C ++有一些优点,但我会远离异常和标准模板库。我们在使用虚拟功能方面没有遇到任何问题。

答案 10 :(得分:0)

C ++适用于没有操作系统的微控制器和设备。您只需了解系统的体系结构并了解时间和空间限制,尤其是在执行关键任务编程时。

使用C ++,您可以进行抽象,这通常会导致代码中的占用空间增加。在为资源有限的机器(如8位MCU)编程时,您不需要这样做。

一般来说,避免:

  • 动态内存分配,因为它代表了时间的不确定性
  • 重载
  • RTTI,因为内存成本很高
  • 由于执行速度降低而导致例外

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

当你升级到具有10或100 MB RAM的16和32位MCU时,可能会使用比上面提到的更重的功能。

总而言之,C ++对嵌入式系统非常有用。主要好处是,当您想要抽象微控制器的各个方面(例如UART或状态机)时,OOP非常有用。但是您可能希望在某些时候始终避免使用某些功能,而某些功能则取决于您编程的目标。