Xenomai
Some notes on getting a Xenomai system running under buildroot.
Build environment
- Installed Ubuntu 12.04 LTS.
- Downloaded buildroot-2011.11.
- Added build-essential, automake, bison, gawk, perl, zlib devel, ncurses devel, perhaps some other packages NB: If you are missing buildroot dependencies and you find out half-way through a build, rebuild from scratch, or risk getting a non-working system.
Buildroot/Xenomai version selection
The easiest way to do this without having to mess around with grub is to create a bootable CD image. Versions of buildroot up to 2012.08 support this. Choosing Kernel headers 3.4.X and kernel version 3.4.6 allows the ipipe-core-3.4.6-x86-2.patch from Xenomai 2.6.2 to be applied.
So we:
- Use 2012.08 Buildroot
- Bump Xenomai version to 2.6.2 (the latest)
- Remove lfs patch from Buildroot/package/xenomai directory as it won't apply to Xenomai 2.6.2.
Buildroot configuration.
# make menuconfig
Target Architecture -> i386
Target Architecture Variant -> i486
Toolchain -> Kernel Headers -> 3.4.x #### NB: This means we'll download two kernels, not one!
System Configuration -> Port to run a getty -> tty1
Package selection -> Real-Time -> Xenomai Userspace
Filesystem Images -> iso image
Bootloaders -> syslinux -> Install isolinux
Kernel -> Kernel version -> Same as toolchain kernel
Kernel -> Kernel configuration -> Using a defconfig
Kernel -> Defconfig name -> i386
Kernel -> Linux Kernel extensions -> Adeos/Xenomai real-time patch [*]
*** Now run 'make' to build the toolchain/download the kernel ***
Configure the kernel
# make linux-menuconfig
Filesystems -> Second extended fs support (ANNOYING BUG IN BUILDROOT!!)
Power management and ACPI options -> Power management support -> [ ]
Power management and ACPI options -> CPU Frequency scaling -> [ ]
Real-time sub-system -> machine -> enable fpu support -> [ ]
# make
Due to a bug in VirtualBox, it won't boot the ISO rootfs because it is called rootfs.iso9660. Rename it to rootfs.iso, or make a link, and then VirtualBox will boot OK.
Compiling simple Xenomai example using Xenomai native interface
Get an example
Since we've not really 'installed' Xenomai on this machine, we have to fiddle about. First figure out what flags we need:
# cd ./output/host/usr/i486-unknown-linux-uclibc/sysroot
# ./usr/bin/xeno-config --skin native --cflags
-I/usr/include/xenomai -D_GNU_SOURCE -D_REENTRANT -Wall -pipe -D__XENO__
# ./usr/bin/xeno-config --skin native --ldflags
-lnative -L/usr/lib -lxenomai -lpthread
Use what we found to create a simple makefile, with includes and libs relative to the sysroot location. Put it in a directory beside the buildroot one.
Makefile
BUILDROOT:=../buildroot-2012.08
BUILD:=$(BUILDROOT)/output/build
HOST:=$(BUILDROOT)/output/host
SYSROOT:=$(HOST)/usr/i486-unknown-linux-uclibc/sysroot
CC:=$(HOST)/usr/bin/i486-unknown-linux-uclibc-gcc
CFLAGS:=-I$(SYSROOT)/usr/include/xenomai -D_GNU_SOURCE -D_REENTRANT -Wall -pipe -D__XENO__
LDFLAGS:=-lnative -L$(SYSROOT)/usr/lib -lxenomai -lpthread
all: trivial-periodic
trivial-periodic.c : $(BUILD)/xenomai-2.6.2/examples/native/trivial-periodic.c
cp $< $@
trivial-periodic.o : trivial-periodic.c
$(CC) $(CFLAGS) -o $@ -c $<
trivial-periodic : trivial-periodic.o
$(CC) -o $@ $< $(LDFLAGS)
The file 'trivial-periodic' can be copied into the VM and run. For some reason ldd reports different required libraries to the ones that exist on the target, but it doesn't seem to matter. The binary runs fine. It segfaults after aborting with ctrl-C though.