Linux + Xenomai实时操作系统创建方案

电子说

1.3w人已加入

描述

作者:Huster-ty

Xenomai是一种采用双内核机制的Linux 内核的强实时扩展。由于Linux 内核本身的实现方式和复杂度,使得Linux 本身不能使用于强实时应用。在双内核技术下,存在一个支持强实时的微内核,它与Linux 内核共同运行于硬件平台上,实时内核的优先级高于Linux 内核,它负责处理系统的实时任务,而Linux 则负责处理非实时任务,只有当实时内核不再有实时任务需要处理的时候,Linux内核才能得到运行的机会。所以Xenomai与传统Linux组成双内核以弥补Linux实时性差的缺陷。

准备内容
Linux源码:
Linux-4.9.24版本,下载地址:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/snapsho...

Xenomai源码:
xenomai-3.0.5版本,下载地址:https://gitlab.denx.de/Xenomai/xenomai/-/archive/master/xenomai-master.zip

3.0.5不是最新版本,读者可以尝试最新版本的xenomai。Xenomail官网:http://www.cs.ru.nl/lab/xenomai/

Ipipe补丁:
ipipe-core-4.9.24版本,下载地址:https://xenomai.org/downloads/ipipe/v4.x/arm/older/

打补丁是系统移植的关键点,所以Ipipe补丁最好与Linux版本号对应,我们在构建的过程中遇到的问题就会少很多。

开发板:
本次移植是基于创龙zynq7020开发板(ARM A9双核+FPGA),但是本教程也适用zynq7000系列的板子,可能某些操作不太一样,这就需要大家来验证了。

除了以上所必须的所需条件外,我们还需要安装Petalinux,(Petalinux是Xilinx公司推出的嵌入式Linux开发工具),这里不在详述Petalinux的安装,请读者自行解决。

以上内容都准好之后,我们就可以进行系统移植了。

在移植之前还要说一点,最好用开发板提供的liunx版本上构建xenomai,这样你就可以省去很多麻烦,比如U-BOOT.BIN文件、devicetree.dtb文件、根文件系统都不需要更新,只需要更新zImage文件就可以,但是前提你能找到和linux源码相对应的补丁。

给Linux源码打补丁
第一步Linux和xenomai源码解压
将他们解压到同一个文件夹中
tar -xzvf linux-xlnx-4.9.24.tar.gz
unzip xenomai-3.0.5.zip

同时我们在这个文件夹下建立一个patch文件夹来存放补丁,并把补丁拷贝进去

至此这个文件夹中有linux-xlnx-4.9.24、xenomai-3.0.5、patch三个文件夹

第二步开始打补丁

先进入xenomai源码目录,再打补丁
./scripts/prepare-kernel.sh --arch=arm --ipipe=../patch/ipipe-core-4.9.24-arm-2.patch --linux=/home/huster/Zynq/linux-4.9.24

其中prepare-kernel.sh为shell脚本,可以将相应版本的xenomai的补丁打到相应版本的内核源码包中,不过此处用的补丁是单独下载的,不是xenomai-3.0.5中自带的,可能有人会问,既然是单独补丁为什么不用 patch -p1

 

 

如果没有出现错误说明打补丁成功。

第三步内核配置

内核配置之前我们需要使能环境变量

在Petalinux目录下执行
./source settings.sh

(Petalinux为petalinux安装目录) ,才能使交叉编译工具链生效。使能之后,输入arm-后按两下Tab会出现很多编译工具,如下图

 

 

我们进入到linux-4.9.24内核目录,执行以下命令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig

 

 

 

可能这一步你会失败,因为linux源码中没有xilinx_zynq_defconfig这个配置文件,正常来说买开发板送的linux源码都会有这个文件,直接拷贝过来就可以,有一点需要注意,必须要拷到arch/arm/configs目录中,如果实在没有,我单独拷贝出来供大家下载了,链接: https://pan.baidu.com/s/1aefuY1kFx1AHM7EG5eGiIw

除此之外,我们还需要再menuconfig中进行一些自定义配置,这是个界面配置,在linux源码目录中执行以下命令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

我们可以看到xenomai的一些额外配置选项,还会看到一些警告

 

 

接下来我们要选中CPU Power Management—>CPU Frequence scaling,按下enter进入,按下N键静止这个选项;返回到主界面,选中Kernel Features—>Contiguous Memory Allocator,然后按下N键禁止,最后别忘了选中save进行保存。

Linux补丁内核编译
Linux内核编译

执行以下命令对补丁过的Linux内核进行编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage

(zImage中第二个单词字母为大写形式的i)

编译完成后,在Linux内核源码安装目录的”arch/arm/boot”路径下,会生成内核镜像文件zImage。

这个过程会很漫长,需要我们耐心等待,或者你可以打一局王者或吃把鸡。

设备树编译

如果你用的linux源码、xenomai源码、补丁以及开发板都和我的一样,那么这一步你可以不做,直接用开发板提供的devicetree.dtb就可以,否则你需要执行以下操作。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs

编译完成后,在linux内核安装目录的“arch/arm/boot/dts/”路径下,会生成很多的设备树文件,找到和你开发板相对应的即可。

U-BOOT编译

一般U-BOOT.BIN文件各个开发板公司已经提供好了,不需要我们自己去制作,这里只说下基本思路。首先要将U-BOOT源码解压,其次清理U-Boot,然后使能环境变量,然后配置U-Boot,然后编译U-Boot,最后基于Petalinux将编译生成的u-boot.elf和一级引导Bootloader程序zynq_fsbl.elf合并生成BOOT.BIN。

Xenomai安装
我们现在需要创建我们的Linux系统需要运行的Xenomai库和工具,先回到Xenomai源代码树,我们需要执行以下命令
./scripts/bootstrap

这将使Xenomai源准备好构建我们的工具和库,如果以上过程中提示要安装一些软件和库,我们只需要按照提示要求安装即可。

接下来进入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

继续执行命令
make DESTDIR=/home/huster/Zynq/xenomai-3.0.5/ install

编译完成后,会在xenomai源目录usr/xenomai中找到我们需要的bin工具文件夹和lib库文件。

注意上一条命令中,install前面有一个空格,而且install是命令不是文件夹,我之前在这里卡了好久,一直没有生成bin和lib文件夹。

然后直接将bin和lib目录中的文件直接拷贝到Linux根文件系统中的bin和lib目录下。如果你想直接将xenomai文件夹直接拷贝到linux根文件系统中的usr中也可以,只不过需要将
export LD_LIBRARY_PATH=/usr/xenomai/lib:$LD_LIBRARY_PATH

添加到~/.bashrc文件中
source ~/.bashrc

然后执行生效
echo $LD_LIBRARY_PATH

查看是否成功

xenomai运行测试
至此,我们已经得到linux镜像zImage文件、U-BOOT.BIN启动引导文件、rootfs根文件系统、devicetree.dtb设备树文件、FPGA的Z-7020.bit文件、以及lib库和工具。将上述文件拷到SD卡相应的存储区,按照烧写教程进行烧写,这里不在详述。

启动开发板,会发现与普通linux系统启动稍有不同。

 

 

系统启动之后,执行以下工具,运行延迟测试
./usr/xenomai/bin/latency

会打印出有关系统延迟的一些统计信息

 

 

说明xenomai系统移植成功,但是由于某种原因,我们的延迟是负的,这是令人困惑的,而且这是不正确的。后续将继续解决这个问题。

编辑:hfy


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分