Windows CE与嵌入式Linux的比较

32

现在我相信我们都很清楚Linux桌面与Windows桌面之间的优缺点。然而,我听到的关于嵌入式开发世界的知识却要少得多。我主要对解决方案感兴趣,并且不关心iPhone或Android,而更关心这两个操作系统。

在嵌入式世界中,这两个平台之间的相对权衡是什么?如果您正在考虑建立一个带有自定义硬件、部分定制化操作系统和自定义应用程序的项目箱,那么您会选择哪个操作系统,并为什么选择它?

我认为Windows CE在工具方面胜出,而Linux则在成本和可能的性能方面胜出。然而,这只是无稽之谈。有人有这两个操作系统的实际经验或事实吗?


1
你可能需要更详细地说明硬件类型和用途,因为它们会产生不同的影响。你可能会发现Linux可以在非常广泛的硬件上运行,但是在两者之间实时支持是不同的等等... - carson
1
不能谈论Linux,但是如果你是“认真的开发者”,那么WinCE可能是一个不错的选择。如果你是一个对嵌入式开发有兴趣的“独行侠”,你可能会觉得WinCE像是一个高墙围起来的封闭花园,知识共享受到限制。 - n611x007
8个回答

46

我曾在一家公司工作了几年,该公司为其所有硬件提供了CE和Linux,因此我对这两个方面都比较熟悉。

  • 工具:Windows CE提供的工具肯定比Linux提供的更好,尽管Linux的工具肯定越来越好。
  • 性能:Windows CE是实时的,而Linux则不是。Linux内核根本没有设计用于确定性。虽然有扩展可以添加以获得某种程度的实时性,但CE仍胜过它。
  • 成本:这是一个非常被误解的领域。我的一般经验是,CE的开箱即用成本更低(Platform Builder需要1,000美元,运行时可按每个设备低至3美元。 “什么?”你问道?“Linux是免费的。”嗯,实际上不太是这样,尤其是在嵌入式领域。是的,有像Debian这样的免费发行版。但是还有许多可能需要但不属于那个免费类别的部分,例如QT、Java运行时和媒体编解码器等。另外,大多数带有商业支持系统(例如MontaVista)的Linux发行版远非免费。
  • 源代码可用性:Linux支持者可能会说由于缺乏源代码,CE是一个不好的选择。我只能说,在使用CE的十多年时间中,其中半数时间都花在为自定义板做定制内核和驱动程序工作上,我只有一次需要未随CE分发的源代码。我也喜欢有源代码,但Microsoft提供支持,因此在您认为需要该源代码的罕见情况下,您可以让他们解决问题(我们需要源代码的那一次,微软提供了一个免费的修复方案-这是他们在CE下的模式)。

这是否意味着CE每次都获胜?并不是。我一点也不建议这样做。如果你使用Linux,并有很多Linux经验和代码资产,那么盲目地运行CE是愚蠢的。然而,如果你从零开始使用它,CE通常具有较低的TCO。拥有Win32 / C#经验的开发人员更为普遍,因此成本更低。此外,与大多数其他发行版相比,CE提供了更多“内置”功能,这意味着如果您尚未在内部完成这些操作,则可加快上市时间。


2
大部分同意。以下是一些评论:
  1. 根据微软文档,WinCE的价格可以高达每个设备16美元,取决于您选择包含哪些组件。
http://msdn.microsoft.com/en-us/windowsembedded/ce/dd630617.aspx
  1. 我没有找到适用于WinCE的Java运行时。因此,Linux许可证的额外成本并不相关。
- landmn
3
如今QT是免费的,至少如果你的许可证与LGPL兼容。 - wvdschel
4
尽管你不停地大声夸赞Linux的好处,但我想说,在一家公司工作了多年,我们为相同硬件交付了Linux和CE。你对CE的陈述表明你对它缺乏理解。许多应用程序的许可证费用在3美元左右,这几乎不会使成本超支。所有在平台构建器中可以完成的任务都可以通过命令行完成(事实上,很多年来只有命令行),而且容易自动化。 CE大约有95%的源代码可供使用 - 在我的生涯中,我只有一次需要查看未出货的内容 - 经过多年开发的许多产品。 - ctacke
3
如果需要的话,你可以在 CE 中修复内核(尽管我从未需要过)。声称没有人需要“支持”,然后又说 TCO 更低有点有趣。即使你自己做支持,支持也不是免费的。正如我所说,CE 并不总是胜利的。Linux 也是如此。两者都有坚实的商业案例。因为你有一些谬误的想法认为微软是“邪恶帝国”,而戴上眼罩是对那些正在调查可能让他们的产品及时上市、在预算范围内并且未来可维护的人的不利。如果 Linux 对你有帮助,那太好了。 - ctacke
11
我会放弃针对 Linux 作为信仰的挑衅。谢谢。 - ctacke
显示剩余7条评论

26
我将代表Linux这一方,至少是我熟悉的软件类别(即RF数据收集设备)来谈论。或者说是工业应用与消费者应用之间的区别。
Windows CE(以及其相关工具)在设计上非常注重在小屏幕上创造“Windows体验”。用户输入模式强调类似鼠标的操作方式。登录、应用程序选择等等都试图尽可能与标准Windows相似。
如果用户正在驾驶叉车、填充拣货车或将物料从一个地方移动到另一个地方,那就有问题了。
而且这是一个不断变化的目标,特别是在.NET方面。紧凑版.NET运行时功能严重受限,重要的库(如网络、数据处理和UI)存在不完整和版本过时的问题。CE似乎是Windows家族中的孤儿(可能因为没有太多的主动竞争者向硬件集成商销售)。
对于许多高使用率应用程序来说,一个稳定的行列式Linux控制台是一个相当方便的上下文环境(根据我的经验,是大多数情况)。但这对于您的手机或Zune游戏来说并不十分适用。
注意:
我认为ctacke可能比较准确地代表了硬件集成商的观点。我更加认同下游的参与者——软件集成商和用户的观点。

4
这是一个有趣且实用的观点。我已经为无屏和带屏设备开发了CE系统,它们看起来与CE或Windows完全不同,但你说得对,UI应用程序确实倾向于看起来“像Windows” 。我认为这仅仅是由于开发人员使用常规控件而不是自定义控件造成的。 - ctacke

21
选择往往基于感知和文化,而不是具体数据。当考虑到现代操作系统的复杂性、将其移植到定制硬件所涉及的所有问题以及未知的未来需求时,基于具体数据做出选择是困难的。即使从应用程序的角度来看,项目的生命周期中也会发生变化。需求来了又去了。你会发现自己做一些你从未想过的事情,特别是如果它们是可能的。普及的 USB 和网络端口开启了许多可能性——例如添加 Cell 模块支持或打印机支持。基于闪存的存储使得现场软件更新成为标准操作模式。最终,每种解决方案都有其优点和缺点——并没有适用于所有情况的万能解决方案。
在考虑嵌入式Linux开发时,我经常使用冰山比喻;你看到进入项目的部分是水面上的部分。这些是您的应用程序与之交互、您需要自定义的驱动程序和您理解的部分。另外90%在水下,这里存在着很多的可变性。与驱动程序质量问题或无法找到未来要支持的某些驱动程序相比,已知项目的部分容易被淹没。有很少有经验的人同时熟悉WinCE和Linux解决方案,因此倾向于选择熟悉的内容(或者经理们熟悉的内容),或者我们有经验的内容。以下是考虑的几个方面的思考:

系统软件开发

这个领域的问题包括CPU支持、驱动程序质量、现场软件更新、文件系统支持、驱动程序可用性等。在过去的两年中发生的变化之一是,CPU厂商现在将Linux移植到他们的新芯片作为首个操作系统。以前,操作系统移植通常是由Linux软件公司(如MontaVista)或社区努力完成的。因此,Linux内核现在支持大多数主流嵌入式CPU,并且只需要很少的额外补丁。这与5年前的情况截然不同。由于许多人使用相同的源代码,问题得到解决并经常被贡献回主流源代码。对于WinCE来说,BSP /驱动程序支持往往更多的是一个参考实现,然后OEM/用户接管它,修复任何问题,并且修复 tend to stay。
从系统角度来看,考虑未来需求的灵活性非常重要。现在不是必需品并不意味着将来不会成为必需品。为外围设备获取驱动程序支持可能几乎是不可能的,或者太大的工作量使其不切实际。
大多数人很少考虑构建系统,或者从未超出“如果工具周围有一个漂亮的GUI,那么它一定很容易”的想法。OpenEmbedded是构建嵌入式Linux产品的非常流行的方式,并且最近已被认可为MontaVista Linux 6产品的技术基础,并且通常被新用户认为“难以使用”。虽然WinCE构建工具在表面上看起来更简单(水面上的10%),但仍然存在问题,例如当我需要自定义某些内容、实现复杂功能(如软件更新)等时会发生什么。要构建具有生产级功能的生产系统,您仍然需要团队中了解操作系统并可以在操作系统和构建系统的详细级别上工作的人员。无论是WinCE还是嵌入式Linux,这通常意味着公司需要拥有经验丰富的开发人员,或者雇用专家来进行部分系统软件开发。系统软件开发与应用程序开发不同,通常不是您想要在没有经验的情况下承担的事情,除非您有很多时间。公司通常会为前几个项目聘请专家帮助,然后在内部进行后续项目。另一个要考虑的特性是并行构建支持。随着四核工作站成为标准,完整构建需要1.2小时与8小时相比是否很重要?构建系统在从各种来源(如不同的版本控制系统等)拉取和构建源代码方面有多灵活。
嵌入式处理器变得越来越复杂。仅仅让CPU运行已经不够了。如果考虑TI的OMAP3 CPU系列,那么你必须问以下问题:是否有可用于3D加速引擎的库,而且我甚至可以在不承诺每年数百万个单位的情况下获得它们吗?是否支持DSP桥接?所有这些的成本是多少?在我最近参与的一个项目中,Atmel AT91SAM9260的基本WinCE BSP花费了7000美元。从开发人员的时间角度来看,这并不算多,但您还必须考虑维护、升级到操作系统的新版本等持续性成本。
应用程序开发

嵌入式Linux和WinCE都支持一系列应用程序库和编程语言。C和C++得到了很好的支持。大多数商业类型的应用程序正在向WinCE世界中的C#转移。Linux有Mono,它为.NET技术提供了广泛的支持,并在嵌入式Linux系统中运行非常良好。对于嵌入式Linux,有许多Java开发环境可用。您可能会遇到差异的一个领域是图形库。通常,Microsoft图形API在Linux上得不到很好的支持,因此,如果您有一个由死忠的Windows GUI程序员组成的大型应用程序团队,那么也许WinCE是有意义的。但是,在Windows PC和嵌入式Linux设备上运行的GUI工具包有很多选择。一些例子包括GTK+、Qt、wxWidgets等。Gimp是一个在Windows上运行的GTK+应用程序的例子,还有许多其他应用程序。GTK+和Qt都有C#绑定。WinCE空间中另一个似乎越来越强大的功能是Windows Communication Foundation(WCF)。但是,根据您需要的部分,也有将WCF带到Mono的项目。对于像Python这样的脚本语言,嵌入式Linux的支持非常好,而且Python在200MHz ARM处理器上运行非常良好。

经常有人认为WinCE是实时的,Linux则不是。但是在带有PREEMPT选项的标准内核中,Linux实时支持还是不错的,而加入相对较小的实时补丁后,实时支持会更好。你可以轻松地使用Linux实现亚毫秒定时。这是过去几年中随着将实时功能合并到标准内核中而改变的。

开发流程

在生产环境中,大多数先进的嵌入式应用程序是在PC上开发和调试的,而不是目标硬件上。即使在远程调试目标系统运行良好的设置中,使用工作站调试应用程序效果更好。因此,一个解决方案具有良好的目标调试功能,而另一个解决方案没有这种功能并不是真正相关的。对于数据中心系统,通常会有模拟模式,可以在不连接到真实I/O的情况下测试应用程序。对于Linux和WinCE应用程序,嵌入式设备的应用程序编程类似于PC的编程。嵌入式Linux将其推向了更高一级。由于嵌入式Linux技术与桌面和服务器Linux技术相同,几乎所有为桌面/服务器开发的内容(包括系统软件)都可以免费用于嵌入式。这意味着非常完整的驱动程序支持(请参见上面的USB单元调制解调器和打印机示例),强大的文件系统支持,内存管理等。Linux的选择范围令人惊叹,但有些人可能认为这是一个负面因素,并希望像Windows CE这样的更集成化的解决方案,其中所有内容都来自一个地方。虽然会失去一些灵活性,但在某些情况下,这种权衡可能是值得的。有关使用Openembedded为嵌入式Linux系统构建的软件包数量的示例,请参见。
GUI趋势

考虑到由手机(iPhone、Palm Pre等)驱动的具有小显示屏的嵌入式设备的趋势非常重要。在现代嵌入式系统中,常见于桌面系统的标准GUI小部件(对话框、复选框、下拉列表等)已经不再适用。因此,考虑支持3D效果和专为触摸屏设备设计的小部件库非常重要。Clutter库就是这种支持类型的例子。

远程支持

回到调试工具的问题,大多数人都会停留在设备在实验室旁边的情况下。但是如果您需要解决正在世界另一端进行beta测试的设备的问题怎么办?这就是像Gdb这样的命令行调试器的优点而不是缺点所在。如果在新西兰没有支持蜂窝调制解调器的支持或者没有像SSH这样的高效连接机制来进行shell访问和文件传输,那么该如何连接到设备呢?

总结

选择任何先进技术都不是简单的任务,即使有经验,也很难做到。因此,重要的是要提出正确的问题,并从许多角度来看待决策。希望本文能对此有所帮助。


13

我曾参与过定制OEM板的软件项目,我并不认为Linux更便宜。购买板子时还需要购买SDK,即使是Linux版本也需要支付费用。一些制造商为其板提供Windows CE和Linux解决方案,价格没有差别。对于Windows CE,您还需要Platform Builder并支付许可证费用,但是如果不需要支持,它更容易使用。

另一个重要问题是您是否正在构建用户界面或无头设备。对于需要LCD屏幕和人机交互的设备,使用Windows CE会更容易。另一方面,如果您正在构建无头设备,特别是涉及网络协议的情况下,Linux可能是更明智的选择。我相信Linux实现更可靠且更容易调整。


购买板子时,您还需要购买SDK吗?真的吗?为什么不配置一个适当的内核/DT呢? 我从来没有为Linux购买过任何“SDK”,也不知道为什么我需要购买。 内核/DT本来就是针对特定板子的,所以 - 除非您有一个标准板子 - 否则您仍然需要进行自定义。 - Enrico 'nekrad' Weigelt

8

使用Linux,您永远不会孤立无援,并且您永远不会依赖于单个实体提供权限。有许多支持选项,您可以通过许多竞争来源为系统的任何部分选择支持选项。

使用Windows CE,您必须遵守复杂的许可协议中设定的许可和限制。请咨询律师。在Windows CE中,只有一个专有源提供操作系统支持,您将按照他们认为适合支持和提供您需要的方式进行操作。您可能不同意他们的立场,但是除了屈服于他们所规定的事情之外,您没有任何救济措施。使用专有平台的增量组件、模块、开发工具包、许可和支持成本往往会逐渐累积。从长远来看,如果供应商不再希望支持该平台,并且您没有权利自行支持和分发该平台,会发生什么?当供应商采用新技术并希望您与他们一起前进时,即使您可能还没有准备好采取行动,会发生什么?$$$

我们对Windows解决方案的经验是,它们往往随着时间的推移变得更加昂贵。最初被认为是最低TCO的解决方案很快就会演变成负担沉重且维护和支持成本高昂的解决方案。许可协议必须随时间重新协商,而新技术通常是不需要的,但出于提供者的商业需求而被强制纳入考虑。除此之外,许可协议也在不断地改变 - 请咨询律师。

使用Linux,您有自由提供内部支持和专业知识,而无需受到分发解决方案所带来的限制。您还可以自由地继续使用和支持原始提供者不再希望支持的技术。拥有源代码并拥有自主权(GPL、LGPL)在保证业务连续性、控制成本同时提供对最新技术或适合您需要的技术访问时是一个强大的吸引因素。


7
我开发了适用于RT Linux(更具体地说,带有RT补丁的Linux抢占内核)和Windows CE的网络驱动程序。我的经验是,在实时响应方面,Windows CE更加稳定。帧时间显示,Windows CE的抖动更少。
在RT Linux上,我们遇到了各种各样的问题。例如,当用户移动鼠标时,我们的帧会被延迟。猜猜怎么着,某些变体的x-windows会禁用中断。你可能还觉得只有控制台屏幕才更安全。如果启用了VGA帧缓冲区,你又完蛋了。我们只有一个问题是关于Windows CE的抖动。问题出现在BIOS中USB控制器设置错误时,Windows CE正在使用大量时间进行轮询。
老实说,Windows CE有更多的支持。在Linux上,你是自己的。你必须阅读每个可能的邮件列表,以了解可能遇到的问题。

5

一个部分自定义的操作系统

如果这个操作系统是开源的(并且你有专业知识),实现起来会更加容易。


2
CE附带足够的源代码(大约95%左右)以修改或替换几乎任何您想要的内容。 - ctacke
ctacke:这很有趣,修改版是如何获得许可的? - Ali Afshar
4
我认为这被称为微软宽容许可证(http://en.wikipedia.org/wiki/Shared_source#Microsoft_Public_License_.28Ms-PL.29)。基本上,您可以根据自己的意愿制作和使用修改版本,而无需向任何人提供这些更改,并且如果愿意,可以在商业项目中使用衍生产品。 - ctacke

2

Android是一些嵌入式系统的不错选择。(它基于Linux)

  • 你可以找到许多能够在该系统上进行开发的专家。

  • 你可以使用Java或C中的许多库。

但是它会占用很多内存和能源。

我们经常忘记的是,付费/许可软件需要处理许可证。这需要时间和精力!然后你必须跟踪是否正确支付。这涉及许多具有不同技能的人,并且在决策方面成本高昂。

这种成本通常不包括在显示开源/免费比付费软件更昂贵的研究中。

使用“免费软件”更容易处理许可证,并且您花费更少的时间处理这些问题。个人而言,我更喜欢避免每次更改软件的某些部分时与法务/财务团队进行不必要的沟通。


1
Microsoft基本上是免费提供嵌入式工业软件,使他们更具竞争力,而且使用起来也不那么麻烦。此外,他们还提供了许多源代码。然而,他们在过去的四年中几乎忽视了市场空间,因此可能失去了很多优势。 - Quibblesome

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