选择通常主要基于感知和文化,而不是具体数据。而且,当您考虑现代操作系统的复杂性、与将其移植到定制硬件相关的所有问题以及未知的未来需求时,根据具体数据做出选择是很困难的。即使从应用程序的角度来看,事情也会随着项目的生命周期而变化。需求来来去去。你会发现自己在做你从未想过会做的事情,尤其是在可能的情况下。无处不在的 USB 和网络端口开启了许多可能性——例如添加 Cell 调制解调器支持或打印机支持。基于闪存的存储使现场软件更新成为标准操作模式。最后,每种解决方案都有其优点和缺点——没有在所有情况下都是最好的灵丹妙药。
在考虑嵌入式 Linux 开发时,我经常使用冰山的比喻;你在项目中看到的是水面以上的部分。这些是您的应用程序与之交互的部分,您需要自定义的驱动程序,您理解的部分。其余 90% 在水下,因此存在很大的可变性。驱动程序的质量问题或无法找到您将来可能想要支持的驱动程序很容易淹没项目的已知部分。很少有人同时拥有 WinCE 和 Linux 解决方案的丰富经验,因此倾向于选择舒适的(或经理舒适的)或我们所拥有的经验。以下是一些需要考虑的方面的想法:
系统软件开发
这个领域的问题包括 CPU 支持、驱动程序质量、现场软件更新、文件系统支持、驱动程序可用性等。过去两年发生的变化之一是 CPU 供应商现在正在将 Linux 移植到他们的新芯片中作为第一个操作系统。以前,操作系统移植通常由诸如 MontaVista 之类的 Linux 软件公司或社区努力完成。因此,Linux 内核现在支持大多数主流嵌入式 CPU,只需要很少的附加补丁。这与 5 年前的情况截然不同。因为很多人都在使用相同的源代码,所以问题会得到修复,并且通常会被贡献回主流源代码。使用 WinCE,BSP/驱动程序支持更多地是一种参考实现,然后 OEM/用户接受它,修复任何问题,这就是修复程序往往停留的地方。
从系统的角度来看,考虑未来需求的灵活性非常重要。仅仅因为它现在不是一个要求并不意味着它将来不会是一个要求。获得对外围设备的驱动程序支持几乎是不可能的,或者需要付出太大的努力才能使其实用。
大多数人很少考虑构建系统,或者从不考虑“如果有一个很好的 gui 围绕该工具,它一定很容易”。OpenEmbedded 是一种非常流行的构建嵌入式 Linux 产品的方式,最近被认可为 MontaVista 的 Linux 6 产品的技术基础,被新用户普遍认为“难以使用”。虽然 WinCE 构建工具表面上看起来更简单(高于水面的 10%),但当我需要自定义某些东西、实现软件更新等复杂功能时,您仍然会遇到问题。构建具有生产级的生产系统功能,您仍然需要团队中了解操作系统并且可以在操作系统和构建系统的详细级别上工作的人。使用 WinCE 或嵌入式 Linux,这通常意味着公司要么需要有经验丰富的内部开发人员,要么聘请专家进行部分系统软件开发。系统软件开发与应用程序开发不同,除非你有很多时间,否则通常不是没有经验就想从事的事情。公司通常会为最初的几个项目聘请专家帮助,然后在内部进行后续项目。另一个需要考虑的特性是并行构建支持。随着四核工作站成为标准,一个完整的构建可以在 1.2 小时内完成而不是 8 小时内完成是否重要?构建系统在从各种来源(如各种版本控制系统等)提取和构建源代码方面有多灵活。或聘请专家进行部分系统软件开发。系统软件开发与应用程序开发不同,除非你有很多时间,否则通常不是没有经验就想从事的事情。公司通常会为最初的几个项目聘请专家帮助,然后在内部进行后续项目。另一个需要考虑的特性是并行构建支持。随着四核工作站成为标准,一个完整的构建可以在 1.2 小时内完成而不是 8 小时内完成是否重要?构建系统在从各种来源(如各种版本控制系统等)提取和构建源代码方面有多灵活。或聘请专家进行部分系统软件开发。系统软件开发与应用程序开发不同,除非你有很多时间,否则通常不是没有经验就想从事的事情。公司通常会为最初的几个项目聘请专家帮助,然后在内部进行后续项目。另一个需要考虑的特性是并行构建支持。随着四核工作站成为标准,一个完整的构建可以在 1.2 小时内完成而不是 8 小时内完成是否重要?构建系统在从各种来源(如各种版本控制系统等)提取和构建源代码方面有多灵活。除非您有很多时间,否则通常不是您想在没有经验的情况下从事的事情。公司通常会为最初的几个项目聘请专家帮助,然后在内部进行后续项目。另一个需要考虑的特性是并行构建支持。随着四核工作站成为标准,一个完整的构建可以在 1.2 小时内完成而不是 8 小时内完成是否重要?构建系统在从各种来源(如各种版本控制系统等)提取和构建源代码方面有多灵活。除非您有很多时间,否则通常不是您想在没有经验的情况下从事的事情。公司通常会为最初的几个项目聘请专家帮助,然后在内部进行后续项目。另一个需要考虑的特性是并行构建支持。随着四核工作站成为标准,一个完整的构建可以在 1.2 小时内完成而不是 8 小时内完成是否重要?构建系统在从各种来源(如各种版本控制系统等)提取和构建源代码方面有多灵活。一个完整的构建可以在 1.2 小时而不是 8 小时内完成,这很重要吗?构建系统在从各种来源(如各种版本控制系统等)提取和构建源代码方面有多灵活。一个完整的构建可以在 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,这取决于您需要哪些部分。嵌入式 Linux 对 Python 等脚本语言的支持非常好,Python 在 200MHz ARM 处理器上运行得非常好。
人们常常认为 WinCE 是实时的,而 Linux 不是。Linux 实时支持在带有 PREEMPT 选项的股票内核中是不错的,并且通过添加一个相对较小的实时补丁,实时支持非常好。使用 Linux,您可以轻松实现亚毫秒级计时。这在过去几年中随着实时功能合并到股票内核而发生了变化。
开发流程
在生产环境中,最先进的嵌入式应用程序是在 PC 上开发和调试的,而不是在目标硬件上。即使在目标系统上的远程调试效果很好的设置中,在工作站上调试应用程序也效果更好。因此,一种解决方案具有良好的目标调试功能,而另一种解决方案没有这一事实并不真正相关。对于以数据为中心的系统,通常具有可以在不连接到真实 I/O 的情况下测试应用程序的模拟模式。对于 Linux 和 WinCE 应用程序,嵌入式设备的应用程序编程类似于 PC 编程。嵌入式 Linux 更进一步。由于嵌入式 Linux 技术与桌面和服务器 Linux 技术相同,几乎所有为桌面/服务器开发的东西(包括系统软件)都可以免费嵌入。这意味着非常完整的驱动程序支持(参见上面的 USB 单元调制解调器和打印机示例)、强大的文件系统支持、内存管理等。Linux 的选择范围令人震惊,但有些人可能会认为这是一个负面因素,并且更喜欢像 Windows CE 这样的集成解决方案,一切都来自一个地方。失去了灵活性,但在某些情况下,这种权衡可能是值得的。有关可以使用 Openembedded 为嵌入式 Linux 系统构建的软件包数量的示例,请参阅。并且更喜欢像 Windows CE 这样的更集成的解决方案,其中一切都来自一个地方。失去了灵活性,但在某些情况下,这种权衡可能是值得的。有关可以使用 Openembedded 为嵌入式 Linux 系统构建的软件包数量的示例,请参阅。并且更喜欢像 Windows CE 这样的更集成的解决方案,其中一切都来自一个地方。失去了灵活性,但在某些情况下,这种权衡可能是值得的。有关可以使用 Openembedded 为嵌入式 Linux 系统构建的软件包数量的示例,请参阅。
图形用户界面趋势
重要的是要考虑由手机(iPhone、Palm Pre 等)驱动的带有小型显示器的嵌入式设备的趋势。桌面系统中常见的标准 GUI 小部件(对话框、复选框、下拉列表等)并不适用于现代嵌入式系统。因此,考虑支持 3D 效果和设计用于触摸屏设备的小部件库非常重要。Clutter 库是此类支持的一个示例。
远程支持
回到调试工具的问题,大多数人停留在设备设置在实验室工作站旁边的场景上。但是,当您需要对在世界各地进行 beta 测试的设备进行故障排除时,该怎么办?这就是像 Gdb 这样的命令行调试器的优点,而不是缺点。如果您不支持新西兰的蜂窝调制解调器,或者不支持 ssh 等用于 shell 访问和传输文件的高效连接机制,您如何连接到设备?
概括
选择任何先进技术都不是一件容易的事,即使有经验也很难做到。因此,重要的是要提出正确的问题,并从多个角度看待决定。希望这篇文章能对此有所帮助。