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

用C或C++编写Bootloader?

  •  17
  • waffleman  · 技术社区  · 15 年前

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

    10 回复  |  直到 11 年前
        1
  •  26
  •   DrAl    15 年前

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

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

    就我个人而言,我真的很喜欢将类作为一种布局代码的方式。即使在编写C代码时,我也倾向于将所有内容保存在模块化文件中,其中包含文件范围静态函数“模拟”成员函数和(少数)文件范围静态变量“模拟”成员变量。话虽如此,我的大多数现有的嵌入式项目(所有这些都是相对较小的规模,最多包括128KB Flash,包括Bootloader,但通常较少)倾向于用C编写。现在,我有一个C++编译器,当然,我当然考虑移动到C++。

    对于C++来说,简单地使用引用、重载和模板有很大的好处,即使你没有达到类。当然,我会停止使用许多更高级的功能,包括使用动态内存分配(new)。同样,如果可能的话,我也会避免在嵌入式C中进行动态内存分配(malloc等)。

    如果你有一个C++编译器(即使它仅仅是G++),那么只需运行额外的类型检查就可以通过代码运行你的代码,这样你就可以减少代码中的问题数。C++编译器可以拾取一些静态分析工具无法发现的东西。

    为了讨论许多无效的原因,人们拒绝C++,参见 Dan Saks' article on Embedded.com .

        2
  •  12
  •   Matt Joiner    15 年前

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

        3
  •  11
  •   Kyle Rosendo    15 年前

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

    有些顽固派会不同意,但是OO是C++和GT;C,在很多情况下反之亦然。

        4
  •  10
  •   Gerhard    15 年前

    我会使用C,除非有一个特殊的理由使用C++。对于引导加载程序,您实际上不需要OO。

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

        5
  •  7
  •   Kirill V. Lyadvinsky    15 年前

    在C中编写程序与在C++中编写程序不一样。如果你知道如何只用C++来做,那么你的选择就是C++。为了编写Bootloader,最好将代码最小化,因此您可能不得不禁用标准C++库。如果你知道如何用C写,那么你应该使用C_,这是此类任务更常见的选择。

        6
  •  4
  •   semaj    15 年前

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

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

        7
  •  3
  •   Artelius    15 年前

    C语言比C++更容易解析。这意味着一个既有效C又有效C++的程序将更快地编译成C程序。可能不是一个主要的问题,但这只是另一个原因,为什么C++可能是多余的。

        8
  •  1
  •   spoulson    15 年前

    与C++和Objo一起选择你需要的语言特征。只要您理解正在使用的C++抽象,您仍然可以完全控制输出对象代码。

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

        9
  •  1
  •   eyalm    15 年前

    使用 C 具有 克里夫 . 它将使代码更简单,并减少其占用空间。可在以下位置找到: www.uclibc.org .

        10
  •  0
  •   Puppe    15 年前

    对于Bootloader这样的特定任务,我绝对不会使用C++。我认为标准的C++库至少是一对MB,而不是Bootloader中想要的东西。与C同行。