本文是在笔者实践下书写,每一步都经过实际操作,亲测有效,参考几个链接,基本雷同但是有作者思想所在,一为留下日后参考,二为想在该方向发展但找不到教程的人提供一点方向。
操作系统:Ubuntu 14.04.05,内核版本:4.4.0-31-generic
Xenomai版本:2.6.4
初次安装系统,需要执行update和upgrade,此处注意要把update执行到底,笔者安装的前几个系统就是因为网络问题,update时有几个链接不能更新,导致以后软件依赖关系不能解决,从而出现意想不到的错误。命令如下:
sudo apt-get update
sudo apt-get upgrade
接下来需要更新内核和安装一些软件依赖,命令如下:
sudo apt-get install linux-image-generic-lts-trusty // 更新内核
sudo apt-get install xserver-xorg-lts-trusty // 更新Xorg
/* 更新GCC,注释掉的四行是参考链接中的,但是笔者操作的时候,这四行是没有必要的 */
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-4.8 g++-4.8
// sudo update-alternatives --remove-all gcc
// sudo update-alternatives --remove-all g++
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 20
// sudo update-alternatives --config gcc
// sudo update-alternatives --config g++
解决软件依赖:
sudo apt-get install fakeroot kernel-package makedumpfile build-essential crash kexec-tools kernel-wedge git-core libncurses5 libncurses5-dev libelf-dev binutils-dev asciidoc devscripts debhelper dh-kpatches autotools-dev autoconf automake libtool
sudo apt-get build-dep linux
// 重启
sudo reboot
以上几步做了配置内核前的基本操作,接下来进行xenomai的配置,首先下载Linux 3.14.17和xenomai 2.6.4的源码:
cd /usr/src
sudo wget http://download.gna.org/xenomai/stable/xenomai-2.6.4.tar.bz2
sudo tar xfv xenomai-2.6.4.tar.bz2
sudo wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.14.17.tar.xz
sudo tar xfv linux-3.14.17.tar.xz
sudo ln -s /usr/src/linux-3.14.17 /usr/src/linux
sudo cp -vi /boot/config-`uname -r` linux/.config
此处需要自行下载补丁ipipe-core-3.14.17-x86-4.patch,并将其用特权模式拷贝到/usr/src/xenomai-2.6.4/ksrc/arch/x86/patches/下,补丁官方下载地址为:
https://xenomai.org/downloads/ipipe/v3.x/x86/older/
然后执行:
sudo xenomai-2.6.4/scripts/prepare-kernel.sh --arch=x86_64 --adeos=/usr/src/xenomai-2.6.4/ksrc/arch/x86/patches/ipipe-core-3.14.17-x86-4.patch --linux=/usr/src/linux-3.14.17
接下来配置内核:
cd linux
sudo make menuconfig
配置选项如下:
* Real-time sub-system
–> Xenomai (Enable)
–> Nucleus (Enable)
* Power management and ACPI options
–> Run-time PM core functionality (Disable)
–> ACPI (Advanced Configuration and Power Interface) Support
–> Processor (Disable)
–> CPU Frequency scaling
–> CPU Frequency scaling (Disable)
–> CPU idle
–> CPU idle PM support (Disable)
* Pocessor type and features
–> Processor family
–> Core 2/newer Xeon (if \”cat /proc/cpuinfo | grep family\” returns 6, set as Generic otherwise) // 此处需要根据自己的CPU配置
* Real-time sub-system
–> Number of registry slots
–> 4096
–> Size of the system heap
–> 2048 Kb
–> Size of the private stack pool
–> 1024 Kb
–> Size of private semaphores heap
–> 48 Kb
–> Size of global semaphores heap
–> 48 Kb
接下来编译内核(该步耗时较长):
sudo make-kpkg --bzimage --initrd --append-to-version=-xenomai-2.6.4 -j8 kernel-image kernel-headers modules
编译成功后安装内核:
cd ..
sudo dpkg -i linux-image-*.deb
sudo dpkg -i linux-headers-*.deb
sudo update-initramfs -c -k "3.14.17-xenomai-2.6.4"
sudo update-grub
// 重启
sudo reboot
笔者进行到此步,先检查了此时的内核版本,命令是uname -r
,若不是期待的内核就进行卸载,卸载内核命令sudo apt-get remove linux-image-4.4.0-31-generic
,这是我当前的内核版本,需要根据实际情况修改,然后更新grub,命令sudo update-grub
,重启后再次查看内核版本,一直卸载到内核Linux 3.14.17-xenomai-2.6.4
接下来build-xenomai:
cd /usr/src
sudo mkdir build_xenomai-2.6.4
cd build_xenomai-2.6.4
sudo ../xenomai-2.6.4/configure --enable-shared --enable-smp --enable-x86-sep
sudo make -j8
sudo make install
cd /etc/ld.so.conf.d/
sudo touch xenomai.conf
sudo sh -c "echo '/usr/xenomai/lib' >> xenomai.conf"
sudo ldconfig
echo "export PATH=$PATH:/usr/xenomai/bin:/usr/xenomai/lib:/usr/xenomai/include" >> ~/.bashrc
sudo su
echo "export PATH=$PATH:/usr/xenomai/bin:/usr/xenomai/lib:/usr/xenomai/include" >> ~/.bashrc
exit
sudo addgroup xenomai // 此处观察xenomai GID是不是1001,影响接下来的步骤操作
sudo addgroup root xenomai
sudo usermod -a -G xenomai `whoami`
XenoGID=`cat /etc/group | sed -nr "s/xenomai:.:([0-9]+):.*/\1/p"`
sudo sh -c "echo $XenoGID > /sys/module/xeno_nucleus/parameters/xenomai_gid"
sudo nano /etc/default/grub
// 修改如下:
GRUB_CMDLINE_LINUX_DEFAULT="xeno_nucleus.xenomai_gid=1001"
sudo update-grub
// 重启
sudo reboot
到此为止,xenomai的基本安装配置就已经结束了,下面就行基本的测试:
创建ex01.c文件,程序代码如下:
#include
#include
#include
#include
#include
#include
#include
RT_TASK demo_task;
void demo(void *arg)
{
RT_TASK *curtask;
RT_TASK_INFO curtaskinfo;
// hello world
rt_printf("Hello World!\n");
// inquire current task
curtask=rt_task_self();
rt_task_inquire(curtask,&curtaskinfo);
// print task name
rt_printf("Task name : %s \n", curtaskinfo.name);
}
int main(int argc, char* argv[])
{
char str[10] ;
// Perform auto-init of rt_print buffers if the task doesn't do so
rt_print_auto_init(1);
// Lock memory : avoid memory swapping for this program
mlockall(MCL_CURRENT|MCL_FUTURE);
rt_printf("start task\n");
/*
* Arguments: &task,
* name,
* stack size (0=default),
* priority,
* mode (FPU, start suspended, ...)
*/
sprintf(str,"hello");
rt_task_create(&demo_task, str, 0, 50, 0);
/*
* Arguments: &task,
* task function,
* function argument
*/
rt_task_start(&demo_task, &demo, 0);
}
对实时任务的编译和普通任务编译有所区别,具体如下:
xeno-config --xeno-cflags
xeno-config --xeno-ldflags
export CFLAGS=`xeno-config --xeno-cflags`
export LDFLAGS=`xeno-config --xeno-ldflags`
gcc $CFLAGS ex01.c $LDFLAGS -lnative -lxenomai -o ex01 //注意顺序,否则会错
// 运行之前,告诉Linux动态库的位置
export LD_LIBRARY_PATH=/usr/xenomai/lib
sudo ./ex01
若输出
start task
Hello World!
Task name: hello
则配置成功,其他基本测试可以在/usr/xenomai/bin下进行,sudo ./latency和sudo ./switchtest等。
编译其他实时程序的时候,建议也按照这个编译过程执行。
这是笔者综合了三篇文章加上自己的实际操作所写的,在物理机和虚拟机都是可以运行并能做测试的,如果出现侵权或者不尊重原作的行为,请作者看到后及时通知,定马上删除。
参考链接:
https://gist.github.com/cfpperche/2e68ac44a081aaa0628b
http://rtt-lwr.readthedocs.io/en/latest/rtpc/xenomai.html
http://www.itdadao.com/articles/c15a668841p0.html