xenomai3.1+linux构建linux实时操作系统-基于X86_64和arm

原创 Linux阅码场 2022-04-19 08:00

作者简介

顺刚(网名:沐多),一线码农,从事工控行业,目前在一家工业自动化公司从事工业实时现场总线开发工作,喜欢钻研Linux内核及xenomai,个人博客 wsg1100,欢迎大家关注!



阅码场付费会员专业交流群

会员招募:各专业群会员费为88元/季度,权益包含群内提问,线下活动8折,全年不定期群技术分享(普通用户直播免费,分享后每次点播价为19元/次),有意加入请私信客服小月(小月微信号:linuxer2016)


专业群介绍:

彭伟林-阅码场内核性能与稳定性
本群定位内核性能与稳定性技术交流,覆盖云/网/车/机/芯领域资深内核专家,由阅码场资深讲师彭伟林主持。


甄建勇-Perf Monitor&Perf Counter

本群定位Perf、cache和CPU架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师甄建勇主持。


邓世强-Xenomai与实时优化

本群定位Xenomai与实时优化技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师邓世强和彭伟林共同主持。


周贺贺-Tee和ARM架构

本群定位Tee和ARM架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师周贺贺主持。


谢欢-Linux tracers

本群定位Linux tracers技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师谢欢主持。


目录

  • 一、概要

  • 二、环境准备

    • 1.1 安装内核编译工具

    • 1.2 准备内核及补丁文件

  • 三、内核安装流程

    • a) 编译构建xenomai内核debian安装包

    • b) 分步编译内核并安装

    • 3.4.1 ipipe xenomai 内核配置

    • 3.4.2 dovetail xenomai 内核配置

    • 3.1 打ipipe补丁

    • 3.2 打dovetail补丁

    • 3.3 添加xenomai内核

    • 3.4 xenomai 内核配置

    • 3.5 内核编译与安装

  • 四、安装xenomai库

    • a) 编译构建xenomai库debian安装包

    • b) 分步编译安装xenomai库

    • 4.1 编译安装实时库libcobalt

  • 五、X86 平台xenomai实时性测试

  • 六、arm架构安装xenomai

  • 七、ARM 平台xenomai实时性测试

    • 7.1 IRQ-timer handler

    • 7.2 内核态任务

    • 7.3 用户态任务

  • 八、arm64架构安装xenomai

  • 参考链接:


最近接触实时系统Xenomai,该文章整理记录X86 ubuntu环境下xenomai 内核编译、xenomai应用环境搭建步骤,其他硬件架构(如arm、arm64)类似,先在X86上安装好环境才能更好的开发验证xenomai程序吧,更多信息见文末参考链接,希望对你有所帮助。


一、概要


xenomai是众多inux实时性解决方案中的一种,通过在linux的基础上添加一个RTOS内核cobalt,来提高linux的实时性。实时内核cobalt与非实时内核linux相结合,既能提供工业级RTOS的硬实时性能,又能利用linux操作系统非常出色的网络和图形界面服务,在产品的开发周期和成本控制方面都有巨大优势,结构如下:



主要有3部分,xenomai的移植构建也是围绕这三部分来进行:

  1. 用户空间中的实时应用程序库libcobalt;

  2. 内核空间中的实时内核Cobalt;

  3. 硬件架构与Linux内核版本相关层 ipipe-core或dovetail。


libcobalt和Cobalt的源码随xenomai更新,位于同一源码包内,ipipe-core和dovetail则与硬件架构和具体linux版本相关,以补丁的方式提供,需要单独下载;

由于一些ipipe维护困难的关系,从linux5.4以上版本不再提供ipipe,ipipe由dovetail替代。

所以如果你的linux内核版本在5.4以上版本的话需要使用dovetail。

总的来说,ipipe-core和dovetail实现必要功能的同时,也是xenomai与硬件架构、linux版本间的解耦层,社区提供了常见架构下各linux版本的补丁。xenomai的移植步骤如下:

  1. 准备好ipip-core或dovetail补丁,对linux5.4以下版本使用ipipe-core,linux5.4以上版本需要dovetail替代。

  2. 打cobalt内核补丁,编译构建内核。

  3. libcobalt库编译安装,设置环境变量。


步骤1中的源码文件也可直接从xenomai维护分支直接拉取,直接对拉取的代码进行步骤2、3即可。


  • ipip-core:

ARM: https://xenomai.org/gitlab/ipipe-arm

ARM64: https://xenomai.org/gitlab/ipipe-arm64

PPC32: https://xenomai.org/gitlab/ipipe-ppc32

