Xenomai 安装部署

#+SETUPFILE: ~/Dropbox/Doc/Org_Templates/level-1.org

简介

Xenomai 主要由三部分组成:

  • cobalt: 内核空间的实时内核。
  • dovetail: 类似 ADEOS的实现,管理分发中断。Liunx 5.4 以前的代码这部分工作由 ipipe处理。
  • libcobalt: 用户空间的实时库。

cobalt 和 libcobalt 随 xenomai 源码提供,dovetail 与具体的硬件架构和Linux 版本相关,以Linux补丁的形式提供。

环境准备

NOTE: 编译的机器和目标机器可以不在一台

  • ubuntu 22.04
  • kernel 5.15.55
  • dovetail 5.15.51-dovetail1
  • xenomai v3.2.1

安装基本工具软件:

# 安装部署编译依赖包
# apt-get install -y build-essential libncurses-dev flex bison libssl-dev dkms libelf-dev libiberty-dev pahole \
  devscripts debhelper autotools-dev autoconf automake libtool pkg-config libltdl-dev
# mkdir -p ~/xenomai && cd ~/xenomai  # 将 ~/xenomai 作为工作目录, 个人习惯

准备内核源码和补丁

  1. 准备内核源码
# wget -c https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.55.tar.xz
# tar xf linux-5.15.55.tar.xz
  1. 准备补丁:由于dovetail 是一个内核补丁,所以选择 dovetail 的时候需要和对应的内核版本匹配。在 这里 选择对应的版本,这里选择 patch-5.15.51-dovetail1.patch.bz2
# wget https://xenomai.org/downloads/dovetail/patch-5.15.51-dovetail1.patch.bz2
# bzip -d patch-5.15.51-dovetail1.patch.bz2

准备 xenomai 源码

这里 下载最新稳定版,这里选择 3.2.1 版本。

# wget -c https://source.denx.de/Xenomai/xenomai/-/archive/v3.2.1/xenomai-v3.2.1.tar.bz2
# tar xf xenomai-v3.2.1.tar.bz2

编译安装内核

打内核补丁

根据 xenomai 的架构,需要对linux内核打 dovetail 和 cobalt的补丁。

  1. 打 dovetail 补丁:
# cd ~/xenomai/linux-5.15.55/
# patch -p1 < ../patch-5.15.51-dovetail1.patch  # 打 dovetail 补丁
  1. 打 cobalt 补丁:

首先生成 cobalt 补丁:

# cd ~/xenomai/xenomai-v3.2.1/scripts/
# ./prepare-kernel.sh --help
usage: prepare-kernel --linux=<linux-tree> [--dovetail=<dovetail-patch>]|[--ipipe=<ipipe-patch>] [--arch=<arch>] [--outpatch=<file> [--filterkvers=y|n] [--filterarch=y|n]] [--forcelink] [--default] [--verbose]
# --linux 指定 linux 源码路径
# --dovetail 制定 dovetail 补丁,因为选择手动打补丁,这里忽略
# --arch 指定硬件架构,这里选择 x86_64
# --outpath 指定输出 cobalt 补丁的路径
# ./prepare-kernel.sh --linux=/root/xenomai/linux-5.15.55 --arch=x86_64 --outpatch=/root/xenomai/cobalt-core-3.2.1-1.patch

应用 cobalt 补丁

# 回到 linux 打补丁
# cd ~/xenomai/linux-5.15.55/
# patch -p1 < ../cobalt-core-3.2.1-1.patch

配置内核选项

# cd ~/xenomai/linux-5.15.55/
# 配置内核选项是很麻烦的,为了方便,在现在运行的 ubuntu 的内核基础上修改可以节省大连工作量,如果为了生产环境,建议手动配置所有内核选项,做出一个精简的内核。
# cp /boot/config-$(uname -r) .config
# make menuconfig

默认会看到这样的警告,需要针对 xenomai 将一些内核选项配置完成之后这些警告才会消失。

[*] Xenomai/cobalt (NEW)  --->
    *** 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) Preemptible Kernel (Low-Latency Desktop)   --> 配置可抢占式内核

