Polarfire SoC FPGA Icicle套件的Yocto Linux BSP入门

原文链接:Getting Started with the Yocto Linux BSP for Polarfire SoC FPGA Icicle Kit 由Jean-Luc Aufranc撰写。
本文共计4900字,预计阅读13分钟

上个月我收到了微芯(MicrochipPolarFire SoC FPGA Icicle 开发套件,该套件的一大特点是 PolarFire SoC FPGA 具有 5 核 64 位 RISC-V CPU 子系统和一个 254K LE 的 FPGA,并被加载到了基于 OpenEmbedded 的预装 Linux 操作系统中。

本文我将展示如何快速使用 Yocto BSP 并运行 EEMBC CoreMark 基准测试,并且我还会在几周内评测这块带有Libero SoC 设计套件的FPGA。

PolarFire SoC FPGA支持的操作系统

我最初的想法是将这部分评测集中在 Linux 的 RISC-V 状态、检查一些系统信息、运行一些基准测试(例如 SBC-Bench)、编译 Linux 内核以及安装诸如 LEMP 堆栈(如:Linux、Nginx(发音为 Engine-X)、MySQL、PHP)之类可以用于WordPress 托管的服务。随后我又查看了 Microchip PolarFire SoC FPGA 支持的操作系统。

Polarfire SoC FPGA操作系统
Polarfire SoC FPGA操作系统

查看之后,我了解到Microchip 支持 Yocto Linux BSP 和 Buidlroot Linux BSP,以及 Siemens Embedded 和 WindRiver 等第三方嵌入式的 Linux 发行版。据说 FreeBSD 即将推出,并且可能会有几个实时操作系统用于 SoC 的小型 64 位 RISC-V 内核。

这意味着除了我计划使用的一些工具之外,没有包管理器和基于 Debian 的根文件系统了。因此,虽然从理论上讲,仍有可能实现我打算做的事情,但我实在没有那么多时间来实现这一目标了,所以我缩小了我的评测范围。我根据从镜像构建 Yocto 镜像的经验,交叉编译了 hello world,同时进行本地编译和运行 EEMBC 基准测试。这其实不是我第一次上手Yocto 项目了,但我仍然学到了一些东西,希望你们也能从中有所收获。

网络服务器演示和电压/电流分析

在开发 Yocto BSP 之前,根据 Microchip 的入门指南我将开发板连接到了以太网,并运行网络服务器。


运行后,我们可以访问一个网页,该网页将显示 VDDA(XCVR Tx/Rx 通道电源)、VDD25(PLL 和 PNVM 电源)、VDDA25(XCVR PLL 电源)和 VDD(内核电源)的电压和电流,方法是访问 http:/ /<board_ip_address>。

Icicle Kit电压电流分析
Icicle Kit电压电流分析

我想一旦我们运行了 EEMBC CoreMark 基准测试,重新访问此页面应该会很有趣。

Yocto Linux BSP

接着我们按照Github上的说明使用 Yocto BSP 构建 Linux 。作为参考,我使用的是运行 Ubuntu 20.04 的笔记本电脑。在此我需要更改一些命令。

首先,我们安装 repo 函数:


然后安装一些依赖项:


初始化 repo 的时间:


现在我们可以修改设置文件:


在开始构建前,要运行以下命令:


我记得大约 10 年前,Yocto 构建系统可能需要花大量的时间,在低端笔记本电脑上构建镜像甚至要超过 24 小时。而且在默认设置下,我由 8 核 AMD Ryzen 7 2700U 处理器驱动并配备了 16 GB RAM的笔记本电脑,在 50 多的 CPU 负载下运行都由很快变得极其慢甚至无法使用:

Polarfire Icicle构建Yocto系统
Polarfire Icicle构建Yocto系统

我构建之后就去吃饭然后上床睡觉了。但我没有检查存储需求,大约两个小时后,由于硬盘空间不足,构建就停止了。正如我们看到的,要构建完成,大约需要100 GB的可用存储空间。

Libero SoC的存储需求
Libero SoC的存储需求

接着我们来讨论系统要求,Libero SoC 设计套件需要大约 35 GB 的额外空间,而 PolarFire SoC 开发至少需要 16 GB RAM。因此,你们需要一个功能强大的工作站来在 PolarFire SoC FPGA Icicle 开发套件上开发应用程序,并具需要有足够的 RAM 和足够的存储空间。

回到我们的 Yocto 构建。理想的情况是拥有一个专用的构建服务器,但如果你打算在构建的同时使用计算机,你可能就需要编辑 [your_yocto_build_dir]/conf/local.conf


然后,按照如下操作


另一种方法是使用 Ctrl-Z 暂停构建,其工作方式与 Ctrl-C 类似,但使用SIGTSTP而不是 SIGINT 来暂停进程,记住是暂停而不是终止它。


由于 bitbake 产生了许多其他进程,我们必须等待它们完成,大约需要 10 分钟才能恢复使用普通计算机。

我将构建进程暂停了大约 3 个小时,然后可以使用命令“fg”恢复它。这就像终端程序的休眠模式,它一直存在。然而要么是我忘记了它,要么自己从未使用过。,所以几经折腾之后,在我的机器上完成构建大约花了 7 到 8 小时。

这是 Yocto BSP 使用的空间:


我们可以在tmp-glibc/deploy/images/icicle-kit-es/文件夹中找到镜像:


未压缩的镜像有 5.5GB,因此 8GB SD 卡是够使用的。但我建议使用 16GB 或 32GB 卡。下面是 Microchip 提供的将其闪存到 SD 卡的命令:


如果你想要验证镜像,像USBImager这样的实用程序将是首选。这就是我用来将镜像烧写到 32GB SD 卡的方法,然后我将其插入开发板的 SD 卡插槽中进行试用。

我们中断启动来检查一下是否能检测到 SD 卡:


一切正常了,我们继续,但它无法切换到内核。最终我使用了未压缩的二进制文件重新刷新镜像,然后我就可以登录到终端:


rootfs 没有自动调整大小,似乎是因为 GPT 表有问题。我不太确定这一步发生了什么。但是由于我们的自建镜像正在运行,而且我们有一个 eMMC 闪存,我就闪存到了内部存储。

将板子断电,取出SD卡,用Bootterm连接ttyUSB0,访问HSS终端:


在重新启动开发板之前,中断启动,然后输入“usbdmsc”将 eMMC 闪存作为 USB 大容量存储开放给我们的 Ubuntu 笔记本电脑。


注意,在这里我们需要另一根连接到 J16 Micro USB 端口的 Micro USB 电缆才能在 Ubuntu 中查看烧录过程。

PolarFire SoC FPGA Icicle Kit
PolarFire SoC FPGA Icicle Kit
PolarFire Icicle的eMMC、USB、闪存和驱动
PolarFire Icicle的eMMC、USB、闪存和驱动

我们可以像对 SD 卡那样在烧录镜像之前卸载 Boot 和 root 分区。我先尝试使用 gz 镜像,但我遇到了与 SD 卡相同的问题,即使在 PC 上也无法安装root分区,因此我就使用未压缩的镜像了,之后一切顺利。

Flash eMMC PolarFire FPGA SoC Icicle
Flash eMMC PolarFire FPGA SoC Icicle

完成后,我们就可以拔掉连接到 J16 的 micro USB 电缆,并访问我们的 Linux 镜像。

小标题:Hello World 交叉编译

接下来,我们尝试交叉编译的 Hello World 程序。


对于使用 Yocto 工具链的 RISC-V,我们要首先将其添加到我们的路径中:


并使用 RISCV GCC 工具来构建它:


糟糕,它并没有按预期工作。看起来是因为工具链没有正确安装,或者是因为我使用了错误的工具链。我尝试过使用 CFLAGS,但还是没有成功。也许它只能在 Yocto/Bitbake 框架中工作。根据我以往对 buildroot 的经验,交叉编译工具链是可以开箱即用的。

EEMBC CoreMark 基准

所以我将在本地构建 EEMBC CoreMark,即直接在板上构建。我们构建的镜像带有 git 和 GNU GCC 工具链,所以它应该很简单。


这一操作可以构建和运行 CoreMark 并生成两个文件

  • run1.log

  • run2.log


由于 RISC-V 内核以 600 MHz 运行,该板获得了 1339.136257 的分数,大约 2.23 CoreMark/MHz。但是Microchip 报告板上显示有3.25 CoreMark/MHz。让我们与Microchip公司使用相同的配置再试一次:


这是 run1.log 的内容:


不知何故,CoreMark 的分数找不到了,但我们仍然可以看到其迭代次数/秒从 1341.651573 达到了 1666。由此看来新配置确实有所提高了。很容易看出为什么分数没有显示了,我们也可以看看代码:


我们用 -DHAS_FLOAT=1 重复这个过程。


这次看起来是正确的:


但这只有 2.59 CoreMark/Mhz,还没有达到 3.125 CoreMark/MHz。实际上,它是使用无符号索引的,而且符合Microchip的结果。有人也尝试做了同样的事情,并被很多人建议更改posix/core_portme.h 中的代码以使用签名索引:


再次运行基准测试后,得分更高:


1789.159376 CoreMark 对应的大约是 2.98 CoreMark/MHz。接下来通过在 make 命令行中定义 HAS_FLOAT=0 来做最后的破解。结果:


看看我们使用 Iterations/Sec 的结果:1875 作为 CoreMark 1.0 的数值。在这种情况下,我们确实可以达到 3.125 CoreMark/MHz,就像 Microchip 使用带符号索引所做的那样。但是为什么有符号比无符号快得多,我不太确定。我们需要查看一下程序集,并检查每条指令的周期数才能找出答案。

这次测试过程真实地展示了如何调整/操纵基准以获得更好的结果,以及编译标志对优化代码的重要性。电压/电流分析网页在测试期间没有显示任何显著变化。

这就是本文评测的全部内容,之后,我可能会发布一些 FPGA 部分的内容。有人让我通过 PCI-e 总线评估 virt-io,但由于时间限制,我就没有这样做。因为有人说Microchip应该可以工作,我还咨询了他们,但他们到目前为止并没有测试过。

如果你们对该板感兴趣,可以从各种分销商处购买,价格应该不到 500 美元。

分享这篇文章
订阅评论
提醒
0 评论
内联反馈
查看所有评论