x86: https://xenomai.org/gitlab/ipipe-x86


  • dovetail:

https://source.denx.de/Xenomai/linux-dovetail

可以看到dovetail已经不区分ARM、X86了,dovetail区别与ipipe,ipipe是与linux中断管理分离,linux中断管理在其之上,ipipe部分需要大量直接对接arch部分的代码,这样主线内核代码的不断变化会导致社区开发人员需要对每个linux主线版本做适配和支持,这也就是为什么我们在构建xenomai系统时需要ipipe与linux版本匹配的原因,同时也可以看到,ipipe支持的版本总是落后于linux主线版本(大家应该联想到逐步合入主线的PREEMT-RT了吧)。

dovetail区别与ipipe,它是在已有linux中断管理代码上进行扩展,为实时核提供与ipipe相同的功能,这样可以随着主线发展,与架构相关的代码大大减少,大大降低了社区维护工作量,同时linux主线稳定版本确定后能第一时间进行支持,对它们的对比介绍详情可见xenomai官网和EVL project。


二、环境准备


2.1 安装内核编译工具


编译Linux内核需要的工具包如下,可能不全,可根据编译时的错误提示安装缺少的工具。


 sudo apt-get install gcc libncurses-dev flex bison openssl-dev libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev build-dep


2.2 准备内核及补丁文件


内核:下载linux源码,linux内核源码网址:https://www.kernel.org/。


对于需要使用ipipe补丁文件的内核版本:下载与linux版本对应的ipipe-core补丁,最好先浏览https://xenomai.org/downloads/ipipe/v4.x/看xenomai提供了哪些linux版本的补丁,再去下载对应linux内核源码。


对于5.4以上的内核版本:https://xenomai.org/downloads/dovetail/?C=M;O=A 中选取对应内核版本的dovetail补丁。


xenomai内核源码包:到xenomai官网 下载最新xenomai源码包。

对于ipipe,本文选用以下版本作为示例:


linux kernel:linux-4.19.114.tar.xz
ipip-core:ipipe-core-4.19.114-cip24-x86-12.patch
xenomai:xenomai-3.1.tar.bz2


一般来说,如果没有找到与你使用的内核版本一致的ipipe-core补丁,linux相近版本linux-4.19.zzz,只要版本zzz跨度不大,也可使用相近的补丁代替,但是不能保证与指定版本一致,可能有bug,若对xenomai地层不熟悉,用于生产环境最好还是指定版本。


对于dovetail,由于使用的ubuntu环境内核为linux 5.13,使用社区的维护的dovetail 5.13分支(或者读者下载内核源码和与之匹配的dovetail补丁也是可以的,这里只是示例,不建议使用5.13,详见3.2 打dovetail补丁小节),示例如下:


linux kernel:linux-5.13.0.tar.xz
dovetail:patch-5.13-dovetail1.patch
xenomai:xenomai-3.2.1.tar.bz2

说明:笔者将上面的文件,统一放到了/home/work/xenomai(家目录~)目录下。文中涉及绝对路径时,还请读者注意。


三、内核安装流程


3.1 打ipipe补丁


设置针对5.4版本以下内核使用ipipe的配置示例,如果你使用的是dovetail请看3.2小结。

解压linux内核源码:


$tar -xvf linux-4.19.114.tar.xz


进入linux内核源码目录打ipipe补丁:


$cd linux-4.19.114
$patch -p1 < ../ipipe-core-4.19.114-cip24-x86-12.patch


3.2 打dovetail补丁


先克隆社区dovetail仓库:


git clone https://source.denx.de/Xenomai/linux-dovetail.git


切换到5.13分支:


git chech v5.13-dovetail-rebase

注:对于5.13只有v5.13-dovetail-rebase分支,表示未经过测试,最好选择不带rebase的版本,否则编译等都有问题


这样就可以了,等会在该仓库进行xenomai内核编译。

或者与3.1一样,下载内核源码与之对应的dovetail补丁https://xenomai.org/downloads/dovetail/patch-5.13-dovetail1.patch.bz2,进行:


解压linux内核源码:

注:这里使用的ubuntu发新版内核。


$tar -xvf linux-source-5.13.tar.bz2


进入linux内核源码目录打ipipe补丁:


$cd linux-5.13
$patch -p1 < ../patch-5.10.76-dovetail1.patch


3.3 添加xenomai内核


解压xenomai源码包:


$tar -xvf xenomai-3.1.tar.bz2


