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

在 Raspberry Pi 上运行 Mono(使用 Yocto)。

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2014年11月10日

CPOL

8分钟阅读

viewsIcon

31232

演示如何使用 Yocto Project 在树莓派开发板上构建一个包含 Mono 的定制 Linux 操作系统。

引言

本文是一篇教程,介绍如何为树莓派开发板构建一个定制的 Linux 基础系统和 Mono(一个跨平台 .NET 运行时环境)。这是更大型文章的一部分,该文章解释了如何使用 Yocto Project 在多个硬件配置上建立定制的 Linux 基础系统。本教程的最终目标是让我们的树莓派开发板能够运行 C# 应用程序和库。这些应用程序和库可以使用高级集成开发环境(IDE),如 Visual Studio、SharpDevelop 或 Xamarin Studio 进行开发。这使得对嵌入式环境经验有限的软件开发者能够为嵌入式物联网(IoT)设备编写软件。

安装

本文不涵盖树莓派的基本设置(电源连接、跳线设置、串行输出等),因为我们假定希望使用本教程的开发板所有者已从开发板随附的快速入门指南或参考手册中对这些连接有了基本了解。本文的重点是使用 Yocto 构建针对开发板的所需环境。

本教程使用以下软件和硬件组件:

我们将使用的主要 Yocto Project 工具是 Poky 构建系统。要使用此工具,我们需要一个 Linux 开发环境。大多数主流 Linux 发行版都支持。我使用的是 Mint 17 64 位。Yocto Project 网站还有一个“Build Appliance”,其中包含一个 VMWare 虚拟机镜像,里面预装了 Linux 系统,可以直接使用。如果在自己的 Linux 环境中使用 Poky,请确保安装所需的依赖项(有关更多信息,请参阅 Yocto Project 网站上的快速入门或参考手册 www.yoctoproject.org)。我必须安装的软件包如下:g++、texinfo、libsdl1.2-dev、texi2html、cvs、subversion、bison、flex 和 mono-complete(用于构建 Mono)。

我还建议您阅读 Yocto Project 网站上的一些快速入门文档。本文将概述为树莓派创建引导镜像和文件的步骤,但要更深入地了解 Yocto 的功能和特性,请参阅 Yocto 的在线文档。

使用代码

在Linux开发系统端应在终端运行的命令以 $ 提示符显示

$ 

在开发板上应运行的命令以 # 提示符显示

#

文件修改将使用“...”表示所引用部分之前和之后的文件文本。这将允许我们显示文件中需要更改的部分,而无需显示整个文件内容。

...

Text in the file

...

教程

为树莓派 Poky 构建环境创建一个文件夹

$ mkdir ~/rpi

将git Yocto项目核心克隆到poky工作目录中

$ git clone -b daisy git://git.yoctoproject.org/poky.git ~/rpi

现在我们需要获取与我们的处理器或开发板关联的板级支持包。meta-raspberrypi 板级支持包可以使用。此元数据层位于 Yocto 项目网站上。如果您无法在 Yocto 网站上找到针对目标板的 BSP,可以尝试搜索“yocto <board or processor> bsp”,您可能会找到社区维护的版本。

将 meta-raspberrypi 板级支持包克隆到 poky 工作目录中。注意:在获取板级支持包时,请务必阅读该软件包附带的 README 文件或在线的仓库“关于”部分。有时它们有必须采取的额外步骤才能使用 BSP。

$ git clone -b daisy git://git.yoctoproject.org/meta-raspberrypi ~/rpi/meta-raspberrypi

仓库“关于”部分指出,我们还需要 OpenEmbedded 的 meta-multimedia 层。此层包含在 meta-openembedded 包中。我们可以使用以下命令克隆此包

$ git clone -b daisy git://git.openembedded.org/meta-openembedded ~/rpi/meta-openembedded

将meta-mono元数据层克隆到poky工作目录中

$ git clone -b daisy git://git.yoctoproject.org/meta-mono ~/rpi/meta-mono

来源构建环境脚本以创建配置文件

$ cd ~/rpi
$ source oe-init-build-env

将 meta-raspberrypi 板级支持包层和 Mono 元数据层添加到构建环境中。为此,请打开 ~/rpi/build/conf/bblayers.conf 文件,并在 meta-yocto-bsp 之后将这些层添加到 BBLAYERS 变量中。完成后,该文件应如下所示

...
  /home/<username>/rpi/meta-yocto-bsp \
  /home/<username>/rpi/meta-raspberrypi \
  /home/<username>/rpi/meta-mono \
  "
...

现在将 MACHINE 变量更改为树莓派开发板。这会告诉构建环境在构建 Linux 环境时要针对哪个开发板。为此,请编辑 ~/rpi/build/conf/local.conf 文件。向下滚动文件,直到找到以下部分

...
#MACHINE ?= "edgerouter"
#
# This sets the default machine to be qemux86 if no other machine is selected:
MACHINE ??= "qemux86"
...

将树莓派的引用添加到默认值之上,使文件如下所示

...
#MACHINE ?= "edgerouter"
MACHINE ?= "raspberrypi"
#
# This sets the default machine to be qemux86 if no other machine is selected:
MACHINE ??= "qemux86"
...

这会将构建环境设置为以树莓派为目标。如果您不知道机器名称,可以查看 BSP 文件夹(meta-raspberrypi)子文件夹:conf/machine(~/rpi/meta-raspberrypi/conf/machine)。此文件夹中的 .conf 文件名都是板级支持包可以针对的机器名称。另请注意,默认机器是 qemux86。QEMU 是一个开源机器模拟器。您可以使用此模拟器在实际针对特定开发板之前尝试使用定制构建的 Linux 发行版。

