选择往往基于感知和文化,而不是具体数据。当考虑到现代操作系统的复杂性、将其移植到定制硬件所涉及的所有问题以及未知的未来需求时,基于具体数据做出选择是困难的。即使从应用程序的角度来看,项目的生命周期中也会发生变化。需求来了又去了。你会发现自己做一些你从未想过的事情,特别是如果它们是可能的。普及的 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访问和文件传输,那么该如何连接到设备呢?
总结
选择任何先进技术都不是简单的任务,即使有经验,也很难做到。因此,重要的是要提出正确的问题,并从许多角度来看待决策。希望本文能对此有所帮助。