下面是针对实时系统Xenomai使用的一些记录,实时系统在工业自动化,机器人等智能行业是必需会用到的。
简述
xenomai是众多inux实时性解决方案中的一种,通过在linux的基础上添加一个RTOS内核cobalt,来提高linux的实时性。实时内核cobalt与非实时内核linux相结合,既能提供工业级RTOS的硬实时性能,又能利用linux操作系统非常出色的网络和图形界面服务,在产品的开发周期和成本控制方面都有巨大优势,结构如下:
主要有3部分,xenomai的移植构建也是围绕这三部分来进行:
-
用户空间中的实时应用程序库libcobalt;
-
内核空间中的实时内核Cobalt;
-
硬件架构与Linux内核版本相关层 ipipe-core或dovetail。
ibcobalt和Cobalt的源码随xenomai更新,位于同一源码包内,ipipe-core和dovetail则与硬件架构和具体linux版本相关,以补丁的方式提供,需要单独下载。
由于一些ipipe维护困难的关系,从linux5.4以上版本不再提供ipipe,ipipe由dovetail替代。
所以如果你的linux内核版本在5.4以上版本的话需要使用dovetail。
下面主要基于ubuntu20.04内核编译,由于我安装的ubuntu20.04的内核是5.13版本,而对应的dovetail 5.13版本是未经测试验证的,所以为了编译时少遇到些报错,先将内核升级到5.15.
升级Ubuntu20.04内核到Linux5.15
原来内核:
gary@jxes:~$ uname -a
Linux jxes 5.13.0-40-generic #45~20.04.1-Ubuntu SMP Mon Apr 4 09:38:31 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
查看可升级的内核版本:
gary@jxes:~$ apt list linux-headers-5.15.*-*-generic linux-image-5.15.*-*-generic
[sudo] password for gary:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
dmeventd libaio1 libdevmapper-event1.02.1 liblvm2cmd2.03 libreadline5 thin-provisioning-tools
。。。。。。。。。。。
/etc/kernel/postinst.d/zz-update-grub:
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.15.0-60-generic
Found initrd image: /boot/initrd.img-5.15.0-60-generic
Found linux image: /boot/vmlinuz-5.13.0-40-generic
Found initrd image: /boot/initrd.img-5.13.0-40-generic
Found linux image: /boot/vmlinuz-5.13.0-30-generic
Found initrd image: /boot/initrd.img-5.13.0-30-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done
升级安装内核版本到5.15.0-60:
sudo apt install linux-headers-5.15.0-60-generic linux-image-5.15.0-60-generic
重启生效:
sudo reboot
检查升级后内核版本:
gary@jxes:~$ uname -a
Linux jxes 5.15.0-60-generic #66~20.04.1-Ubuntu SMP Wed Jan 25 09:41:30 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
可以把不需要的软件删除(之前旧内核及其软件包):
gary@jxes:~$ sudo apt autoremove
还可把内核升级为低延时lowlatency(工业级嵌入式系统):
gary@jxes:~$ apt list linux-headers-5.15.*-*-lowlatency linux-image-5.15.*-*-lowlatency
Listing... Done
linux-headers-5.15.0-33-lowlatency/focal-updates,focal-security 5.15.0-33.34~20.04.1 amd64
由于默认ubuntu20.04的GCC版本比较新,这里需要降到GCC7,具体安装方法如下:
gary@jxes:~$ sudo apt update
gary@jxes:~$ sudo apt install build-essential
gary@jxes:~$ sudo apt install gcc-7 g++-7
gary@jxes:~$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
gary@jxes:~$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7 --slave /usr/bin/gcov gcov /usr/bin/gcov-7
gary@jxes:~$ sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/gcc-9 90 auto mode
1 /usr/bin/gcc-7 70 manual mode
2 /usr/bin/gcc-9 90 manual mode
Press <enter> to keep the current choice[*], or type selection number: 1
gary@jxes:~$ gcc --version
gcc (Ubuntu 7.5.0-6ubuntu2) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
安装软件包和下载对应linux5.15内核源码、dovetail补丁和xenomai实时内核
1、安装软件包
sudo apt-get install gcc libncurses-dev flex bison openssl-dev libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev build-dep zstd
这里建议将证书先禁用,否则在编译时会报错,具体禁用方法如下,否则会编译中途报错,前功尽弃。
gary@jxes:~/Xenomai/linux-dovetail-v5.15.y-dovetail$sudo scripts/config --disable SYSTEM_TRUSTED_KEYS
gary@jxes:~/Xenomai/linux-dovetail-v5.15.y-dovetail$ sudo scripts/config --disable SYSTEM_REVOCATION_KEYS
2、下载
linux-5.15.60.tar.xz
patch-5.15.51-dovetail1.patch.bz2(linux-dovetail-v5.15.y-dovetail.tar.gz这是打好补丁的Linux内核源)
xenomai-v3.2.1.tar.gz
3、给linux5.15内核打补丁
gary@jxes:~/Xenomai/linux-5.15.60$ sudo patch -p1 < ../patch-5.15.51-dovetail1.patch
最好下载dovetail源码直接编译,因为打补丁,可能会存在版本不匹配,比如上面下载到的内核是5.15.60,而补丁只有5.15.51,貌似差不多,将就用,但最终编译时难免不遇到问题,比如如下报错,最后是直接基于linux-dovetail-v5.15.y-d