用C或C++编写bootloader?

waf*_*man 17 c c++ embedded bootloader

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

DrA*_*rAl 26

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

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

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

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

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

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

  • 好答案.我可能会根据目标做出选择.如果它比8位μC更大,我会尝试坚持使用C++.我已经学会了讨厌C++,但我认为如果你知道自己在做什么,它可以给你带来与使用C相同的好处.一如既往,一个非常好的建议:知道你在做什么和为什么. (2认同)
  • 你是什​​么意思“即使它只是g ++”?这是一个非常好的 C++ 编译器。在这种情况下是否有一些特定的原因可以避免它?无论如何,很好的答案,我同意。C++ 的许多特性(如引用和模板)可以简单地用于编写更安全、更健壮的代码,而不会在内存或速度方面产生运行时成本。当然,C++ 也有许多特性,在嵌入式环境中您应该非常小心。但它们是可以避免的,就像你经常说的那样。 (2认同)
  • @jalf:对不起,我应该措辞更好。当我说“即使它只是 g++”时,我的意思是:“即使你不费心为你的嵌入式平台寻找一个(或找不到),只需选择一个像 g++ 这样的免费可用的 PC”。 (2认同)

Mat*_*ner 12

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


Kyl*_*ndo 11

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

一些顽固分子会不同意,但OO是使C++> C的原因,反之亦然.

  • "你可以用任何语言编写OO" - OOP不是"在结构上使用方法",而是关于**动态绑定**方法.如果你已经在C++中使用它,那么在你自己的普通C中实现vtable机制是不合理的. (6认同)
  • 我不同意这一点.OOP支持可能是偏好C++的最不相关的理由,特别是在嵌入式设置中.正如Al的回答所示,C++包含大量的改进,只能产生比C更好,更强大的代码,但不以任何方式特定于OOP. (6认同)
  • 此外,OO是在很多情况下使C++ <C的原因. (3认同)

Ger*_*ard 10

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

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


Kir*_*sky 7

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