使用正确的工具:嵌入式编程

我对编程非常适合嵌入式编程的语言很感兴趣。 特别是:

是否可以用C ++编写嵌入式系统? 或者使用纯C更好? 或者,只有当语言的某些function(例如RTTI,例外和模板)被排除在外时,C ++才行吗?

那个域里的Java怎么样?

谢谢。

是否可以用C ++编写嵌入式系统?

是的,当然,即使是8位系统。 C ++只有比C稍微不同的运行时初始化要求,即在调用main()之前必须调用任何静态对象的构造函数。 开销(不包括你控制范围内的构造函数本身)很小,但你必须要小心,因为没有定义构造的顺序。

使用C ++,您只需为您使用的内容付费(而且许多有用的内容可能是免费的)。 也就是说,例如,一块也是C ++可编译的C代码通常不需要更多内存,并且在编译为C ++时执行速度不比编译为C时慢。有些C ++元素可能需要小心有,但许多最有用的function很少或没有成本,并有很大的好处。

或者使用纯C更好?

可能在某些情况下。 一些较小的8位甚至16位目标没有C ++编译器(或者至少没有任何一种代表),使用C代码可以提供更大的可移植性。 此外,对于应用程序较少的资源严重受限的目标,C ++可以带来的优势很小。 C ++中的额外function(主要是那些支持OOP的function)使其适用于相对较大和复杂的软件构造。

或者,只有当语言的某些function(例如RTTI,例外和模板)被排除在外时,C ++才行吗?

可接受的语言function完全取决于目标和应用程序。 如果您受内存限制,您可能会避免使用昂贵的function或库,即使这样,也可能取决于它是您缺少的代码还是数据空间(在这些是独立的目标上)。 如果应用程序是硬实时的 ,那么您将避免使用那些不确定的特性和库类。

一般来说,我建议如果你的目标是32位,总是使用C ++优先于C,然后削减你的C ++以适应内存和性能限制。 对于较小的部分,在选择C ++时要稍微谨慎一点,尽管不要完全打折; 它可以让生活更轻松。

如果您确实选择使用C ++,请确保您具有可识别C ++的适当调试器硬件/软件。 使用C ++构建复杂软件相对容易,使得一个不错的调试器更有价值。 并非嵌入式领域中的所有工具都具有C ++知识或能力。

我总是建议在任何嵌入式主题上挖掘Embedded.com的档案,它有很多文章,包括一些这样的问题,包括:

  • 拒绝C ++的原因很糟糕
  • C中的真人计划
  • 潜入C ++并生存下去
  • 在嵌入式设计中使用C ++替代C的指南
  • 为什么C ++是嵌入式系统设计中C的可行替代品
  • 即使在最低水平也更好

关于Java,我不是专家,但它有很大的运行时要求,使其不适合资源受限的系统。 您可能会使用Java将自己限制在相对昂贵的硬件上。 它的主要好处是平台独立性,但是这种可移植性并没有扩展到不支持Java的平台(其中有很多),因此它可以说比具有抽象硬件接口的精心设计的C或C ++实现更不便携。

[编辑]我刚刚在TechOnline时事通讯中收到了这篇文章: 在嵌入式应用程序中有效地使用C ++

在嵌入式系统中,您编程的语言通常取决于实际可用的编译器。
如果您的硬件只有C编译器,那就是您要使用的。 如果它有一个像样的C ++编译器,那么实际上没有理由偏爱C而不是C ++。
我敢说Java在嵌入式系统中不是一个非常受欢迎的选择。

如今,嵌入式编程涵盖了大量应用程序。
粗略地说,它从传感器/交换机到完整的安全系统。
您的语言应该基于复杂性和硬件资源。
它是HW(CPU,…),操作系统,协议……旁边的选择之一。
可能的选择:

  • 开关:汇编程序
  • 类似路由器的设备:C和/或C ++
  • 手持设备:Java或QT / C ++
  • 完整系统:使用python组合C和/或C ++

或者,只有当语言的某些function(例如RTTI,例外和模板)被排除在外时,C ++才行吗?

按照这些思路思考是件好事。 编译时复杂性并不是一件大事,但运行时复杂性会产生资源成本。

C ++有助于类/命名空间模块化(例如,在多个上下文中的方法foo() )和实例模块化(成员字段bar属于多个对象),这两者都是软件设计的一大优势。 还有const ,引用,静态强制转换和模板等function,这些function可以帮助实施约束并且很少或没有运行时成本。

不会排除模板 。 它们考虑起来很复杂,你需要一个能够很好地处理它们的编译器,但是资源成本几乎都是编译时间 – 每次使用具有不同类参数的模板时,“成本”的事实是什么,您生成一组新的代码来实例化成员函数。 但是如果没有模板,你几乎肯定会做同样的事情。 此外,模板允许您在一般情况下设计和测试库,这些文件在编译时而不是链接时实例化。 只是为了澄清:模板允许你有一个你测试的文件啊。 然后将它与文件Bh或Bc一起使用以在编译时实例化它。 (一个库将被链接而不是编译,这使它变得不那么灵活 – 模板方法可以被优化掉,因此它们不会产生函数调用。)我在嵌入式系统中使用模板来实现CRC代码并修复 – 点数学:我可以测试通用代码,将其放在版本控制中,然后通过编写一个派生自模板或具有模板成员字段的简单类来重复使用它。 当然,典型的例子是STL。