进入xenomai源码目录xenomai-3.1/scripts,使用脚本prepare-kernel.sh对linux内核源码打cobalt内核补丁;


$cd xenomai-3.0.8/scripts


脚本prepare-kernel.sh使用帮助如下:


$ ./prepare-kernel.sh --help
usage: prepare-kernel --linux= --ipipe= [--arch=] [--outpatch= [--filterkvers=y|n] [--filterarch=y|n]] [--forcelink] [--default] [--verbose]


其中主要参数为:

--linux=指定linux源码的绝对路径;

--ipipe=指定ipipe补丁。如果已经手动对linux源码打ipipe补丁,则不需要指定该参数。

--arch=指定硬件架构,x86_64、arm、arm64

outpatch=指定输出xenomai patch(绝对路径)。默认情况下如果不使用该参数,prepare-kernel.sh打cobalt内核补丁时,只会在linux源码目录建立与cobalt源码的软连接文件,这样的话,如果xenomai源码移动了就会有很多问题,所以推荐使用该参数生成xenomai内核的补丁,再去对linux使用该补丁。这样linux源码内的cobalt内核相关源码文件就不是链接文件了,今后再次构建时也直接使用该补丁,省事。


我们在上一个步骤已经对linux源码打了ipipe补丁,这里就只使用prepare-kernel.sh生成cobalt内核的补丁cobalt-core-3.1-4.19.114.patch,再对linux内核源码使用该补丁。


$./prepare-kernel.sh --linux=/home/work/xenomai/linux-4.19.114 --arch=x86_64 --outpatch=/home/work/xenomai/cobalt-core-3.1-4.19.114.patch


回到linux源码目录使用补丁:


$cd /home/work/xenomai/linux-4.19.114
$patch -p1 < ../cobalt-core-3.1-4.19.114.patch


到此,内核源码已经制作完毕。下面开始配置编译内核。


3.4 xenomai 内核配置


xenomai基于linux,xenomai作为一个小的实时核存在,许多硬件配置是linux 驱动掌管的,比如内存、电源管理,所以必须让linux配置好,给xenomai提供一个好的软硬件环境。


3.4.1 ipipe xenomai 内核配置


设置针对5.4版本以下内核使用ipipe的配置示例,如果你使用的是dovetail请看3.4.2小结。

这里示范使用的是内核默认的x86_64_deconfig文件。

注意:使用默认config文件,会包很多无用的驱动,编译会占用很多时间,然而裁剪驱动需要对内核各模块熟悉,且需要大量时间。对于新手来说,快捷的办法是找一个发行版(如Ubuntu),从相近版本内核安装包中提取config文件,在该config基础上进行xenomai配置,这样比较好。


$makeolddefconfig
$make menuconfig


进入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. ***


依次进行如下配置:


General setup  --->
Preemption Model (Preemptible Kernel (Low-Latency Desktop)) --->
(X) Low-Latency Desktop
(-xeno-3.2.1)Local version - append to kernel release

Processor type and features --->
Processor family (Core 2/newer Xeon) --->
(X) Core 2/newer Xeon
[*] Multi-core scheduler support [ ] CPU core priorities scheduler support

Power management and ACPI options --->
CPU Frequency scaling --->
[ ] CPU Frequency scaling
[*] ACPI (Advanced Configuration and Power Interface) Support --->
< > Processor
CPU Idle --->
[ ] CPU idle PM support

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

Microsoft Hyper-V guest support --->
< > Microsoft Hyper-V client drivers

说明:设置LOCALVERSION 是为了启动时好分辨是xenomai内核还是普通linux内核。


到此内核基本配置完毕,要充分发挥xenomai的实时性的配置远不止于此,还需要对linux进行深度配置,那是优化的事情,以后再说,下面开始进行内核编译。


3.4.2 dovetail xenomai 内核配置


由于ubuntu内核也是5.13,这里复用ubuntu自带内核的config文件,在此文件上进行xenomai内核配置文件。


cp /boot/config-5.13.0-30-generic ./.config

注意:使用挨默认config文件,会包很多无用的驱动,编译会占用很多时间,然而裁剪驱动需要对内核各模块熟悉,且需要大量时间。对于新手来说,快捷的办法是找一个发行版(如Ubuntu),从相近版本内核安装包中提取config文件,在该config基础上进行xenomai配置,这样比较好。

$make menuconfig

配置过程与3.4.1 小节一致。


3.5 内核编译与安装


对于ipipe或者dovet,后面的步骤是一样的,不再重复说明

a) 编译构建xenomai内核debian安装包

