====== RTAI ====== Under construction. This page needs a bit of research on my part to complete. Please obtain example code from the [[https://www.rtai.org/ |RTAI]] website for the moment. ===== Introduction ===== RTAI is a system that allows your Linux operating system to run so-called 'hard' realtime tasks. By 'hard' we mean that it isn't just 'best effort' it really will do something regularly, to a schedule dictated by you, no matter how heavily loaded the system. RTAI comes in two parts: a set of patches for your kernel and a library you can link your programs against which allows them to become realtime tasks. It may feel like you're running your program under Linux just like any other normal user-mode program, however under the hood you are taking full control of the hardware, and any other processes will only run as the remaining CPU time permits. The above is a gross over-simplification of what is actually happening and is simply a lay-person's introduction. Please investigate the RTAI documentation for discussion of things like jitter, latency and so on ===== Getting RTAI ===== You can download the latest version of RTAI from the website: # wget https://www.rtai.org/userfiles/downloads/RTAI/rtai-5.1.tar.bz2 # tar xvf rtai-5.1.tar.bz2 # cd rtai-5.1 ===== Identifying the HAL patch ===== RTAI requires the application of kernel patches, but carries patches only for certain kernel versions. You can find out which ones like this: # find ./ -name hal\*.patch ./base/arch/x86/patches/hal-linux-3.10.32-x86-8.patch ./base/arch/x86/patches/hal-linux-3.18.20-x86-6.patch ./base/arch/x86/patches/hal-linux-4.4.71-x86-10.patch ./base/arch/x86/patches/hal-linux-4.9.80-x86-4.patch ./base/arch/x86/patches/hal-linux-4.4.115-x86-10.patch ./base/arch/x86/patches/hal-linux-4.1.18-x86-9.patch ./base/arch/x86/patches/hal-linux-3.16.7-x86-5.patch ./base/arch/x86/patches/hal-linux-3.14.44-x86-12.patch ./base/arch/x86/patches/hal-linux-4.9.51-x86-4.patch Now check your own kernel version: # uname -r 4.4.14 We can see that the closest kernel with a HAL patch after this is 4.4.71, so that's the one to aim for. For now just copy the patch to the kernel source location: # cp base/arch/x86/patches/hal-linux-4.4.71-x86-10.patch /usr/src ===== Switching Kernel Version ===== We need to get ourselves on a kernel of the correct version (above) before we do anything else. Start by downloading and uncompressing the new version: # cd /usr/src # wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.71.tar.xz # tar xvf linux-4.4.71.tar.xz # cd linux-4.4.71 Now use the existing configuration as a base and 'make oldconfig'. There may be some new config options that get prompted for, it's likely you can accept the defaults though. # zcat /proc/config.gz > .config # make oldconfig If you have a more obscure filesystem for your root partition you may now want to 'make menuconfig' to ensure it's compiled into your kernel [*] instead of a module [m], or you may want to investigate using initrds. For anyone using the default EXT4, you're good to just make now: # make And then copy the results to install: # make modules_install # cp arch/x86_64/boot/bzImage /boot/vmlinuz-rtai # cd /boot Edit the lilo config: # vi /etc/lilo.conf And ensure there's a section added like this: image = /boot/vmlinuz-rtai root = /dev/sda1 label = Linux-4.4.71 read-only Leave the other kernel image section in there as a second option in case something goes wrong with the boot, but you want to make the new one the default (the first entry). ===== Patching the Kernel ===== When you're sure that new kernel works and your system boots and functions, now's the time to add the RTAI patches: # cd /usr/src/linux-4.4.71 # patch -p1 < /usr/src/hal-linux-4.4.71-x86-10.patch And now you can make the kernel again. This may take some time: # make If there are any prompted questions about the RTAI it's safe to leave them as defaults. Next install the new kernel. # make modules_install # cp arch/x86_64/boot/bzImage /boot/vmlinuz-rtai You've already configured LILO, so just re-run it to reference the newly copied kernel: # lilo Reboot the machine to ensure that the new kernel works. ===== Compiling/Installing RTAI ===== Before compiling RTAI itself we must ensure /usr/src/linux points to the new RTAI kernel. # cd /usr/src # rm linux # ln -s linux-4.4.71 linux Next just compile in the normal way: # cd rtai-5.1 # ./configure # make # make install At this point, some kernel modules should have arrived in /usr/realtime/modules/ For now you can load them manually, however in the future you can add them to /etc/rc.d/rc.local: # /sbin/insmod /usr/realtime/modules/rtai_hal.ko # /sbin/insmod /usr/realtime/modules/rtai_sched.ko # /sbin/insmod /usr/realtime/modules/rtai_fifos.ko Check they are there: # lsmod | grep rtai rtai_fifos 39941 0 rtai_sched 118855 1 rtai_fifos rtai_hal 1762779 2 rtai_fifos,rtai_sched Now we need to ensure we can link to the libraries: vim /etc/ld.so.conf Add the line: /usr/realtime/lib and then run (as root): # ldconfig Finally, we are ready to write our first RTAI program. ===== Example Program ===== Here's an example Makefile to compile a really simple realtime program. It uses the rtai-config utility to set everything up: CC = $(shell /usr/realtime/bin/rtai-config --cc) LXRT_CFLAGS = $(shell /usr/realtime/bin/rtai-config --lxrt-cflags) LXRT_LDFLAGS = $(shell /usr/realtime/bin/rtai-config --lxrt-ldflags) all:: rtai-example rtai-example: rtai-example.c $(CC) $(LXRT_CFLAGS) -o $@ $< $(LXRT_LDFLAGS) -llxrt clean:: $(RM) -f rtai-example *~ .PHONY: clean And here is the demo program, rtai-example.c: TODO ===== Dedication ===== This page is dedicated to the memory of captain@captain.at whos pages have been a great source of information in kernel and realtime programming. You can still find his stuff in various archives, e.g. [[http://archive.li/fGaKC | here]]. RIP Captain. ====== Sources ====== * Originally written by [[wiki:user:bifferos | User bifferos]] {{tag>howtos rtai realtime}}