#+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 作为工作目录, 个人习惯
准备内核源码和补丁
- 准备内核源码
# 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
- 准备补丁:由于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的补丁。
- 打 dovetail 补丁:
# cd ~/xenomai/linux-5.15.55/
# patch -p1 < ../patch-5.15.51-dovetail1.patch # 打 dovetail 补丁
- 打 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