Zynq UltraScale+ MPSoC上构建xenomai

1 使用petalinux工具构建工程

在安装完petalinux工具后,执行

source settings.sh

构建全局环境变量后,发现已安装的交叉编译器只有aarch64-none-,没有aarch64-linux-;阅读settings.sh可以看到交叉编译器安装目录如下图所示。
在这里插入图片描述
进入该目录后发现其并不完整。因此需将其填充完整。

建议直接从 linaro 的官网下载相应版本的 gcc-linaro 交叉编译工具,并直接选择带有二进制的文件,即在官网入口处选择 binaries 路径,该文件夹下面包含各种版本的已经编译好的 aarch64-linux-gnu-gcc 二进制可执行程序。
在这里插入图片描述
下载完并解压后,将bin目录下的可执行文件复制到上一步路径下的bin目录即可,最后再执行一遍

source settings.sh

此时可以发现交叉编译工具链aarch64-linux-已添加进环境变量。
在这里插入图片描述

2 创建petalinux工程并使用本地编译

  1. 将使用vitis生成的.xsa硬件描述文件添加到ubuntu下。
    在这里插入图片描述
  2. 执行如下指令创建petalinux工程。

petalinux-create -t project --template zynqMP -n xenomai_zynqmp

  1. xilinx的github网站下载linux源码与uboot源码,版本最好与petalinux的版本保持一致,下载完成后拷贝到ubuntu并进行解压,这里我下载的是

u-boot-xlnx-xilinx-v2022.2.zip
linux-xlnx-xilinx-v2022.2.zip

  1. 进入xenomai_zynqmp目录,执行如下指令进行硬件描述文件的导入及本地内核编译设置

petalinux-config --get-hw-description ~/work/xsa/
后面的xsa文件路径替换成自己的

  1. 设置uboot源码的路径,选择“Linux Components Selection —>u-boot —> ext-local-src”选顷。在“External u-boot local source settings —> ”添加解压缩后的uboot源码路径在这里插入图片描述
  2. 设置linux内核源码的路径,选择“Linux Components Selection —>linux-kernel —> ext-local-src”选顷。在“External u-boot local source settings —> ”添加解压缩后的linux内核源码路径
    在这里插入图片描述
  3. 保存后退出。

3 对linux内核打实时补丁及xenomai编译

对5.4及以前版本的内核需要打ipipe补丁,而5.4以上版本的内核则需要使用dovetail补丁,
进入linux内核源码路径,打开Makefile可以查看内核版本。

在这里插入图片描述

3.1安装补丁文件

  1. 这里的内核版本为5.15,去到补丁下载官网下载对应版本的dovetail补丁。在这里插入图片描述
  2. 准备xenomai内核源码,xenomai官网下载链接。

注意:这里需要下载3.2版本的xenomai,3.2以前的版本不支持devotail补丁。

在这里插入图片描述

  1. 向linux内核打入补丁

进入补丁包下载目录,将其解压:

$ cd /home/luo/linux
$ bzip2 -d patch-5.15-dovetail2.patch.bz2

而后进入Linux目录,打入补丁:

$ cd /home/luo/work/linux/linux-xlnx-xilinx-v2022.2/
$ patch -p1 < ../patch-5.15-dovetail2.patch
  1. 添加xenomai内核

进入xenomai下载目录将其解压:

$ cd /home/luo/work/linux
$ tar -vxf xenomai-stable-v3.2.x.tar

进入xenomai源码目录xenomai-stable-v3.2.x/scripts,使用脚本prepare-kernel.shlinux内核源码打cobalt内核补丁:

$ cd /home/luo/work/xenomai-stable-v3.2.x
$ ./prepare-kernel.sh --linux=/home/luo/work/linux/linux-xlnx-xilinx-v2022.2 --arch=arm64 --outpatch=/home/luo/work/linux/cobalt-core-3.2.x-linux5.15.0.patch

执行上述指令后会在/home/luo/work/linux/目录下生成了cobalt-core-3.2.x-linux5.15.0.patch的补丁。