对于基于debian衍生的发行版(如debian、Ubuntu、elementary、OpenGEU,Linux Mint等)来说,内核编译安装比较简单,使用以下命令,可直接编译生成用于安装的debian包(.deb),安装过程也无需额外设置,若读者使用的不是Ubuntu系统,请看后面的分步安装内核。


$sudo apt-get install dpkg-deb fakeroot kernel-package
$ CONCURRENCY_LEVEL=$(nproc) make-kpkg --rootcmd fakeroot --initrd --revision=1.0.0 kernel_image kernel_headers


或者


$ make -j$(nproc) deb-pkg


编译时间取决于主机配置,编译完成后会在源码目录的上级目录生成内核安装包,笔者这里如下:


$ls
linux-headers-4.19.114_1.0.0_amd64.deb linux-image-4.19.114_1.0.0_amd64.deb


使用dpkg命令安装内核(需要超级权限):


$sudo dpkg -i linux-headers-4.19.114_1.0.0_amd64.deb linux-image-4.19.114_1.0.0_amd64.deb


安装后直接重启,grub高级选项中选择新安装的内核启动即可。

若不想使用deb的方式安装,也可通过如下步骤安装:

  • 编译:


$make -j$(nproc)


使用-j启动多线程编译,其中命令nproc得到机器逻辑CPU核数。编译后编译内核模块:


$make modules_install


  • 安装:


$sudo make install
$sudo mkinitramfs -o /boot/initrd.img-4.18.14
$sudo update-initramfs -c -k 4.18.14


  • 配置grub引导:


$sudo update-grub


b) 分步编译内核并安装

上面的步骤只适用于基于debian衍生的X86系统,其中诸如命令update-grub其实是对原始的装步骤的脚本封装,更为原始的内核编译安装步骤如下,理论上支持所有x86系统。

  • 编译


$make -j$(nproc)


使用-j启动多线程编译,其中命令nproc得到机器逻辑CPU核数。编译后编译内核模块:


$make modules_install


  • 安装

拷贝内核到/boot目录


$sudo cp -iv arch/x86/boot/bzImage /boot/vmlinuz-4.19.114-xenomai-3.1.1


拷贝内核符号文件System.map(可省略):


$sudo cp -iv System.map /boot/System.map-4.19.114-xenomai-3.1.1


拷贝.config文件(可省略):


$sudo cp -iv .config /boot/config-4.19.114-xenomai-3.1.1


安装内核文档(可省略):


