Ubuntu16.04 Xenomai3.x 系列移植笔记----安装指导

目录

1.相关介绍

2.源码目录分析

3.安装Cobalt内核

3.1 了解Cobalt内核

3.2 配置和编译Cobalt内核

3.3 Cobalt 内核参数

3.4 Cobalt 配置样例

3.4.1 构建Cobalt/x86内核(32/64bit)

4. 安装 Mercury 内核

5.安装 Xenomai 库和工具

5.1 准备工作

5.2 配置

测试安装结果

构建Xenomai3 应用

旧版迁移至Xenomai 3

 


1.相关介绍

Xenomai 3是Xenomai实时框架的新架构,它可以作为一个联合内核系统无缝地并行运行Linux,也可以运行在本地的Linux内核之上。在后一种情况下,主线内核可以通过PREEMPT-RT补丁进行补充,以满足比标准内核抢占所带来的更严格的响应时间需求。

在构建时选择两个可用的实时内核之一。双内核内核代号为Cobalt,本地Linux实现称为Mercury。

注意:如果你正在尝试xenomai2.x系列的安装,请访问https://gitlab.denx.de/Xenomai/xenomai/-/wikis/Installing_Xenomai_2 ,且2.x系列不再更新与维护

2.源码目录分析

Xenomai遵循一个分离源模型,将内核空间支持与用户空间库分离开来。

内核和用户空间的Xenomai组件分别是在 kernel/ lib/ 子树下可用。其他顶层目录,如scripts/testsuite/utils/,提供了在构建主机或运行时目标上使用的附加脚本和程序

kernel/是被视为Linux内核的内置扩展。因此应该使用标准的Linux内核配置过程来定义Xenomai内核组件的各种设置。所有的核心代码Xenomai目前引入了实现Cobalt核(即双内核配置)。从今天起,Mercury核心在内核空间中不需要特定于Xenomai的代码。

lib/子树包含导出的各种用户空间库由Xenomai框架进行应用。

3.安装Cobalt内核

3.1 了解Cobalt内核

Xenomai/cobalt提供了一个无缝的实时扩展内核集成到Linux,因此第一步是将其作为目标内核的。为此,scripts/prepare-kernel.sh是正确设置目标内核的shell脚本。语法是具体如下:

$ scripts/prepare-kernel.sh [--linux=] 
[--ipipe=] [--arch=]

--linux

指定目标内核源树的路径。如此内核树可能已经配置好了,或者还没有配置。此路径默认为$PWD。

--ipipe

指定中断管道(也称为I-pipe)的路径要应用于内核树的修补程序。合适的补丁是可从https://xenomai.org/downloads/ipipe/ 下载。如果I-pipe已经已经修补好了,或者脚本应该建议一个。脚本将检测中断管道代码是否已经存在于内核树中。

--arch

告诉脚本有关目标体系结构。如果未指定,构建主机架构建议为默认x86。

例如,下面的命令将准备Linux树位于/home/me/linux-3.10-ipipipe以修补Xenomai支持:

$ cd xenomai-3 
$ scripts/prepare-kernel.sh --linux=/home/me/linux-3.10

注意:脚本将推断Xenomai内核代码的位置从它自己的位置在Xenomai源树。例如,如果

/home/me/xenomai-3/scripts/prepare-kernel.sh正在执行,然后Xenomai内核代码可从/home/me/xenomai-3/kernel/cobalt 将在目标中修补Linux内核。

3.2 配置和编译Cobalt内核

一旦准备好,就可以像往常一样配置目标内核。全部“Xenomai”提供Xenomai配置选项顶层Kconfig菜单。

有几个重要的内核配置选项,记录在案在故障排除指南中https://gitlab.denx.de/Xenomai/xenomai/-/wikis/Troubleshooting#kconf。(完全禁止的)

