为了在zynq嵌入式 Linux 环境中实现高实时性能,决定为zynq搭载一个xenomai,实现linux+xenomai双系统。
制作不易,记得三连哦,给我动力,持续更新中!!!
博客中完整工程文件下载:zynq搭载linux+xenomai双系统完整工程 (点击蓝色文字即可下载)
提取码:19w5
Zynq 搭建 Linux 和 Xenomai 双系统简介
在嵌入式系统开发中,实时性和系统丰富功能是两个关键需求。通过在 Xilinx Zynq 平台上同时运行 Linux 和 Xenomai,可以结合两者的优点,实现高性能和高实时性的应用。
什么是 Xenomai?
Xenomai 是一个为 Linux 提供实时扩展的框架,旨在使 Linux 能够满足严格的实时性要求。通过 Xenomai,可以在运行标准 Linux 应用程序的同时,保证关键任务的实时性能。
搭建步骤
1、环境准备
在开始之前,确保你的开发环境包含以下工具和资源:
- Vivado2021.2:用于创建和配置 FPGA 硬件设计。
- Petalinux2021.2:用于创建和配置 Linux 系统。
- ubuntu虚拟机:ubuntu18.04 版本。
- Xenomai 源码:可以从 Xenomai 官方网站下载。
- linux内核源码:可以从 linux 官方网站下载。
- ARM 交叉编译工具链:如
arm-linux-gnueabihf-gcc等
。
2、vivado硬件设计
- 创建 Vivado 工程:在 Vivado 中创建一个新的工程,根据自己的开发板配置zynq IP核,如UART、Ethernet、USB、DDR、SD等。
- 生成硬件描述文件 (.xsa):完成设计后,生成 bitstream 文件并导出硬件描述文件 (.xsa)。
3、Petalinux配置
- 创建 PetaLinux 工程:
petalinux-create -t project -n <project_name> --template zynq
- 导入硬件描述文件:
petalinux-config --get-hw-description=<path_to_xsa>
- 配置内核和根文件系统:
petalinux-config -c kernel
petalinux-config -c rootfs
选择合适的内核配置选项,并添加必要的包和库。
4、构建 Xenomai 内核
准备xenomai内核源码:
xenomai内核下载链接(本文章使用的):xenomai3.1内核源码
大家如果感觉3.1版本比较老的话,也可以通过xenomai官网去下载最新的内核镜像,操作步骤应该都一样,但是其他版本我没验证。
准备ipipe补丁
ipipe补丁下载链接(本文章使用的) :ipipe 4.9.24 arm 补丁下载
注意:xenomai 3.1以及以前的必须打ipipe补丁,xenomai3.2及以后的要打dovetail补丁
准备linux内核
linux4.9.24内核源码下载链接(本文章使用的):linux4.9.24内核源码下载
大家如果感觉4.9.24版本比较老的话,也可以通过linux官网去下载最新的内核镜像,操作步骤应该都一样,但是其他版本我没验证。
安装交叉编译工具链
// 更新包列表:
sudo apt-get update
//安装交叉编译工具链:
sudo apt-get install gcc-arm-linux-gnueabihf
现在所需要的源码和环境都已经准备就绪,接下就开始构建
1. 向linux内核打入补丁
通过xenomai内核源码的prepare-kernel.sh进行打补丁,这样可以保证打入补丁完整性并且可以避免一些错误
切换到xenomai内核源码路径,然后输入下面指令进入打补丁:
./scripts/prepare-kernel.sh --arch=arm --ipipe=<path_to_ipipe patch> --linux=<path_to_linux>
这里的 --linux
选项指定 Linux 内核源码目录,--arch
选项指定目标架构,--ipipe
选项指定 Xenomai 的 I-pipe 补丁文件。
2. 加载zynq配置文件
因为咱们最终要在zynq上进行使用,所以需要加载为 ARM 架构的 Xilinx Zynq 平台生成默认的 Linux 内核配置文件。
配置文件下载链接(本文章使用的):zynq linux配置文件下载
需要先把是这个配置文件放到内核的 /linux-4.9.24/arch/arm/configs里面
切换到linux内核源码路径,然后输入下面指令加载zynq配置文件:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig
make
:调用 GNU Make 工具来执行编译
ARCH=arm
:指定目标架构为 ARM
CROSS_COMPILE=arm-linux-gnueabihf-
:指定交叉编译工具链的前缀
xilinx_zynq_defconfig
:指定使用xilinx_zynq
的默认配置文件
3. 内核配置
除此之外,我们还需要再menuconfig中进行一些自定义配置,这是个界面配置,类似于petalinux-config - kernel
切换到linux内核源码路径,然后输入下面指令进入配置界面:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
xenomai非常良心,把一些需要关闭的配置都已经给你列出来了,只需要根据他的警告来对应的配置即可
需要关闭的有:
CPU Power Management --->
CPU Frequency scaling --->
[] CPU Frequency scaling
CPU Idle --->
[] CPU idle PM support
Memory Management options --->
[ ] Allow for memory compaction
然后警告就会消失了,记得要保存配置
4. 编译内核
配置的信息都已经配置完了,接下里需要编译内核,生成可以供u-boot加载的uImage文件
切换到linux内核源码路径,然后输入下面指令编译内核:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage
此指令编译出来的是zImage,还需要通过u-boot-tools来进行转化
// 安装u-boot-tools
sudo apt-get install u-boot-tools
zImage转化为uImage:
mkimage -A arm -O linux -T kernel -C none -a 0x00200000 -e 0x00200000 -n "Linux-4.9.24" -d arch/arm/boot/zImage arch/arm/boot/uImage
转换完成之后会在/linux-4.9.24/arch/arm/boot 里面生成uImage内核镜像
5. 编译xenomai
创建我们的Linux系统需要运行的Xenomai库和工具,切换到xenomai目录
./scripts/bootstrap
开始编译xenomai
./configure CFLAGS="-march=armv7-a -mfpu=vfp3 -mfloat-abi=hard" LDFLAGS="-march=armv7-a" --build=i686-pc-linux-gnu --host=arm-none-linux-gnueabi --with-core=cobalt --enable-smp --enable-tls CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld
./configure
:运行配置脚本,准备编译环境。CFLAGS
和LDFLAGS
:设置编译器和链接器选项,指定目标架构为 ARMv7-A,并使用硬浮点运算单元。--build
和--host
:指定构建系统为 i686 架构的 Linux 系统,目标系统为 ARM 架构的 Linux 系统。--with-core=cobalt
:使用 Xenomai 的 Cobalt 实时核心。--enable-smp
:启用多处理器支持。--enable-tls
:启用线程局部存储支持。CC
和LD
:指定使用交叉编译工具链中的 GCC 编译器和链接器。
创建xenomai
make -j$(nproc) DESTDIR=`pwd`/build-arm install
此时即可在build-arm目录下找到xenomai编译后的相关库及可执行文件。
5、启动系统
制作一个SD卡,然后分为两个区,
FAT32:BOOT.bin,boot.scr,uImage(上面生成的)
EXT4:解压rootfs.tar.gz
然后把生成的xenomai文件夹及里面的内容复制到根文件系统的/usr下面
把zynq开发板设置为SD卡启动,用户名和密码都是root
启动开发板后,会发现和petalinux启动起来不太一样
然后再/usr/目录下面会发现,xenomai相关的目录
6、测试
运行测试程序之前需要把xenomai目录添加到环境变量:
使用vim打开/etc/profile,添加xenomai环境变量如下:
vim /etc/profile
在末尾添加以下内容
export PATH$PATH:/usr/xenomai/bin:/usr/xenomai/1ib/:/usr/xenomai/sbin
执行如下指令使能全局变量即可。
source /etc/profile
xenomai运行需要root权限,因为我是通过root用户登录的,故执行如下指令即可测试xenomai实时性。
cd /usr/xenomai/bin
./latency
lat min: 最小延迟时间。
lat avg: 平均延迟时间。
lat max: 最大延迟时间。
overrun: 超时次数(任务未能在周期内完成的次数)。
msw: 模式切换次数(Mode Switches),通常是从用户态切换到内核态的次数。
lat best: 最佳延迟时间(整个测试期间的最小值)。
lat worst: 最差延迟时间(整个测试期间的最大值)
这是通过优化后的结果,下一期将具体讲解如何对实时内核进行自动调优。
博客中完整工程文件下载:zynq搭载linux+xenomai双系统完整工程 (点击蓝色文字即可下载)
如果感觉文章对您有用,麻烦三连支持一下,方便下次用到的时候,就可以快速找到我,非常感谢您的支持!!!