–linux 用于指定linux内核源码路径
–arch 用于指定硬件架构,arm arm64 x86_64
–devotail 用于指定补丁包,若已在linux内核中打过补丁则不用再指定

进入linux目录,添加cobalt内核补丁:

$ cd /home/luo/work/linux/linux-xlnx-xilinx-v2022.2
$ patch -p1 < ../cobalt-core-3.2.x-linux5.15.0.patch

3.2配置及编译linux内核

  1. 配置linux内核
$ petalinux -c kernel

进入menuconfig配置界面会看到xenomai选项有如下警告信息:

 *** WARNING! Page migration (CONFIG_MIGRATION) may increase *** 
 *** latency. ***                                                         
 *** WARNING! At least one of APM, CPU frequency scaling, ACPI 'processor' ***
 *** or CPU idle features is enabled. Any of these options may ***     
 *** cause troubles with Xenomai. You should disable them. ***      

消除该警告信息需做如下配置:

CPU Power Management --->
	CPU Frequency scaling  --->
		[] CPU Frequency scaling
	CPU Idle  --->
		[] CPU idle PM support

Memory Management options  --->
	[ ] Contiguous Memory Allocator
	[ ] Transparent Hugepage Support
	[ ] Allow for memory compaction
	[ ] Page migration 

修改完配置后可发现警告均已消失,保存退出即可。

  1. 编译内核

执行如下指令编译内核:

$ petalinux-build

执行如下指令生成BOOT.bin文件,由于我这里没有使用bit流文件,故无需加入–fpga参数:

$ petalinux-package --boot --u-boot --fsbl --force

执行完上述指令后,即可在image目录下查看到生成的启动文件及镜像文件,将BOOT.bin、boot.scr 及 image.ub 三个文件拷贝到格式化的 SD 卡中,然后弹出 SD 卡,插入开发板运行即可。Linux启动过程中可发现与xenomai相关的启动项。
在这里插入图片描述

在这里插入图片描述

3.3 编译安装xenomai库

由于在ubuntu20.04上进行xenomai源码的编译一直出现一些奇怪的问题,换到ubuntu18.04上进行编译后就一切正常,故以下过程均在ubuntu18.04上进行。

$ cd ~/work/linux/xenomai-stable-v3.2.x

$ ./scripts/bootstrap

$ ./configure CFLAGS="-mtune=cortex-a53" LDFLAGS="-mtune=cortex-a53" --build=i686-pc-linux-gnu --host=aarch64-linux-gnu --with-core=cobalt --enable-smp CC=aarch64-linux-gnu-gcc LD=aarch64-linux-gnu-ld

其中编译器指定为aarch64-linux-gnu-gcc, 链接器指定为aarch64-linux-gnu-ld。执行上述过程可能会出现如下错误:

$ checking whether the registry should be enabled... no
$ ./configure: line 10641: syntax error near unexpected token `FUSE,'
$ ./configure: line 10641: `	PKG_CHECK_MODULES(FUSE, fuse)'

解决方法,需要添加如下组件:

$ sudo apt-get install fuse
$ sudo apt install debhelper findutils autotools-dev autoconf automake libtool pkg-config libltdl-dev

添加完成后重新执行上述步骤即可。

创建一个目录用于存放xenomai库。

$ mkdir build

编译安装到该目录

$ make -j$(nproc) DESTDIR=`pwd`/build-arm install

此时即可在该目录下找到xenomai编译后的相关库及可执行文件。
在这里插入图片描述

4 配置环境变量

将xenomai目录下所有文件通过ssh发送至开发板/usr目录下。
使用vim打开/etc/profile,添加xenomai环境变量如下:
在这里插入图片描述

执行如下指令使能全局变量即可。

$ source /etc/profile

xenomai运行需要root权限,故执行如下指令即可测试xenomai实时性。

$ sudo su

$ cd /usr/xenomai/bin

$ ./latency

执行结果如下:
在这里插入图片描述

这是在无负载且未作任何优化的情况下的测试结果,后续会单独写一篇文章进行压力测试及实时性能的优化。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