$sudo install -d /usr/share/doc/linux-4.19.114
$sudo cp -r Documentation/* /usr/share/doc/linux-5.5.3


  • 配置grub引导:


$sudo grub-mkconfig -o /boot/grub/grub.cfg


安装后直接重启,grub高级选项中选择新安装的内核启动即可,下面编译安装用户空间实时库libcobalt。


四、安装xenomai库


4.1 编译安装实时库libcobalt


同样,如果你使用的是Ubuntu系统的话,xenomai库可直接编译生成安装包,否则的话需要一步一步配置编译、安装、设置环境变量。


a) 编译构建xenomai库debian安装包

进入xenomai源码目录:


$cd /home/work/xenomai/xenomai-3.1.1


  • 编译

直接执行debain包编译命令:


$debuild -us -uc
若找不到该命令则需要安装
$sudo apt-get install devscripts


编译后同样会在上级目录生成debian安装包如下:


$ ls xenomai*.deb

libxenomai1_2.99.0_amd64.deb xenomai-kernel-source_2.99.0_all.deb
libxenomai-dev_2.99.0_amd64.deb xenomai-runtime_2.99.0_amd64.deb
libxenomai1_2.99.0_amd64.deb:Xenomai的共享库;
xenomai-kernel-source_2.99.0_all.deb:xenomai内核源码;
libxenomai-dev_2.99.0_amd64.deb :xenomai头文件和静态库;
xenomai-runtime_2.99.0_amd64.deb:xenomai运行时组件;
对于开发环境,需要安装xenomai-kernel-source_2.99.0_all.deblibxenomai-dev_2.99.0_amd64.deb,对于生产系统,只需要安装xenomai-runtime_2.99.0_amd64.deblibxenomai1_2.99.0_amd64.deb
  • 安装

直接使用dpkg安装:


sudo dpkg -i libxenomai1_2.99.0_amd64.deb       xenomai-kernel-source_2.99.0_all.deb libxenomai-dev_2.99.0_amd64.deb     xenomai-runtime_2.99.0_amd64.deb


这种方法安装的xenomai库与b)方法安装的位置不同,不需要额外设置环境变量,因为debian包安装的时候已经通过hook脚本自动设置了,感兴趣可以使用dpkg-deb -Rlibxenomai1_2.99.0_amd64.deb解包,查看其hook脚本。进入xenomai测试程序目录/usr/lib/xenomai/testsuite/(该目录没有在环境变量内,所以需要进入目录后执行),运行latency,测试xenomai实时任务定时延迟。


/usr/lib/xenomai/testsuite$ ./latency 
== Sampling period: 100 us
== Test mode: periodic user-mode task
== All results in microseconds
warming up...
RTT| 00:00:11 (periodic user-mode task, 100 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst


b) 分步编译安装xenomai库

对于非基于debian的发行版或是嵌入式系统,需要一步一步配置、编译、安装、配置环境变量来完成。

进入xenomai源码目录:


$cd /home/work/xenomai/xenomai-3.1.1


  • 配置:


./configure --enable-pshared --enable-smp --with-core=cobalt


通过./configure --help可查看配置帮助,配置说明更多参考xenomai官方安装文档,这里不再说明。

  • 创建一个临时安装目录


mkdir -p build


  • 编译安装到这个目录:


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


编译安装后,xenomai库等文件在build/目录下,将build文件夹下所有内容拷贝到rootfs(目标根文件系统)中即可。临时安装到build目录的目的是,如果需要在其他机器上部署,可不用再次编译,直接将该目录内容拷贝到目标文件系统根目录即可。


$sudo cp -R build/* rootfs/usr/


也可以直接编译安装到系统中:


make -j$(nproc) install


  • 配置环境变量:

在目录/etc/profile.d/下创建文件xenomai环境变量文件xenomai.sh,文件内容如下:


#fix paths for xenomai
export XENOMAI_ROOT_DIR=/usr/xenomai
export XENOMAI_PATH=/usr/xenomai
export PATH=$PATH:$XENOMAI_PATH/bin:$XENOMAI_PATH/sbin
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$XENOMAI_PATH/lib/pkgconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$XENOMAI_PATH/lib
export OROCOS_TARGET=xenomai


#add some aliases convenient for xenomai
alias xeno-stat="cat /proc/xenomai/sched/stat"
alias xeno-threads="cat /proc/xenomai/sched/threads"
alias xeno-rt-threads="cat /proc/xenomai/sched/rt/threads"
alias xeno-interrupts="cat /proc/xenomai/irq"
alias xeno-version=/usr/xenomai/sbin/version
alias xeno-autotune=/usr/xenomai/sbin/autotune
alias xeno-latency=/usr/xenomai/bin/latenc


前半部分是xenomai环境变量,后半部分是常用的命名别名(快捷命令),具体含义后面的文章会介绍到;


由于xenomai实时任务是在linux软实时任务基础上创建的,而linux实时任务的创建需要权限,所以还需要配置用户组允许非root用户运行实时任务。创建用户组xenomai,并将当前非root用户与root用户加入用户组xenomai。


$sudo addgroup xenomai --gid 1234
$sudo addgroup root xenomai
$sudo usermod -a -G xenomai $USER


配置grub配置文件/etc/default/grub,在linux命令行参数中添加用户组信息xenomai.allowed_group=1234,其中1234表示用户组ID,如下:


GRUB_CMDLINE_LINUX_DEFAULT="quiet splash xenomai.allowed_group=1234"


更新grub:


$sudo grub-mkconfig -o /boot/grub/grub.cfg

$sudo update-grub


重新启动选择xenomai内核,进入系统打开终端,直接执行latency测试xenomai实时性。


$ latency 
== Sampling period: 100 us
== Test mode: periodic user-mode task
== All results in microseconds
warming up...
RTT| 00:00:11 (periodic user-mode task, 100 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst


五、X86 平台xenomai实时性测试


下面是笔者一台工控板上的测试数据,供大家参考。

使用的环境如下:




CPUintel 赛扬 3865U@1.8GHZ
KernelLinux 4.4.200
操作系统Ubuntu 16.04
内存8GB DDR3-1600 双通道
存储64GB EMMC


测试条件:一个QT应用程序绘制2维曲线图,只有QT CPU占用率就达到99%,在此基础上使用stress添加压力,创建10个CPU密集型任务(不断计算平方根),4个内存压力任务(不断的执行内存分配-赋值-读取校验-释放操作,每次操作内存大小为256MB)。


stress -c 10 -m 4


测试时间:211:04:55
测试命令:


latency -t0 -p 100 -P 99 -h -g result.txt


测试应用空间程序,优先级99,任务周期100us,测试结果输出到文件result.txt。经过接近10天的测试后,文件result.txt中latency分布结果如下:


# 211:04:55 (periodic user-mode task, 100 us period, priority 99)
# ----lat min|----lat avg|----lat max|-overrun|---msw|
# 0.343| 1.078| 23.110| 0| 0|
# Xenomai version: Xenomai/cobalt v3.1
# Linux 4.19.114-xeno
......
# I-pipe releagese #20 detected
# Cobalt core 3.1 detected
# Compiler: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)
# Build args: --enable-smp --enable-pshared --enable-tls
PKG_CONFIG_PATH=:/usr/xenomai/lib/pkgconfig:/usr/xenomai/lib/pkgconfig0 1
0.5 1599357037
1.5 1621130106
2.5 56618753
3.5 4386985
4.5 3848531
5.5 3556704
6.5 3353649
7.5 3033218
8.5 2560133
9.5 2035075
10.5 1516866
11.5 1038989
12.5 680815
13.5 417124
14.5 224296
15.5 115165
16.5 58075
17.5 27669
18.5 11648
19.5 4648
20.5 1646
21.5 467
22.5 38
23.5 1


其中第一列数据表示latency的值,第二列表示该值与上一个值之间这个范围的latency出现的次数,最小0.343us,平均latency 1.078us,最大23.110us。系统高负载情况下还能有这么好的表现,可见xenomai的实时性还是挺不错的。


这还只是xenomai应用空间任务的实时性表现,如果使用内核空间任务会更好。当然这只能说明操作系统能提供的实时性能,具体的还要看应用程序的设计等等。


此外,X86平台实时性与BIOS有很大关系,通常BIOS配置CPU具有更高的吞吐量,例如超线程等,毕竟BIOS不是普通开发者能接触到的,如果能让BIOS对CPU针对实时系统配置的话,实时性会更好。比如下图所示:平均抖动几乎在100纳秒以内。



六、arm架构安装xenomai


主要是事先移植linux内核和u-boot,它们跑起来后才能进行xenomai实时性改造。其他的就与上面步骤大同小异。步骤如下:

a)对移植好的linux内核打ipipe补丁。

b)打xenomai cobalt内核补丁。

c)交叉编译(普通嵌入式内核编译)

d)安装zImage,若有内核模块安装内核模块

e)交叉编译xenomai库


ARM配置选项和编译标志:


SOCCFLAGSconfigure options
at91rm9200-march=armv4t -msoft-float
at91sam9x-march=armv5 -msoft-float
imx1-march=armv4t -msoft-float
imx21-march=armv5 -msoft-float
imx31-march=armv6 -mfpu=vfp
imx51/imx53-march=armv7-a -mfpu=vfp3
imx6q-march=armv7-a -mfpu=vfp3--enable-smp
ixp4xx-march=armv5 -msoft-float--enable-arm-tsc=ixp4xx
omap3-march=armv7-a -mfpu=vfp3
omap4-march=armv7-a -mfpu=vfp3--enable-smp
orion-march=armv5 -mfpu=vfp
pxa-march=armv5 -msoft-float
pxa3xx-march=armv5 -msoft-float--enable-arm-quirks=xscale3
s3c24xx-march=armv4t -msoft-float
sa1100-march=armv4t -msoft-float--enable-arm-quirks=sa1100


这里以cortex-A8 am335x为例:

配置


cd xenomai-3.1
./configure CFLAGS="-march=armv7-a -mtune=cortex-a8 -mfloat-abi=hard -mfpu=vfp3 -ffast-math" --host=arm-linux-gnueabihf --with-core=cobalt --enable-smp


--host=参数指定交叉编译工具链,CFLAGS=指定目标架构,是否使用硬浮点等。

  • 创建一个临时安装目录


mkdir -p build-arm


  • 编译安装到build-arm目录:


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


编译安装后,xenomai库等文件在$(pwd)/build/xenomai目录下,将xenomai文件夹拷贝到rootfs/usr中即可。


sudo cp -R build-arm/xenomai rootfs/usr/


或者将xenomai文件夹进行压缩,然后需要时直接解压到rootfs /usr中,这种方式便于后续安装。


cd build 
sudo tar -czpvf xenomai-arm-3.1.1.tar.gz xenomai


解压到rootfs:


cd rootfs
sudo tar -xpvf xenomai-arm-3.1.1.tar.gz -C usr/


f)配置环境变量


与上面一样,在目录/etc/profile.d/下创建文件xenomai环境变量文件xenomai.sh,文件内容如下:


#fix paths for xenomai
export XENOMAI_ROOT_DIR=/usr/xenomai
export XENOMAI_PATH=/usr/xenomai
export PATH=$PATH:$XENOMAI_PATH/bin:$XENOMAI_PATH/sbin
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$XENOMAI_PATH/lib/pkgconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$XENOMAI_PATH/lib
export OROCOS_TARGET=xenomai

#add some aliases convenient for xenomai
alias xeno-stat="cat /proc/xenomai/sched/stat"
alias xeno-threads="cat /proc/xenomai/sched/threads"
alias xeno-rt-threads="cat /proc/xenomai/sched/rt/threads"
alias xeno-interrupts="cat /proc/xenomai/irq"
alias xeno-version=/usr/xenomai/sbin/version
alias xeno-autotune=/usr/xenomai/sbin/autotune
alias xeno-latency=/usr/xenomai/bin/latenc


也可将这些内容直接放到/etc/profile中。


g)配置linux命令行参数


arm嵌入式系统一般都是root用户,不需要设置用户组,如果不是,请如上文所示建立用户组。修改u-boot向内核传递内核参数,或者修改设备树节点,添加内核参数属性并赋值。

更多参考:http://wiki.csie.ncku.edu.tw/embedded/xenomai


七、ARM 平台xenomai实时性测试




CPU双核cortex-A15@1.5GHZ
KernelLinux 4.19.85 + xenomai 3.1
内存2GB DDR3
存储4GB EMMC
以下均在压力stress -c 10 -m 4下测试,时间2小时,定时周期100us,优先级99。


7.1 IRQ-timer handler


# 02:00:00 (in-kernel timer handler, 100 us period, priority 99)
# ----lat min|----lat avg|----lat max|-overrun|---msw|
# 0.325| 0.768| 6.859| 0| 0|
# Xenomai version: Xenomai/cobalt v3.1
.....
0 1
0.25 979922
0.75 69023222
1.25 1468209
1.75 314001
2.25 118087
2.75 52695
3.25 9272
3.75 2163
4.25 5333
4.75 2638
5.25 18381
5.75 5633
6.25 18
6.75 15
7 1


7.2 内核态任务


# 01:33:21 (in-kernel periodic task, 100 us period, priority 99)
# ----lat min|----lat avg|----lat max|-overrun|---msw|
# -0.282| 0.643| 10.519| 0| 0|
# Xenomai version: Xenomai/cobalt v3.1
....
0 1
0.25 37403654
0.75 5725957
1.25 5300392
1.75 3143282
2.25 2329224
2.75 1360290
3.25 511552
3.75 135384
4.25 37234
4.75 42208
5.25 18950
5.75 4495
6.25 532
6.75 295
7.25 172
7.75 43
8.25 13
8.75 6
9.25 1
9.75 3
10.25 1
10.75 2
11 1


7.3 用户态任务


# 02:00:00 (periodic user-mode task, 100 us period, priority 99)
# ----lat min|----lat avg|----lat max|-overrun|---msw|
# 0.422| 3.605| 13.328| 0| 0|
# Xenomai version: Xenomai/cobalt v3.1
.....
0 1
0.25 2
0.75 44
1.25 137
1.75 1540
2.25 13471
2.75 1943224
3.25 38106382
3.75 19789463
4.25 6749386
4.75 2940300
5.25 1812680
5.75 549134
6.25 47176
6.75 18063
7.25 16545
7.75 9921
8.25 1391
8.75 389
9.25 132
9.75 97
10.25 104
10.75 46
11.25 18
11.75 21
12.25 6
12.75 4
13.25 2
13.5 1

基于arm平台xenomai与VxWorks 实时性能对比,可参见本博客其他文章。


八、arm64架构安装xenomai


最近[2020.11.11]入手一个树莓派4B,想看看xenomai在树莓派上的实时性表现,就搞了一下,便更新文章记录下来.


这里用树莓派4b来说明,具体步骤以上类似,需要注意的是,选择内核的时候尽量使用与ipipe支持版本相近的分支来打补丁,目前ipipe还不支持5.x的内核,所以这里使用分支rpi-4.19.y,ipipe使用ipipe-core-4.19.124-cip27-arm64-07.patch。


git clone --depth=1 --branch rpi-4.19.y https://github.com/raspberrypi/linux


打ipipe补丁的时候有一些小冲突,自己对着源码手动补充一下就行。树莓派4B还有一些中断控制器未进行ipipe修复,可参见https://blog.csdn.net/chensong_2000/article/details/106556100

接下了的步骤与上面一致,如果嫌麻烦的朋友可以直接克隆:


git clone https://gitlab.com/wsg199600/rpi-xenomai.git


配置


make bcm2711_xenomai_defconfig


树莓派内核构建参见
Kernel building


参考链接:

xenomai官方安装文档

https://gitlab.denx.de/Xenomai/xenomai/wikis/home

https://gitlab.denx.de/Xenomai/xenomai/wikis/Start_Here


xenomai系列上一篇文章:xenomai内核解析之嵌入式实时linux概述



Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
评论
  • 近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言交流体验。 INMO GO2内置的W517芯片,是紫光展锐4G旗舰级智能穿戴平台,采用四核处理器,具有高性能、低功耗的优势,内置超微高集成技术,采用先进工艺,计算能力相比同档位竞品提升4倍,强大的性能提供更加多样化的应用场景。【视频见P盘链接】 依托“
    紫光展锐 2024-12-11 11:50 47浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-10 16:13 105浏览
  • 【萤火工场CEM5826-M11测评】OLED显示雷达数据本文结合之前关于串口打印雷达监测数据的研究,进一步扩展至 OLED 屏幕显示。该项目整体分为两部分: 一、框架显示; 二、数据采集与填充显示。为了减小 MCU 负担,采用 局部刷新 的方案。1. 显示框架所需库函数 Wire.h 、Adafruit_GFX.h 、Adafruit_SSD1306.h . 代码#include #include #include #include "logo_128x64.h"#include "logo_
    无垠的广袤 2024-12-10 14:03 69浏览
  • 概述 通过前面的研究学习,已经可以在CycloneVGX器件中成功实现完整的TDC(或者说完整的TDL,即延时线),测试结果也比较满足,解决了超大BIN尺寸以及大量0尺寸BIN的问题,但是还是存在一些之前系列器件还未遇到的问题,这些问题将在本文中进行详细描述介绍。 在五代Cyclone器件内部系统时钟受限的情况下,意味着大量逻辑资源将被浪费在于实现较大长度的TDL上面。是否可以找到方法可以对此前TDL的长度进行优化呢?本文还将探讨这个问题。TDC前段BIN颗粒堵塞问题分析 将延时链在逻辑中实现后
    coyoo 2024-12-10 13:28 101浏览
  • 智能汽车可替换LED前照灯控制运行的原理涉及多个方面,包括自适应前照灯系统(AFS)的工作原理、传感器的应用、步进电机的控制以及模糊控制策略等。当下时代的智能汽车灯光控制系统通过车载网关控制单元集中控制,表现特殊点的有特斯拉,仅通过前车身控制器,整个系统就包括了灯光旋转开关、车灯变光开关、左LED前照灯总成、右LED前照灯总成、转向柱电子控制单元、CAN数据总线接口、组合仪表控制单元、车载网关控制单元等器件。变光开关、转向开关和辅助操作系统一般连为一体,开关之间通过内部线束和转向柱装置连接为多,
    lauguo2013 2024-12-10 15:53 81浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 70浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 66浏览
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 49浏览
  • 全球知名半导体制造商ROHM Co., Ltd.(以下简称“罗姆”)宣布与Taiwan Semiconductor Manufacturing Company Limited(以下简称“台积公司”)就车载氮化镓功率器件的开发和量产事宜建立战略合作伙伴关系。通过该合作关系,双方将致力于将罗姆的氮化镓器件开发技术与台积公司业界先进的GaN-on-Silicon工艺技术优势结合起来,满足市场对高耐压和高频特性优异的功率元器件日益增长的需求。氮化镓功率器件目前主要被用于AC适配器和服务器电源等消费电子和
    电子资讯报 2024-12-10 17:09 84浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 74浏览
  • 我的一台很多年前人家不要了的九十年代SONY台式组合音响,接手时只有CD功能不行了,因为不需要,也就没修,只使用收音机、磁带机和外接信号功能就够了。最近五年在外地,就断电闲置,没使用了。今年9月回到家里,就一个劲儿地忙着收拾家当,忙了一个多月,太多事啦!修了电气,清理了闲置不用了的电器和电子,就是一个劲儿地扔扔扔!几十年的“工匠式”收留收藏,只能断舍离,拆解不过来的了。一天,忽然感觉室内有股臭味,用鼻子的嗅觉功能朝着臭味重的方向寻找,觉得应该就是这台组合音响?怎么会呢?这无机物的东西不会腐臭吧?
    自做自受 2024-12-10 16:34 136浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