嵌入式软件编程中的C++

5

如果我使用C++语言编程为嵌入式Linux系统编写代码,会有什么显著的问题吗?

实际上,我打算将一些代码移植到ARM Linux上,使用arm-uclibc编译器。

谢谢。


请查看我的问题 https://dev59.com/hXE95IYBdhLWcg3wn_b2 和 https://dev59.com/h3E95IYBdhLWcg3wn_b2。 - Mawg says reinstate Monica
这与问题有什么关系? - Nathan Osman
5
这个问题不太清楚,请进一步解释。 - Nathan Osman
@George,这些是关于在嵌入式系统上使用C++的哪些功能子集的重要问题。请查看我对这个问题的回答。 - Michael Aaron Safyan
在编程中,你所做的事情或者你所使用的具体平台比仅仅不是在个人电脑上要重要得多。 - Potatoswatter
显示剩余2条评论
5个回答

7

当我看到你的问题,我想到的是传统的嵌入式编程,直到看到了Linux部分。C++可以用于嵌入式编程,但需要注意隐藏构造函数等问题。如果你正在运行Linux,我认为你不需要担心这些问题。


1
但这是 嵌入式 Linux,在 ARM 处理器上,而不是四核台式机。我认为嵌入式部分不能轻视。主要是他在问资源,我想。时间和内存。Linux 不是一个魔术词,意味着 "不需要担心那些东西"。 - Mawg says reinstate Monica
4
谢谢你的投票,但是相较于传统的裸机编程或资源消耗更少的操作系统,即使在ARM上,Linux所占开销更大。我在桌面和资源更有限的系统上使用Linux,还使用其他操作系统:Nucleous、eCos、vxWorks、裸机。你呢? - Richard Pennington

4
你是在询问普通的C++还是嵌入式C++?据我所知,嵌入式C++基本上已经死亡。你可以使用C++编程,但是根据你的要求,可能会有一些构造你需要避免使用。例如,如果空间有限,你可能想尽可能避免使用模板(或显式实例化模板)以将模板实例化的数量降到最低。你可能还想避免异常或RTTI以减少生成类型信息(以节省空间)并避免处理异常安全性(以将潜在的问题降至最低),以及异常传播的高成本(为了缩短最长执行路径,适用于实时系统)。虚函数应该没问题(它们不会引入太多开销),但如果你有非常严格的要求,你可能也需要限制使用那些。如果你确实使用异常,你还应该确保编译器支持它们(因为许多针对嵌入式系统的交叉编译器不支持)。

我认为这是一个我很担心的重要问题。 - deddihp
1
在嵌入式世界中,使用C++进行编程是完全可能的,但你必须小心谨慎。如果你从头开始编写程序,并且有一个好的嵌入式C++编译器(比C编译器要难找得多),那么你应该能够让你的程序正常工作。如果你试图将现有的C++程序移植到嵌入式系统中,那么你需要花费大量时间修改和重写代码的部分以适应系统的限制。 - bta

1

移植大型软件可能会很麻烦。我有使用gcc c++编程8位motorolla微控制器的经验,但在我的情况下,我是从零开始的,所以更容易些。我遇到了一些问题,比如使用析构函数会停止程序执行,不注意调用堆栈会导致其溢出到其他程序变量上...

因此,我对在嵌入式设备上编写c++代码的建议是不要一次性进行太多更改。当您逐步进行编程时,更容易发现由于错误的编译器或硬件而停止工作的原因。


1

我认为在嵌入式系统中使用Linux比使用C++更值得商榷。这是因为它是一个更重要的决定,而不仅仅是一个坏主意。

与嵌入式系统中的C++相关的大多数问题都与代码大小和性能有关;许多问题基于神话或远不如你想象的那么重要,但即使它们有一些合理性,在运行Linux的开销和Linux内核对硬实时和低延迟应用程序的不适用性方面,它们也相形见绌。

我经常在无操作系统和RTOS基础系统上使用C++来进行嵌入式系统开发。当不需要实时确定性行为,但设备、文件系统和网络支持提供了帮助(虽然其他方式也可以实现很多功能),并且您的系统拥有足够的资源时,使用Linux是有道理的;但如果没有强制要求,它将始终是我选择嵌入式系统操作系统的最后一项选择。

如果您选择在没有MMU的ARM上使用uClinux(例如ARM7或Cortex-M3),那么您失去了使用Linux的一个重要原因 - MMU受保护的进程/内核。


2
嵌入式系统可以变得非常强大,有很多Linux在运行特殊用途的设备上。 - David Thornley
1
@David:我并不认为我提到了与之相反的建议。主要观点是,在选择Linux作为嵌入式系统时,你应该有一个充分的理由,因为这个决定将比C++与C的选择产生更重大的影响。一个系统可以是“强大的”(无论这个术语有多模糊),而不使用桌面/服务器派生的操作系统-希望如此,否则在我20年的嵌入式系统开发中可能我一直忽略了某些东西! - Clifford
我想说的是,根据所做的工作和嵌入式内容,使用Linux可能是显而易见的最佳选择。我理解你的第一句话是在暗示Linux在嵌入式系统中存在疑问。 - David Thornley
@David:我只是想表达这个决定比语言选择更重要。也许“有问题”的说法有些贬低,但这可能反映了我在嵌入式系统和RTOS环境方面的个人偏见。它完全取决于应用程序,在我所从事的应用领域中,Linux很少是最好的选择,甚至不是可行的选择。 - Clifford

-1

有重大问题吗?

  • 这取决于你的编程方式。如果你注释充分,代码组织良好,那么不会有问题。
  • 这取决于你的开发环境的调试能力。如果它不易于使用,你将难以追踪错误。

如果我没记错,arm-uclibc 是一个 C 编译器?


良好组织的代码或许很重要,但是好的注释更是必不可少。例如STL和异常处理,在一些人看来可能会导致代码体积和运行时间的膨胀。不过关于调试方面的观点确实有道理。 - Mawg says reinstate Monica
好的注释不会导致运行时膨胀。或许我误解了你的评论? - Nathan Osman
我认为他的观点是,好的注释将说明为什么在习惯用法C++的位置使用了一些不寻常的C++代码。例如,为了防止新手程序员将状态码更改为异常,在桌面机上这样做是合理的,但在嵌入式系统上可能不是最佳选择。 - Michael Aaron Safyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接