代码之家  ›  专栏  ›  技术社区  ›  jdt141

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

  •  6
  • jdt141  · 技术社区  · 16 年前

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

    11 回复  |  直到 16 年前
        1
  •  6
  •   sybreon    16 年前

    嵌入式平台的C++是非常好的——只要你把它当作一个更好的C,我喜欢语言稍微结构化的事实。你仍然可以用C做所有你想做的事情。只要记住坚持使用嵌入式C库,比如Newlib或uClibc。

    我特别喜欢使用C++来构建的抽象,尤其是对于I/O设备。所以,我们可以有一个用于UART的类和一个用于GPIO的类。它比拥有一堆函数(IMHO)更干净。

        2
  •  6
  •   none    16 年前

    在C++开发人员中,C++编译器没有C编译器(优化和代码质量明智)那么大,所以对C++的恐惧在很大程度上已经成为过去。

    这尤其适用于具有32位体系结构的现代平台。 但是,对于更为受限的环境(对于8位或4位目标而言,汇编程序也是如此),C无疑仍是首选。

    所以,这实际上归结为你的目标平台提供的资源,以及你可能需要的资源,即如果你能负担得起在C++中做嵌入式开发的“奢侈”(甚至是java),因为你知道你几乎不会有任何关于内存或CPU限制的问题。

    如今,许多现代嵌入式平台(比如游戏机、手机、PDA等)已经真正成为功能强大的目标,具有RISC体系结构、数MB的RAM和3D硬件加速。

    因此,真正的问题是问问自己,为了改善开发体验(高级语言、更快的开发、更少的繁琐/冗余任务),您实际需要多少功能,以及您可以牺牲多少功能。

        3
  •  5
  •   Crashworks    16 年前

    这取决于嵌入式系统的特定性质和C++使用哪些特性。语言本身并不一定生成比C更大的代码。

    例如,如果内存是最严格的约束,那么你可以只使用C++类似“C类”,也就是说,只使用直接成员函数,禁用RTTI,而不具有任何虚拟函数或模板。这将与等效的C代码放在几乎相同的空间中,因为您没有类型信息、vtables或冗余函数来把事情弄得乱七八糟。

    我发现,在内存非常紧张的情况下,模板是最需要避免的事情,因为对于它所专用的每种类型,每个模板函数都有一个副本,这会迅速膨胀代码段。

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

        4
  •  2
  •   AndersK    16 年前

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

    我敢打赌,在某些情况下,C++对于嵌入式应用程序来说是很好的,但它确实取决于应用程序——如果你的程序控制着核电站或者管理手机上的地址簿,那么就有区别了。

        5
  •  1
  •   Tal Pressman    16 年前

    我不知道“普遍共识”,只知道我工作的那家公司(它在手机、汽车导航系统、DPF等方面做了大量开发)。

    与C++相比,我在嵌入式平台上使用C++遇到的主要缺点是它不太容易移植——如果编译器需要在1以上的编译程序中编译代码或者在执行过程中完全有bug,编译器就有很多不遵守标准的问题。还有一些环境,C++代码根本不会运行REBLE的可重新定位代码的问题,它的“原生OOP”不能用“常规”C++类和继承来玩得很好。

    不过,最后,如果您只针对一个平台,我会说,使用您认为“更好”(更快、更少的bug、更好的设计)的任何东西进行开发——在大多数情况下,这些问题可以很容易地解决。

        6
  •  1
  •   Dominik Grabiec    16 年前

    取决于您正在进行的嵌入式开发类型。我已经在各种平台上使用C++、C和汇编进行了嵌入式开发,甚至可以使用java编写智能手机上的应用程序。

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

    另一方面,我编写了一个MSP430微控制器的代码,它在C中,如果编译器更可靠和标准兼容,我可能会在C++中完成。

        7
  •  1
  •   Robert Gould    16 年前

    现在,它将全部归结为平台的C++运行时支持。你可能找到一种方法来编译C++代码,几乎可以用GCC来编译任何嵌入式平台,但是如果你找不到适合C++平台的运行时,你的努力将是徒劳的,除非你自己编写C++运行时。

        8
  •  0
  •   robert.berger    16 年前

    我倾向于同意莱纳斯的几点是他对C++的看法。 http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918

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

        9
  •  0
  •   Chris Arguin    16 年前

    长期以来,使用C++的一个大问题就是VxWorks对它的支持,它确实被吸引了。这一点在VxWorks 6上得到了改善(是的,已经有一段时间了……良好的ole供应商锁定和缺乏公司愿景使我们一直停留在VxWorks 5.5上)。

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

        10
  •  0
  •   atlpeg    16 年前

    我的观点是C++有一些优点,但是我会远离例外和标准模板库。我们在使用虚拟函数时没有遇到问题。

        11
  •  0
  •   dspfnder    10 年前

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

    使用C++,你可以做抽象,这通常会导致代码中的足迹增加。在为资源有限的机器(如8位MCU)编程时,不希望出现这种情况。

    • 动态内存分配,因为它表示定时的不确定性
    • 超载
    • RTTI,因为内存开销很大

    对虚拟函数要小心,因为它们的资源开销是每个类一个vtable,每个对象一个指向vtable的指针。此外,使用const代替#define。

    当您移动到16位和32位MCU,使用10s或100s MB RAM时,可能会使用上面提到的更重的功能。

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