此时,您可能希望构建一个最小镜像,以确定您的构建环境是否设置正确。您可以通过运行“bitbake core-image-minimal”来完成此操作。我们将跳过此步骤,继续构建包含 Mono 的最小镜像。

有很多方法可以混合搭配软件包和配方。Mono 元数据层已经为我们提供了一些配方,可以将 Mono 添加到我们想要创建的任何镜像中;但是,在这里我们将创建自己的镜像配方,其中包括包含 Mono 运行时的最小 Linux 镜像。这意味着 Mono 的 GUI 元素(依赖于 libgdiplus 的类)将无法工作,因为基本的最小镜像不包含 GDI。由于许多 IoT 应用程序可能不包含图形界面,因此我们认为这是展示在开发板上运行 C# 的最小要求的最佳方法。

我们需要做的第一件事是创建一个包含文件,告诉构建环境我们需要包含什么。您可以通过运行以下命令来完成此操作:

$ (cat << EOF
> IMAGE_INSTALL += "mono mono-helloworld"
> EOF
> ) > ~/rpi/meta-mono/recipes-mono/images/rpi-hwup-image-mono.inc

此命令会在 meta-mono 层中生成文件。您也可以创建自己的层。如果将此包含文件与 ~/rpi/meta-mono/recipes-mono/images/core-image-mono.inc 文件进行比较,您会注意到唯一的区别是省略了 libgdiplus 依赖项。另外请注意,我们将此包含文件的命名方式与其他开发板教程不同。meta-raspberry 提供了自己的基本引导镜像配方。rpi-hwup-image 配方使用构建环境的默认 core-image-minimal 配方,但为其添加了一些内核模块。我们将使用 rpi-hwup-image 作为我们的目标配方,而不是 core-image-minimal,以便获得这些额外的特定于开发板的模块。

现在让我们创建实际的bitbake配方文件。您可以通过运行以下命令来完成:

$ (cat << EOF
> require recipes-core/images/rpi-hwup-image.bb
> require rpi-hwup-image-mono.inc
> EOF
> ) > ~/rpi/meta-mono/recipes-mono/images/rpi-hwup-image-mono.bb

此命令会生成 bitbake 配方文件。此配方非常简单。第一行告诉构建环境包含用于创建 rpi-hwup-image 镜像的配方。第二行告诉环境将 Mono 文件添加到镜像中。

我们现在已经有了镜像配方,准备开始“烘焙”。输入以下命令来构建镜像(确保您在构建目录中):

$ bitbake rpi-hwup-image-mono

此过程可能需要很长时间,具体取决于您的环境和互联网连接。它将首先解析所有配方,并确定需要从各个存储库下载哪些源代码。注意,即使我们在配方文件中只包含两个配方,这两个配方也代表了一个大量依赖项的层次结构。解析会遍历依赖项并确定需要下载的所有文件。它会下载源代码并将其缓存到本地。优点是后续可能需要源代码的构建无需再次连接到互联网即可获取。缺点是,根据您要构建的配方,可能会下载并存储大量文件。在此构建过程之后,我们的 ~/rpi 文件夹增长到 21GB。这代表了即使是最小的构建所需的存储量。

上图显示了创建自定义Linux镜像时终端上应显示内容的示例。

当过程成功完成后,您可以在 ~/rpi/build/tmp/deploy/images/raspberrypi 目录中找到所需的引导文件。此文件夹中的文件比引导开发板所需的文件多得多。构建过程会创建一个 SD 卡镜像文件,可以直接写入 SD 卡。这使得创建可引导 SD 卡比其他 BSP 更容易。SD 卡镜像文件是 rpi-hwup-image-mono-raspberrypi.rpi-sdimg。

使用以下命令将镜像文件复制到 SD 卡。请务必将“sdc”替换为您的 SD 卡挂载的设备(可能是 sda 或 sdb 等)。请务必获取正确的设备(您不想擦除错误的驱动器)。

$ umount /dev/sdc1
$ umount /dev/sdc2
$ sudo dd if=~/rpi/build/tmp/deploy/images/raspberrypi/rpi-hwup-image-mono-raspberrypi.rpi-sdimg of=/dev/sdc bs=1M

现在我们已准备好从 SD 卡启动。弹出卡并将其插入树莓派。接通电源并等待系统启动。如果构建成功,SD 卡将引导至一个类似的登录界面

Poky (Yocto Project Reference Distro) 1.6.2 raspberrypi /dev/tty1

raspberrypi login:

使用“root”作为用户名登录,您应该可以访问 shell。现在键入以下命令以确定 Mono 是否设置正确

# mono --version

它应该显示类似以下内容:

Mono JIT compiler version 3.4.0 (tarball Sat Nov  8 10:52:14 MST 2014)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
        TLS:           __thread
        SIGSEGV:       normal
        Notifications: epoll
        Architecture:  armel,vfp
        Disabled:      none
        Misc:          softdebug
        LLVM:          supported, not enabled.
        GC:            sgen

由于我们在镜像中包含了mono-helloworld配方,您应该能够运行以下命令:

# mono /usr/lib/helloworld/helloworld.exe

如果控制台打印出“HelloWorld”,那么您就成功地在开发板上运行了一个.NET应用程序。

历史

2014 年 11 月 9 日 - 首次提交

© . All rights reserved.