65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Yocto Project 为各种 IoT 设备编写软件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (3投票s)

2014年11月10日

CPOL

11分钟阅读

viewsIcon

18412

演示如何使用 Yocto Project 获取包含 Mono 的自定义 Linux 基线操作系统,以用于各种不同的硬件配置。

引言

物联网时代已经到来,但它与大多数公司习惯的范式截然不同。几十年来,软件开发公司编写的软件,在很大程度上能够运行在客户使用的绝大多数计算设备上。物联网 (IoT) 范式的问题在于,如何利用现有代码来针对具有非常不同硬件要求的各种设备。例如,一家家庭自动化公司可能希望拥有各种传感器和 IoT 设备,这些设备可以馈送到整个系统的控制中。控制灯光开关的设备与执行人脸识别的设备具有截然不同的硬件要求。通常,公司需要聘请嵌入式软件开发人员为每个设备编写定制软件。这会导致更高的工程成本和更长的产品上市时间。

此外,许多开发人员在平衡软件框架的各种依赖性要求方面也面临困难。例如,您可能下载了一个用于 Raspberry Pi 设备的镜像,该镜像允许您运行 Linux,但后来发现内核头文件未包含在镜像中,或者包含的内核版本或 libc 库版本不是您的软件所需的版本。当您依赖第三方提供您的基础 Linux 发行版镜像时,很难将系统所有依赖的版本对齐。

最近出现了许多技术,通过让开发人员能够在各种截然不同的硬件配置上保持一致的操作系统,从而减轻了这些风险。本文将探讨的其中一种技术是 Yocto Project。

Yocto Project 是一个开源协作项目,它提供模板、工具和方法,帮助您为嵌入式产品创建基于 Linux 的定制系统,无论硬件架构如何” - www.yoctoproject.org

这意味着我们可以构建自己的自定义 Linux 发行版,其中包含我们软件所需的所有库和依赖项,但它在截然不同的硬件设备上保持一致。最初这可能听起来复杂得多,我们现在拥有一个一致的操作系统基线,但我们必须自己构建它。Yocto Project 使用 Poky 作为构建系统。它利用 OpenEmbedded (OE) 和 BitBake 将操作系统划分为“食谱”(recipes)。然后这些食谱被组合成“层”(layers)。然后可以使用板级支持包 (BSP) 为 Poky 提供其他层所依赖的必要硬件信息。您可以更换 BSP 以针对非常不同的设备,同时保持其他层不变。然后,您可以定义一个食谱,其中包含您的自定义 Linux 系统所需的所有层和食谱。这使您能够在非常不同的硬件平台上拥有相同的内核版本、库版本和依赖项。

别担心;这比听起来容易得多。

背景

本文的目的是演示如何使用 Yocto Project 的工具创建跨多个硬件平台保持一致的自定义 Linux 操作系统。这将为我们开发针对不同 IoT 设备的示例软件应用程序提供一个基线框架。所选的开发板都由不同的制造商制造,具有不同的用途和不同的处理器。由于它们的差异,我认为它们将很好地说明 Yocto Project 如何轻松地用于为非常不同的设备开发相同的 Linux 操作系统。选择了以下开发板(我希望以后也能添加到此列表中)

  • Raspberry Pi - 这是最流行的开发板之一。我决定使用它是因为……嘿……我们都有一个闲置的。板上的 SoC 是一个 Broadcom BCM2835,包含一个 ARM1176JZFS 核心。它还内置了一个 Videocore 4 GPU,能够以 40MBits/s 的速度播放蓝光质量的视频(使用 H.264)。GPU 还可以用于编写自定义的 OpenGL ES2.0 或 OpenVG 应用程序。该设备代表了一个功能更强大的 IoT 设备,用于驱动显示器或流式传输音频/视频。
  • Beagleboard Rev. C4 - 该板使用 Texas Instruments OMAP3530 SoC。该 SoC 包含一个 ARM Cortex-A8 核心、一个 TMS320C64x+ DSP 核心和一个 PowerVR SGX GPU。它可用于视频处理应用程序。这是一个较旧的开发板,该平台的更新版本已经开发出来(BeagleBone-xM、BeagleBone),但选择它是因为它与其它示例具有不同的启动过程,其引导加载程序以挑剔而闻名,并且过去在自定义构建或提供的镜像上对齐所有软件依赖项时,曾给我带来了很多挫败感。这是一个很好的例子,说明 Yocto Project 工具比过去的解决方案更容易使用。
  • MicroZed - 该板使用 Xilinx Zynq SoC,其中包含双 ARM Cortex-A9 处理器。它没有内置图形核心,但具有内置 FPGA 逻辑。这允许开发和添加到芯片上的非常自定义的硬件设计。例如,如果您的物联网设备需要执行一些自定义 DSP 算法来过滤传感器,甚至执行高级 DSP 算法,如人脸识别或对象检测,则该逻辑可以合成到 FPGA 部分的逻辑中。我认为这将是一个更基本的 ARM 系统(没有视频核心)以及一个能够进行非常自定义的硬件交互的良好示例。

