c++ - 如何克服C++对嵌入式系统缺乏工具支持的问题?

标签 c++ real-time

<分区>

问题与 Linux 内核无关。这也不是 C 与 C++ 的辩论。

我做了一项研究,在我看来,C++ 在嵌入式系统的异常处理和内存分配方面缺乏工具支持:

Why is the linux kernel not implemented in C++? 除了已接受的答案,另请参阅 Ben Collins' answer .

Linus Torvalds on C++ :

"[...] anybody who designs his kernel modules for C++ is [...]
(b) a C++ bigot that can't see what he is writing is really just C anyway"

" - the whole C++ exception handling thing is fundamentally broken. It's especially broken for kernels.
- any compiler or language that likes to hide things like memory allocations behind your back just isn't a good choice for a kernel."

JOINT STRIKE FIGHTER AIR VEHICLE C++ CODING STANDARDS :

"AV Rule 208 C++ exceptions shall not be used"


  1. 异常处理和内存分配是 C++ 显然缺乏工具支持的唯一点吗(在这种情况下)?

  2. 要解决异常处理问题,必须提供异常抛出后到捕获到的时间限制?

  3. 你能解释一下为什么内存分配是个问题吗?如何克服这个问题,必须做什么?

正如我所看到的,在这两种情况下,都必须在编译时提供一个上限,以在运行时发生并取决于某些重要的事情。


答案:

  1. 不,动态转换也是一个问题,但是 it has been solved .

  2. 基本上是 yes .必须通过分析所有抛出路径来限制处理异常所需的时间。

  3. 请参阅 Embedded systems programming 中幻灯片“如何在没有新事物的情况下生活”的解决方案.简而言之:预分配(全局对象、堆栈、池)。

最佳答案

好吧,有几件事。首先,您必须记住,STL 完全建立在 OS 例程、C 标准库和动态分配之上。当你写一个内核时,没有动态内存分配给你(你提供它)没有 C 标准库(你必须提供一个构建在之上你的内核),而且你正在提供系统调用。还有一个事实是,C 与汇编的互操作性非常好且容易,而 C++ 与汇编的交互非常困难,因为 ABI 不一定是常量,名称也不是。由于名称修改,您会遇到一个全新的复杂问题。

然后,您必须记住,在构建操作系统时,您需要了解并控制内核使用的内存的各个方面。在 C++ 中,有很多您无法控制的隐藏结构(vtables、RTTI、异常)会严重干扰您的工作。

换句话说,Linus 的意思是,有了 C,你可以很容易地理解正在生成的程序集,并且很简单,可以直接在机器上运行。尽管 C++ 可以,但您总是必须设置相当多的上下文,并且仍然需要做一些 C 来连接程序集和 C。另一个原因是在系统编程中,您需要确切地知道方法是如何被调用的。 C 有很好的文档化 C 调用约定,但在 C++ 中,您需要处理 this、名称修改等。

简而言之,这是因为 C++ 会在您不询问的情况下做事。

根据@Josh 的评论,C++ 在您背后做的另一件事是构造函数和析构函数。它们增加了进入和退出堆栈帧的开销,最重要的是,使程序集互操作更加困难,因为当您销毁 C++ 堆栈帧时,您必须调用其中每个对象的析构函数。这很快就会变得丑陋。

关于c++ - 如何克服C++对嵌入式系统缺乏工具支持的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12020404/

相关文章:

c++ - 在自己的构造中使用对象有什么问题吗?

c - Embox 编译和烧写

real-time - 如果简单地将其视为纯文本,操作转换是否适用于结构化文档(例如 HTML)?

c++ - 如何在将输出打印到cmd.exe后显示cmd提示符?

c++ - 有没有办法在使用 openGL 应用变换后跟踪点

c++ - 是否可以将函数声明放在未命名的命名空间中?

java - 在我的 GUI (java) 中显示 CMD 输出

java - 有没有办法将 OpenSCAD 编译器合并到 java 或任何其他编程语言中?

firebase - 更改 Firebase 实时数据库中的值时如何查看 flutter 应用程序的更改?

javascript - 调试 JavaScript : Live profiling?