用C或C ++编写bootloader?

时间:2009-10-27 07:00:16

标签: c++ c bootloader embedded

我正在为嵌入式系统编写一个程序,更具体地说是一个引导加载程序。我将使用C库与一些硬件组件进行交互,我可以选择用C或C ++编写它。我有什么理由选择一个而不是另一个吗?我不需要C ++的面向对象功能,但它确实有一个更强大的类型系统。它是否有其他语言功能可以使程序更健壮?我知道有些人会避免使用C ++,因为它可以(但不总是)生成大型固件映像。

10 个答案:

答案 0 :(得分:26)

这不是一个特别简单的问题。这取决于许多因素,包括:

  • 您希望如何布置代码。
  • 是否有可用于目标的C ++编译器(以及您可能希望使用引导加载程序的任何其他目标)。
  • 您的应用程序的代码大小有多重要(我们说的可能是额外的10%,而不是另一个答案建议的MB)。

就个人而言,我非常喜欢将类作为一种布局代码的方式。即使在编写C代码时,我也倾向于将所有内容保存在模块化文件中,文件范围静态函数“模拟”成员函数和(一些)文件范围静态变量来“模拟”成员变量。话虽如此,我现有的大多数嵌入式项目(所有这些都是相对较小的规模,最多包括128kB闪存,包括引导加载程序,但通常更少)都倾向于用C编写。现在我已经有了C ++编译器,我当然正在考虑转向C ++。

使用引用,重载和模板,C ++有相当大的好处,即使你没有像类那么远。当然,我不会使用许多更高级的功能,包括使用动态内存分配(新)。然后,如果可能的话,我也会避免嵌入式C中的动态内存分配(malloc等)。

如果您有一个C ++编译器(即使它只是g ++),那么只需要进行额外的类型检查就可以运行代码,这样就可以减少代码中的问题数量。 C ++编译器可以提供一些甚至静态分析工具都不会发现的东西。

有关人们拒绝使用C ++的许多无效原因的详细讨论,请参阅Dan Saks' article on Embedded.com

答案 1 :(得分:12)

对于引导加载程序,显而易见的选择是C,尤其是在嵌入式系统上。生成的代码需要接近金属,并且非常容易调试,可能通过放入汇编,这很快就变得很难在C ++中无需关注。此外,C工具链比C ++工具链更普遍,允许您的引导加载程序在更多平台上使用。最后,生成的二进制文件通常较小,并且在编写C风格时使用较少的内存。

答案 2 :(得分:11)

如果您不需要使用面向对象,请使用C.简单选择。它更简单,更容易,同时完成同样的任务。

有些顽固分子会不同意,但OO是使C ++成为主题的原因。 C,在很多情况下反之亦然。

答案 3 :(得分:10)

除非有特殊原因要使用C ++,否则我会使用C.对于Bootloader,您实际上并不需要OO。

使用最简单的工具完成工作。

答案 4 :(得分:7)

用C语言编写程序与用C ++编写程序不同。如果你知道如何只在C ++中做,那你选择的是C ++。对于编写引导加载程序,最好将代码最小化,因此您可能必须禁用标准C ++库。如果你知道如何使用C语言编写,那么你应该使用C语言 - 对于这类任务来说,这是更常见的选择。

答案 5 :(得分:4)

以前的大多数答案都假设您的引导加载程序很小而且很简单,通常就是这种情况;但是,如果它变得更复杂(即您需要能够从以太网端口,USB端口或串行端口加载......您需要在清除现有代码之前验证正在加载的代码,等)你可能想要考虑C ++。

我还发现引导加载程序和应用程序通常共享一些公共代码,因此您可能还需要考虑使用与应用程序相同的语言来促进代码共享。

答案 6 :(得分:3)

C语言比C ++更容易解析。这意味着有效C和有效C ++的程序将作为C程序更快地编译。可能不是一个主要问题,但这只是C ++可能过度杀伤的另一个原因。

答案 7 :(得分:1)

C μClibc一起使用。它将使您的代码更简单并减少其占用空间。可在以下位置找到:www.uclibc.org

答案 8 :(得分:1)

使用C ++并找到您需要的语言功能。只要您了解了正在使用的C ++抽象,您仍然可以完全控制输出对象代码。

如果避免使用虚拟功能,OO的使用仍然可以正常运行。避免需要大量复制的不可变对象类型以传递值,例如std :: string。但是,您仍然可以使用模板等功能,而不会对运行时性能产生任何实际影响。

答案 9 :(得分:0)

对于像引导加载程序这样的特定任务,我绝对不会使用C ++。我认为标准的c ++库至少有几MB,而不是你想要的引导加载程序。跟C一起去。