Processor type and features
  --> Processor family
    --> (X) Core 2/newer Xeon                          --> 根据具体的处理器架构选择。
  --> [ ] Multi-core scheduler support                 --> 关闭多核调度优化,后面的 CPU 自动调频依赖此项

Power management and ACPI options
  --> ACPI (Advanced Configuration and Power Interface) Support
    --> < > Processor
  --> CPU Frequency scaling
    --> [ ] CPU Frequency scaling                      --> 关闭 CPU 自动调频
  --> CPU Idle
    --> [ ] CPU idle PM support                        --> 关闭 CPU idle 特性

Memory Management options                              --> 关闭影响实时性的内存选项
  --> [ ] Allow for memory compaction
  --> [ ] Transparent Hugepage Support
  --> [ ] Contiguous Memory Allocator
  --> [ ] Page migration

NOTE: linux各个发行版默认选择大部分驱动和功能,这里最好也将这些选项去掉只保留适合目标机器的精简内核,否则编译时间和编译完成的体积会非常大。 以下是建议关闭的选项:

[ ] Linux guest support                  --> 作为虚拟机guest运行才需要此项
[ ] Suspend to RAM and standby           --> xno: 关闭休眠到内存选项, S3 state
[ ] Hibernation (aka 'suspend to disk')  --> xno: 关闭休眠到磁盘选项
< > Microsoft Hyper-V client drivers     --> 去掉 hyperv 虚拟机驱动支持
File systems                             --> 禁用不需要的文件系统
Device Drivers                           --> 禁用不需要的设备驱动

编译内核

# make -j$(nproc) bindeb-pkg  # 选择直接编译打包为 deb 包.

编译完成后会生成一系列 .deb 包:

# lsd -1 linux-*.deb
linux-headers-5.15.55_5.15.55-1_amd64.deb
linux-image-5.15.55-dbg_5.15.55-1_amd64.deb
linux-image-5.15.55_5.15.55-1_amd64.deb
linux-libc-dev_5.15.55-1_amd64.deb

安装新内核

进入目标机器,执行

# dpkg -i linux-image-5.15.55_5.15.55-1_amd64.deb

编译安装 xenomai

# cd ~/xenomai/xenomai-v3.2.1/
# debuild -us -uc  # 使用debuild工具编译成 .deb 包
# dpkg -i xenomai-runtime_2.99.0_amd64.deb \
  libxenomai1_2.99.0_amd64.deb \
  libxenomai-dev_2.99.0_amd64.deb

测试使用

首先使用自带的 xeno-test 工具检查基本环境,简单的延迟测试等,看是否有问题。 检查 no support 选项

# xeno-test  # 使用 xeno-test 工具做基本的环境测试
......
arith OK
cpu_affinity skipped (no kernel support)
gdb OK
......

手动编写一个实时demo调用xenomai 接口测试一下情况

// gcc -o hello hello.c $(xeno-config --posix --alchemy --cflags) $(xeno-config --posix --alchemy --ldflags)
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <xenomai/alchemy/task.h>

RT_TASK demo_task;

void demo(void *arg)
{
  RT_TASK_INFO curtaskinfo;

  // 获取当前任务信息并打印
  rt_task_inquire(&demo_task, &curtaskinfo);
  // NOTE: 实际实时应用开发中,linux系统调用不放在实时任务中,防止系统切换
  printf("Task name : %s \n", curtaskinfo.name);
}

int main(int argc, char* argv[])
{
  char *str = "demo";

  printf("start task\n");

  rt_task_create(&demo_task, str, 0, 50, 0);
  rt_task_start(&demo_task, &demo, 0);

  sleep(1);
}

如果实时内核没有运行的话,xeno-test 和测试程序分别会报以下错误:

# xeno-test
Started child 1807: /bin/bash /usr/lib/xenomai/testsuite/xeno-test-run-wrapper /usr/bin/xeno-test
++ echo 0
/usr/bin/xeno-test: line 91: /proc/xenomai/latency: No such file or directory

# ./hello
   0"000.000| BUG in low_init(): [main] Cobalt core not enabled in kernel

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