CONFIG_CPU_FREQ
这使得CPU的频率可以随工作负载进行调制,但许多CPU也会改变TSC的计数频率,这使得当CPU时钟可以改变时,精确的定时变得毫无用处。另外,一些CPU可能需要几毫秒才能达到全速。
CONFIG_CPU_IDLE
允许CPU进入深度睡眠状态,增加从这些睡眠状态出来所需的时间,从而增加空闲系统的延迟。另外,在某些CPU上,进入这些深度睡眠状态会导致Xenomai使用的计时器停止工作。
CONFIG_KGDB
除了x86之外,不应启用此选项。
CONFIG_CONTEXT_TRACKING_FORCE
从3.14开始,内核3.8中出现的这个选项就被I-pipe补丁强制关闭了,因为它与中断管道不兼容,并且对普通用户没有好处。但是,如果存在旧内核,则必须手动禁用它。启用此功能后观察到的常见影响包括实时活动期间与RCU相关的内核警告和病理学上的高延迟。

一旦配置好,内核就可以像往常一样编译了。

 

 

3.3 Cobalt 内核参数

Cobalt内核接受以下参数集,这些参数应由引导加载程序在内核命令行上传递。 详情见网页

 

3.4 Cobalt 配置样例

以下各节中的示例使用约定如下:

$linux_tree linux  内核源码路径

$Xenomai_root xenomai   内核源码路径

3.4.1 构建Cobalt/x86内核(32/64bit)

为x86构建Xenomaicobalt与为32位和64位平台构建Xenomaicobalt几乎是一样的。但是,您应该注意,在为x86_64编译的内核上运行为x86 32编译的Xenomai库是不可能的,反之亦然。

假设你要建立本地的x86_64的系统(x86_64的自交x86_32-构建选项括号内出现),您通常会运行:

$ cd $linux_tree 
$ $xenomai_root/scripts/prepare-kernel.sh --arch=x86 \ --ipipe=ipipe-core-X.Y.Z-x86-NN.patch 
$ make [ARCH=i386] xconfig/gconfig/menuconfig