本文的目的是展示为各种硬件平台生成自定义 Linux 开发环境的简便性。因此,我不会花太多时间在开发板设置上。假定如果读者拥有其中一块板并试图在其上运行自定义构建的镜像,他们将熟悉必要的电源连接、板跳线配置等。另请注意,这些开发板都为 Yocto 的 Poky 构建环境提供了现成的板级支持包 (BSP)。由于 Beagleboard 比其他两款板旧,因此没有针对当前 Poky 版本的 BSP;但是,我确实发现当前的 Texas Instrument 的 BSP 层仍然适用于旧板。如果您的板或处理器没有 Yocto Project 网站(很少能直接浏览到)上提供的可用 BSP,您可以尝试在 Google 上搜索“Yocto <板或处理器名称> BSP”以查看是否有社区或第三方开发的 BSP。如果仍然没有成功,您可以尝试自定义具有相同或类似 SoC 或 ARM 核心的可用 BSP。创建新的 BSP 不属于本项目的一部分。

应用程序开发

使用 Yocto Project,我们将能够创建一个自定义的 Linux 环境,但我也想展示如何轻松地设置运行时环境,用于开发、调试和运行用高级编程语言开发的应用程序。能够重用使用 C#、Ruby、Perl、Java 等开发的现有代码对于可能已经用该语言编写了库的开发人员来说非常有价值。它还使开发人员无需熟悉嵌入式系统上的底层 C++ 和 C 编码。如果您对 ARM 处理器、交叉编译器或嵌入式 Linux 的工作原理一无所知,您仍然可以为您的物联网设备开发软件。

作为本教程的一部分,我将演示如何在 Linux 环境中包含 Mono(一个跨平台 .NET 运行时环境),以便我们的操作系统可以在每个开发板上运行我们的 C# 源代码和库。在后续文章中,我将演示如何使用高级开发环境(如 Visual Studio 和 Xamarin Studio (MonoDevelop))在外部 PC 上运行来开发针对物联网设备的应用程序。但是,对于本教程,我们将重点放在让操作系统和运行时环境在板上运行起来。我们还将对系统进行快速验证,以确保 Mono 运行时正常运行。

开发板教程

我决定将开发板教程拆分成单独的文章。这篇文章变得很长,我认为每个单独的教程对于希望在其开发板上建立 Mono 运行时而无需阅读额外的开发板教程的开发人员来说可能是一个很好的参考。我还想为我手头的一些开发板添加一些教程。以后添加一个链接会比尝试为额外的教程添加整个部分更容易。

大部分教程对于不同的开发板是相同的,并且可以根据此处未涵盖的开发板或处理器进行定制。Yocto 工具还允许您针对 QEMU,这是一个硬件仿真环境。即使您没有开发板,您也应该能够使用 QEMU 完成这些教程(稍作调整)。这也是使用 Yocto 的一个很好的优势。您不仅可以在不同的硬件配置上获得一致的自定义 Linux 基线,还可以获得为这些各种嵌入式系统创建和构建软件的标准化方法。您还可以在实际硬件到位之前,先使用 QEMU 开发软件。

以下是各个开发板教程文章的链接

现在我们有了各种硬件设备,它们具有相对相同的操作系统和软件框架环境。接下来是什么?我们现在有能力开始开发通信软件,这将允许非常不同的板相互通信或与 Web 服务通信。毕竟,物联网设备的目的是能够派遣无人机捕获信息并在云中处理这些信息。在后续教程中,我将演示如何轻松完成此操作。

Yocto 的优缺点

完成教程后,您可能会有一个担忧,那就是它看起来好得令人难以置信。为什么大家没有都用它呢?幸运的是,上面选择的开发板都有现成的 BSP。如果特定处理器或开发板没有可用的 BSP,开发人员需要额外的专业知识来修改或从头开发一个。这种风险是一个合理的担忧;然而,Yocto 项目有很多大牌参与者,并且其列表每天都在增长。例如,英特尔、AMD、德州仪器、戴尔、博通和 LG 都是积极参与该项目的公司。这些只是官方参与者中的一小部分。教程中使用的 Mono 和 Raspberry Pi 元数据层由社区维护。随着 Yocto 的广泛使用,将支持更多的板级支持包和层。最后,即使您目标处理器没有类似的 BSP,Yocto 项目也有大量文档可以帮助您开始编写自己的食谱和 BSP。

现在我们有了一个自定义 Linux 基线,在非常不同的开发板上拥有相同的库版本和 Linux 内核。请注意,尽管不同开发板的构建过程相对相同,但用于启动开发板的输出文件却大不相同。Raspberry Pi 生成了一个我们可以直接写入 SD 卡的 SD 卡镜像。Beagleboard 需要创建额外的文件。我们还需要对 SD 卡进行分区并按特定顺序复制文件。坏消息是,使用 Yocto 并不总是意味着我们不需要为不同的硬件执行额外的自定义步骤。(这就是 BSP 网站上的 README 文件如此重要的原因。)好消息是,它已被证明足够动态,能够适应来自不同芯片供应商的非常不同的启动方法。

结论

总而言之,Yocto Project 是一个出色的工具,为我们提供了在各种嵌入式硬件配置上生成自定义 Linux 发行版的能力。它也是开发物联网设备应用程序的绝佳工具。以下是其一些优点:

  1. 公司和开发人员现在可以开发各种具有不同硬件要求的物联网设备,但可以利用相同的软件和库。
  2. 通过重用为其他设备开发的源代码和软件,缩短新物联网产品的上市时间。
  3. C# 等高级源代码可以在 Web 服务器、桌面应用程序和物联网设备上重复使用。
  4. 如果目标处理器有可用的 BSP 包,那么即使没有嵌入式应用程序经验的开发人员也可以开始为该设备开发软件。
  5. 针对各种物联网设备跟踪和构建镜像的一致构建过程。

历史

2014 年 11 月 9 日 - 初次提交。

2014 年 11 月 11 日 - 添加了 MicroZed 开发板并修复了链接。

© . All rights reserved.