RTTI和例外 :这些增加了运行时复杂性。 我不太了解资源成本,但我希望RTTI会相当简单(只需添加一个类型标记,花费额外的空间),而exception可能是野蛮的,涉及堆栈展开。

虚函数 :由于内存+执行时间成本(最小但仍然存在)以及调试的复杂性,我过去常常将它们排除在外,但它们允许您将对象相互分离。 如果你不使用虚函数,当一个类的实例(例如Foo)需要执行与另一个类的实例(例如Bar)相关联的代码时,那么第一个类需要知道关于第二个类的所有内容(编译Foo)你需要与Bar中的所有方法建立静态链接 – 这会增加很多紧耦合。

动态内存分配 :这是另一件大事(也就是在C中),我们就像我公司的瘟疫一样避免 – 不仅会出现各种各样的错误,而且大的运行时成本是分配器/ deallocator,你必须愿意并且能够知道成本是多少并接受它。


编辑:我想在嵌入式世界中使用Java而不是C ++。 不幸的是,我的选择是有限的,运行时资源成本(代码大小,内存大小,垃圾收集时间限制)在我工作的空间中太高。我使用Java的原因是因为它的运行时好处而且更多事实上,它的软件设计更清晰,而且工具更好(OMG!重构!哇喔!)……对我而言,关键似乎在于两件事,这使得C / C ++相比之下感觉非常笨重:

  1. 一切都是对象,所有方法都是虚拟的,所以你可以在很大程度上依赖于接口的抽象。

  2. Java中的接口/实现分离并不是这个笨拙丑陋的.c/.h文件拆分使编译器变得如此慢的东西。 相比之下,我在Eclipse中使用Java,它在编辑时自动编译代码。 这太棒了! 我立即发现了大部分错误。 在C / C ++中,我必须等待整个编译周期。

有一天,我希望C / C ++和Java之间会有一种语言能够为软件开发提供Java的优势,而不需要让Java对桌面/服务器应用程序如此具有吸引力但在大多数嵌入式世界中没有吸引力的花俏。

C和C ++都可以在嵌入式系统上使用。 如果你确实限制了你使用的C ++的function,那么它将使用与C大致相同的速度和空间。至于使用这些附加function,它实际上取决于你的约束。 例如,如果您正在创建一个实时系统,那么exception可能不是一个好主意,仅仅因为考虑exception的传播时间以及exception可能传播的所有路径都会使硬实时保证变得非常困难(尽管如此,ACE / Tao实时CORBA实现再次使用exception)。 虽然模板和RTTI可以导致更大的程序,但嵌入式系统存在很多变化,因此根据您的资源限制,这可能是完全正常的或不可接受的。 Java也是如此。 Java(在技术上,Java编程语言和Java API的子集)在Android上运行,例如,使用Dalvik VM。 J2ME可在各种嵌入式设备上运行。 它是否适用于您的应用程序取决于您的特定约束。

c是嵌入式系统中最常用的语言。

但是,我认为C ++的未来在于嵌入式系统领域。 我认为C ++ 0x标准将有助于进行重新考虑。 所以我不会惊讶地看到C ++在这个领域中使用了更多。

我想你已经有了克利福德的一个很好的答案,但我会把它的经验添加到它。 正如所指出的,嵌入式系统的类型是主要驱动因素。 在国防/航空航天领域,C和Ada是我遇到的最流行的嵌入式语言。 虽然随着时间的推移,我看到更多的C ++,因为基于模型的开发变得越来越受Rhapsody等工具的欢迎。 在职位列表中,看到面向对象设计体验的要求也让我相信市场正在慢慢转变以跟随主流发展的趋势。

如果您真的对嵌入式开发感兴趣,我会从C开始。它非常普遍。 几乎所有操作系统,包括Integrity,Nucleus,VxWorks和嵌入式Linux等实时操作系统,都有一个编译器和工具。 你将学习关于指针,内存管理等的东西……至少会在嵌入式世界中很好地转化为C ++开发。

至于Java,如果你对智能手机等移动平台的开发感兴趣,这是一个可靠的选择(Android会浮现在脑海中)。 但在实时操作系统领域,我还没有看到它。

在那个问题上,这让我想到了最后一点和建议。 如果我想进入嵌入式编程(我在4年前做过),我会专注于从低级别的角度学习C,如上所述。 然后,我还将了解是什么让实时编程如此困难/不同。 我发现下面这本书非常擅长教你像嵌入式程序员和应用程序开发人员一样思考。 祝你好运!

嵌入式软件入门

它实际上归结为您正在运行的硬件平台,因此您可以使用哪些软件平台。 对于很多最近的嵌入式套件 – 围绕片上系统,兆字节或两个RAM,一些设备而设计 – 你真的想要一个小型操作系统来管理低级硬件,同时专注于你的应用程序。 您选择的操作系统会限制您的可用语言集。

在嵌入式空间中使用C ++当然是可能的,但语言的完整function集需要大量工作才能正确移植。 例如, eCos是以C和你可能称之为C ++结构方面的混合体实现的; 免费版本中缺少对RTTI,exception和STL的支持,尽管有人正在为此工作(以及可用的商业端口)。

同样,可以使用Java – 我知道,我已经将JVM移植到嵌入式环境中; 它并不好玩 – 虽然你通常会得到一个简化的Java语言配置,通常是基于J2ME的。