…配置内核(另请参阅建议的设置在这里https://gitlab.denx.de/Xenomai/xenomai/-/wikis/Configuring_For_X86_Based_Dual_Kernels)。

启用Xenomai选项,然后使用:

$ make [ARCH=i386] bzImage modules

现在,假设您真的想为基于奔腾的x86 32位平台,使用本机主机工具链;典型步骤如下:

$ cd $linux_tree 
$ $xenomai_root/scripts/prepare-kernel.sh --arch=i386 --ipipe=ipipe-core-X.Y.Z-x86-NN.patch 
$ make xconfig/gconfig/menuconfig

…配置内核(另请参阅建议的设置在这里https://gitlab.denx.de/Xenomai/xenomai/-/wikis/Configuring_For_X86_Based_Dual_Kernels)

启用Xenomai选项,然后使用:

$ make bzImage modules

同样,对于64位平台,您可以使用:

$ cd $linux_tree 
$ $xenomai_root/scripts/prepare-kernel.sh --arch=x86_64 --ipipe=ipipe-core-X.Y.Z-x86-NN.patch 
$ make xconfig/gconfig/menuconfig

…配置内核(另请参阅建议的设置在这里https://gitlab.denx.de/Xenomai/xenomai/-/wikis/Configuring_For_X86_Based_Dual_Kernels)

  • 配置基于x86的双内核

在非x86嵌入式平台上,配置Linux内核通常很容易:SoC有一个默认配置文件,您应该从这里开始,根据需要设置Xenomai选项,可能还需要在这里和那里稍作调整,然后就完成了。配置x86内核有点不同,没有针对每个PC模型的默认配置文件,您可能想要启动的惟一内核配置文件是随您的发行版内核一起提供的。不幸的是,任何桌面/服务器发行版附带的典型的一应俱全的配置在当今总是与实时需求相冲突,特别是在双内核配置的情况下这里有一些指导方针,以便在双内核配置中为Xenomai设置内核。

  • 谨慎参考网上配置样例

当提到旧的邮件、档案和你最喜欢的搜索引擎结果时要小心。如果你在我们的档案中发现一些邮件说“请禁用选项X或Y”,请不要把这些建议作为一般情况下的经验法则。这些通常是试图在某些用户设置中确定一个问题,而打开/关闭特定选项是该过程的一部分。

出于这个原因,一定要对第三方网站上发现的类似建议有所保留,因为作者可能以同样的方式误解了这些信息。如果有疑问,你应该在Xenomai讨论列表上确认。

  • 常规配置问题

x86 processor type

选择的处理器x86平台运动,至少最具体的模型接近目标CPU,而不是一个通用的占位符实例通用i586系统意味着没有可用的CPU TSC特性,进而要求Xenomai模拟时间戳计数器,导致表现不佳

Xenomai 3需要x86 cpu的硬件TSC特性。

如果你必须在一些低端的x86平台上运行Xenomai 2,而这些平台缺乏硬件TSC,而传统的内核早于3.2,那么一定要禁用配置输入PCSPKR。对于运行l-pipe核心系列的任何后续版本,I-pipe将强制执行适当的设置。

Power management

你不应该禁用电源管理全局,唯一的配置选项,应禁用在这个领域是:

CONFIG_APM

CONFIG_ACPI_PROCESSOR

特别是,保持ACPI启用不会有高延迟的风险,而禁用它可能会阻止系统正确引导。

USB

同样,不要禁用USB,但要启用对USB主机控制器的支持,因为主机控制器代码在启动时禁用对“遗留USB模拟”的支持,这是一个高延迟的来源。

CPU Frequency scaling

禁用CONFIG_CPU_FREQ这个选项会产生Xenomai定时代码的问题,以及实时线程不可预测的运行时,以及CPU频率动态改变时可能出现的高延迟。

不过,对于最近使用常量tsc标志的处理器,计时应该是正确的。

但是,ondemand调控器不能跟踪在主模式下运行的Xenomai线程,即在协内核的控制下。从它的角度来看,这样的线程看起来是挂起的,尽管它们可能正在消耗CPU。因此,调控器不会将CPU切换到更高的频率,尽管实时活动可以证明这一点。

Configuration Options

CONFIG_CPU_FREQ - Disable

这允许CPU频率根据工作负载进行调整,但是许多CPU也会改变TSC计数频率,这使得当CPU时钟可以改变时,精确计时变得毫无用处。此外,一些cpu可能需要几毫秒的时间来提升到完全speec

CONFIG_CPU_IDLE - Disable

允许CPU进入深度睡眠状态,增加了从这些睡眠状态中出来的时间,从而增加了空闲系统的延迟。另外,在某些CPU上,进入深度睡眠状态会导致Xenomai使用的定时器停止工作

CONFIG_CC_STACKPROTECTOR

这个选项可能只在Xenomai 2上的x86_64上启用,而在Xenomai 3上则不受影响。

CONFIG_APM - Disable

APM模型将电源管理控制分配给BIOS,而BIOS代码的编写从来没有考虑到最佳延迟。如果配置了APM例程,则使用SMI优先级调用APM例程,SMI优先级完全绕过l-pipe。为SMl求助于Xenomai解决方案在这里没有帮助。

CONFIG_ACPI_PROCESSOR - Disable

对于BIOS中支持ACPl的系统,此ACPI子选项将安装一个空闲处理程序,该处理程序将使用ACPI C2和C3处理器状态来节省电能。CPU必须从这些睡眠状态中预热,以依赖于BIOS的ACPI表和代码的方式增加延迟。你可以用idle=poll启动参数来抑制睡眠,测试一下就知道了。在最近的Linux版本中(可能从Linux 2.6.21开始),acpi处理器模块在加载时禁用本地APIC。这将导致Xenomai计时器初始化失败。这是禁用此选项的第二个原因。

CONFIG_INTEL_IDLE - Disable

就像配置ACPI处理器一样,这个空闲驱动程序将CPU发送到深度C状态,也会导致巨大的延迟,因为Xenomai使用的APIC定时器可能不再触发。

CONFIG_INPUT_PCSPKR - Disable

https://gitlab.denx.de/Xenomai/xenomai/-/wikis/Configuring_For_X86_Based_Dual_Kernels#pcspkr

CONFIG_PCI_MSI

可以启用这个选项,前提是中断行上的以下操作总是在Linux上下文中完成,即次要模式,而不是实时模式:

1.hooking/requesting

2.releasing

3.enabling/unmasking

4.disabling/masking

实际上,上面的需求转化为只从任何RTDM驱动程序中的非rt处理程序调用rtdm_irq-request0、rtdm_irq_free0、rtdm_irq_enable0、rtdm_irq_disable。这包括-open0、-close0和-ioctl_nrtO处理程序。

启动initramfs或不启动initramfs?

默认情况下,发行版使用initramfs引导内核。这意味着内核不需要特殊的内置支持,任何东西都可以作为模块构建。这些模块在第一个启动阶段从initramfs加载。然后可以挂载最后的根文件系统,内核引导可以正常继续。

因此,如果您从一个发行版内核开始,您将不得不生成一个initramfs,其中包含支持安装根文件系统所需的基本硬件的模块。Eache分发版提供了为新内核生成initramfs的方法另一方面,如果您希望在不使用initramfs的情况下引导,则必须在内核中构建(而不是作为模块)挂载根文件系统所需的所有组件。这意味着:磁盘控制器支持,支持SCSI磁盘如果这个控制器是一个SCSl控制器或支持一个新风格ATA控制器,支持IDE磁盘是否支持该控制器由一个老式的并行ATA控制器,通过网络,支持你的网卡,如果引导和支持您的根文件系统使用的文件系统(例如EXT3, NFS等. .)。

但是,有一件事是肯定的:如果没有initramfs,您就不能启动一个所有内容都构建为模块的内核。

  • 严重的延迟出现

如果运行延迟测试时显示的延迟数据非常奇怪(比如数百微秒或更多),那么在x86上通常怀疑的是系统管理中断。https://gitlab.denx.de/Xenomai/xenomai/-/wikis/Dealing_With_X86_Smi_Troubles

请务必仔细阅读有关调整SMI配置的建议,否则可能会损坏您的硬件。

  • CPU优化和平台设置

通过将内核设置调优到接近实际硬件,可以避免无用的开销(例如在非SMP系统上配置SMP)或次优代码的一代。

例如,选择CONFIG_M586或更早要求Xenomai模拟芯片上的TSC来执行定时任务,即使您的CPU实际上提供了这个特殊的硬件计数器;不幸的是,模拟TSC非常慢,这显然会对最坏情况下的延迟数字产生负面影响,尽管使用适当的内核配置,硬件的性能可能会好得多。

因此,在x86上作为实时平台,不是盲目地相信您喜欢的发行版制造商提供的应该到处工作的默认内核的配置,而是让这种配置适应您的实际硬件。

启用Xenomai选项,然后使用:

$ make bzImage modules

其余的例子说明了如何交叉编译支持的内核用于各种体系结构。当然,你会必须先为目标系统安装正确的交叉编译工具链。(白嫖,下次一定)

4. 安装 Mercury 内核

对于Mercury,到目前为止还不需要Xenomai特定的内核支持,除了您的主机Linux内核已经提供的功能之外。你的内核应至少提供高分辨率计时器支持(配置高资源计时器CONFIG_HIGH_RES_TIMERS),可能完全抢占(PREEMPT_RT)如果您的应用程序要求短且有界延迟。

没有实时支持的内核也可以使用,很可能用于basic调试任务和/或运行没有严格的响应时间要求。

因此,与Cobalt不同,没有其他步骤为Mercury准备或配置内核。

5.安装 Xenomai 库和工具

5.1 准备工作

一般要求(两个核心)

1.GCC必须支持遗留的原子内置项(uuu sync form)。

2.GCC最好对TLS有(正常/工作)支持,尽管如果使用--disable tls构建,这不是强制的。

3.如果计划启用用户空间注册表支持(即--enable-registry),则必须在中启用配置保险丝运行实时应用程序的目标内核。此外,FUSE开发库必须可以从工具链中获得。

4.如果您计划从Xenomai GITtree(git.Xenomai.org)提供的源代码进行构建,则必须在构建系统上提供autoconf(>=2.62)、automake和libtool包。从从发布tarball中提取的源树进行构建时,这不是必需的。

Cobalt特别需求

内核版本必须是3.10或更好

一个中断管道(l-pipe)补丁必须对您的目标内核可用。你可以在那里找到Xenomai项目发布的官方补丁。只有来自ipipe-core系列的补丁是合适的,而adeos-ipipe系列的遗留补丁则不合适。

在x86 32硬件上运行需要时间戳计数器(TSC)。不像Xenomai 2,使用PIT寄存器的tsc仿真是不可用的

Mercury 特别需求

无;

5.2 配置

如果构建从Xenomai GIT树(git.xenomai.org)获得的源代码,configure脚本和makefile必须在Xenomail源代码树中生成。推荐的方法是从源代码树的顶部运行自动重新配置脚本:

./scripts/bootstrap

如果从发布tarball构建,那么从提取的源树中可以很容易地获得一组autoconf生成的文件,因此不需要重新配置运行时,生成的configure脚本将为构建用于Cobalt和Mercury内核的库和程序做好准备。内部可能需要的特定于核心的代码是由构建过程在编译时自动、透明地选择的。下面列出的选项可以传递给这个脚本

  • 交叉编译
  • 构建Xenomai库和工具样例

 

在下面的示例中,如果要构建支持smp的内核,请确保将--enable-smp添加到配置脚本选项中。

Building the x86 libraries (32/64bit)

假设您希望为x86 /SMP系统本地构建Mercury库,从而支持共享的多处理支持。你通常会这样:

$ mkdir $build_root && cd $build_root 
$ $xenomai_root/configure --with-core=mercury --enable-smp --enable-pshared 
$ make install

相反,使用相同的特性集从x86 64上交叉构建用于x86 32上运行的Cobalt库可以是:

$ mkdir $build_root && cd $build_root 
$ $xenomai_root/configure --with-core=cobalt --enable-smp --enable-pshared --host=i686-linux CFLAGS="-m32 -O2" LDFLAGS="-m32" 
$ make install

安装构建树(即使用“make install”)后,安装根目录中应该填充可用于构建基于xenomai的实时应用程序的库、程序和头文件。此目录路径默认为/usr/xenomai

 

  • 测试安装结果

  • 启动Cobalt内核

为了测试Xenomai在Cobalt上的安装,您应该首先尝试引导补丁后的内核。检查内核引导日志中的消息如下:

$ dmesg | grep -i xenomai 
I-pipe: head domain Xenomai registered. 
[Xenomai] Cobalt vX.Y.Z enabled

如果内核引导失败,或者日志消息显示错误状态,请参阅故障排除指南。

  • 测试实时内核

首先运行

$ /usr/xenomai/bin/latency

延迟测试应该每秒钟显示一条消息,其中包含最小、最大和平均延迟值。如果此测试显示错误消息、挂起或显示意外值,请参阅故障排除指南

如果延迟测试成功,您应该尝试下一步运行xeno-test测试,以评估系统的最坏情况延迟。试一试:

$ xeno-test --help
  • 校准Cobalt内核

Cobalt计时服务的准确性取决于其核心计时器的正确校准。可靠的工厂默认校准值是为Xenomai支持的每个平台定义的,但是建议校准针对目标系统的核心定时器

请参阅有关autotune(1)实用程序的文档。https://xenomai.org/documentation/xenomai-3/html/man1/autotune/index.html

  • 构建Xenomai3 应用

一旦延迟测试在目标系统上的行为符合预期,就可以认为它已经准备好运行实时应用程序了。

有关应用程序构建过程的详细信息,您可能希望查看此文档https://gitlab.denx.de/Xenomai/xenomai/-/wikis/Building_Applications_For_Xenomai_3

此外,您可以参考本文档https://gitlab.denx.de/Xenomai/xenomai/-/wikis/Running_Applications_With_Xenomai_3来了解Xenomai 3应用程序中可用的命令行选项。

  • 旧版迁移至Xenomai 3

如果您计划基于Xenomai 2的现有应用程序移植到Xenomai 3.x,你应该看看这个迁移指南

https://gitlab.denx.de/Xenomai/xenomai/-/wikis/Migrating_From_Xenomai_2_To_3

 

 

你可能感兴趣的:(个人工作,学习项目)