J’ai voulu comparer certains résultats obtenus avec Xenomai sur une carte Pandaboard avec ceux d’un PC classique. J’ai choisi un poste de travail (type bureautique) fonctionnant avec une distribution Ubuntu récente, afin de disposer d’une configuration la plus courante possible.
Installation de Xenomai 2.6.0 sur Ubuntu 11.10
La méthode d’installation est assez simple, mais je la décris ici afin de regrouper les options de compilation et les fichiers de configuration du noyau.
Préparation des sources de Linux
Les sources de Xenomai 2.6.0 et de Linux 2.6.38.8 sont préalablement téléchargées dans mon répertoire personnel (~cpb/
)
[~]$ sudo -i [sudo] password for cpb: [~]# cd /usr/src/ [src]# tar -xjf ~cpb/xenomai-2.6.0.tar.bz2 [src]# tar -xjf ~cpb/linux-2.6.38.8.tar.bz2 [src]# mv linux-2.6.38.8 linux-2.6.38.8-xenomai [src]# xenomai-2.6.0/scripts/prepare-kernel.sh --linux=/usr/src/linux-2.6.38.8-xenomai --adeos=xenomai-2.6.0/ksrc/arch/x86/patches/adeos-ipipe-2.6.38.8-x86-2.10-01.patch --arch=i686 patching file arch/x86/Kconfig patching file arch/x86/include/asm/apic.h patching file arch/x86/include/asm/apicdef.h [...] patching file mm/mmu_context.c patching file mm/mprotect.c patching file mm/vmalloc.c [src]#
Nous disposons donc des répertoires
/usr/src/xenomai-2.6.0
: contenant entre autres les sources des bibliothèques de Xenomai (que nous compilerons en second lieu);
/usr/src/linux-2.6.38.8-xenomai
: les sources du noyau Linux modifié par le patch Adeos/Xenomai.
Compilation du noyau
Je pars de la configuration du noyau Linux 2.6.38 telle qu’elle était fournie avec Ubuntu, puis je la modifierai pour ajuster certains paramètres à Xenomai.
[src]# cd /usr/src/linux-2.6.38.8-xenomai/ [linux-2.6.38.8-xenomai]# cp /boot/config-2.6.38-11-generic ./.config [linux-2.6.38.8-xenomai]# make menuconfig
Dans le menu de configuration, il faut réaliser quelques modifications.
General setup --> <*> Kernel .config support [*] Enable access to .config through /proc/config.gz
Ceci est juste un élément de confort afin de retrouver facilement le fichier .config
du noyau (dans /proc/config.gz
). Je l’utilise systématiquement, sauf dans le cas d’un système embarqué avec de fortes contraintes de taille mémoire.
Processor type and features --> Processor family (Core 2/newer Xeon) -->
Configurez le type de processeur en fonction de votre machine (et pas de la mienne…). Vous pouvez trouver cette information dans /proc/cpuinfo
.
Processor type and features --> [ ] Enable -fstack-protector buffer overflow detection
Power managment and ACPI options --> ACPI Support --> < > Processor
Power managment and ACPI options --> < > APM
Power managment and ACPI options --> CPU frequency scaling --> [ ] CPU frequency scaling
Power managment and ACPI options --> [ ] Cpuidle Driver for Intel Processors
Processor type and features --> Preemption Model --> (X) Preemptible Kernel (Low-Latency Desktop)
Le fichier .config étant préparé, nous pouvons démarrer la compilation en utilisant la méthode Debian / Ubuntu.
[linux-2.6.38.8-xenomai]# make-kpkg --append-to-version -xenomai --initrd buildpackage exec make kpkg_version=12.036+nmu1 -f /usr/share/kernel-package/ruleset/minimal.mk debian APPEND_TO_VERSION=-xenomai INITRD=YES ====== making target debian/stamp/conf/minimal_debian [new prereqs: ]====== [...] test ! -f scripts/package/builddeb.kpkg-dist || mv -f scripts/package/builddeb.kpkg-dist scripts/package/builddeb test ! -f scripts/package/Makefile.kpkg-dist || mv -f scripts/package/Makefile.kpkg-dist scripts/package/Makefile echo done > debian/stamp/build/buildpackage [linux-2.6.38.8-xenomai]#
Sur un système avec n
CPUs, il est possible de lancer plusieurs tâches de compilation en parallèle en ajoutant l’option CONCURRENCY_LEVEL=n
avant make-kpkg
. Voir cet article pour un aperçu des gains de temps de compilation.
La compilation crée dans le répertoire /usr/src
les packages .deb
correspondant au nouveau kernel. Installons-les.
[linux-2.6.38.8-xenomai]# cd /usr/src [src]# dpkg -i *xenomai*deb Sélection du paquet linux-doc-2.6.38.8-xenomai précédemment désélectionné. (Lecture de la base de données... 306802 fichiers et répertoires déjà installés.) [...] Paramétrage de linux-source-2.6.38.8-xenomai (2.6.38.8-xenomai-10.00.Custom) ... dpkg : avertissement : option obsolète « --print-installation-architecture », veuillez utiliser « --print-architecture » à la place. Examining /etc/kernel/src_postinst.d. [src]#
Et redémarrons sur le nouveau noyau.
[src]# /sbin/reboot
Au moment du redémarrage, il est nécessaire de choisir dans le menu de Grub « Previous Linux versions » puis « Ubuntu, avec Linux 2.6.38.8-xenomai« . Une fois le système démarré, nous pouvons vérifier que tout va bien :
[~]# uname -a Linux Logilin-A131 2.6.38.8-xenomai #1 SMP PREEMPT Wed Dec 28 11:05:33 CET 2011 i686 i686 i386 GNU/Linux [~]# dmesg | grep I-pipe [ 0.000000] I-pipe 2.10-01: pipeline enabled. [ 2.378745] I-pipe: Domain Xenomai registered. [~]# dmesg | grep Xenomai [ 2.378745] I-pipe: Domain Xenomai registered. [ 2.378882] Xenomai: hal/i386 started. [ 2.378923] Xenomai: scheduling class idle registered. [ 2.378930] Xenomai: scheduling class rt registered. [ 2.380254] Xenomai: real-time nucleus v2.6.0 (Movin' On) loaded. [ 2.380257] Xenomai: debug mode enabled. [ 2.380508] Xenomai: starting native API services. [ 2.380510] Xenomai: starting POSIX services. [ 2.380543] Xenomai: starting RTDM services. [~]# cat /proc/ipipe/version 2.10-01 [~]# cat /proc/xenomai/version 2.6.0 [~]#
Compilation des bibliothèques de Xenomai
Les options de configuration sont assez sensibles pour le bon fonctionnement des applications. Celles utilisées ci-dessous correspondent à la compilation du noyau avec le fichier de configuration indiqué plus haut. Il peut s’avérer nécessaire de jouer sur les options --enable-smp
--enable-x86-tsc
et --enable-x86-sep
pour ajuster le comportement.
L’option --enable-x86-sep
sert sur les processeurs où la bibliothèque C peut utiliser le mécanisme SYSENTER
/SYSEXIT
pour invoquer les appels-système plutôt que le principe des trappes INT 0x80
. La bibliothèque NPTL sera nécessaire pour fournir les points d’entrée dans le noyau.
[~]# cd /usr/src/xenomai-2.6.0/ [xenomai-2.6.0]# export CFLAGS=-fno-omit-frame-pointer [xenomai-2.6.0]# ./configure --enable-smp --enable-x86-sep --enable-x86-tsc --enable-debug checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c [...] config.status: executing depfiles commands config.status: executing libtool commands [xenomai-2.6.0]# make install Making install in src make[1]: entrant dans le répertoire « /usr/src/xenomai-2.6.0/src » [...] make[2]: quittant le répertoire « /usr/src/xenomai-2.6.0 » make[1]: quittant le répertoire « /usr/src/xenomai-2.6.0 » [xenomai-2.6.0]#
Tests
Pour tester le bon fonctionnement de Xenomai, quelques outils de mesure sont livrés avec le système.
[xenomai-2.6.0]# cd /usr/xenomai/bin/ [bin]# export LD_LIBRARY_PATH=/usr/xenomai/lib/ [bin]# ./cyclictest 0.06 0.26 0.25 1/387 25025 T: 0 (25019) P:99 I: 1000000 C: 26 Min: 4 Act: 15 Avg: 15 Max: 35 (Contrôle-C) [bin]# ./latency == Sampling period: 100 us == Test mode: periodic user-mode task == All results in microseconds warming up... RTT| 00:00:01 (periodic user-mode task, 100 us period, priority 99) RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst RTD| -1.449| 2.415| 19.886| 0| 0| -1.449| 19.886 RTD| -1.470| 2.412| 19.979| 0| 0| -1.470| 19.979 RTD| -1.456| 2.384| 15.410| 0| 0| -1.470| 19.979 RTD| -1.668| 2.401| 20.585| 0| 0| -1.668| 20.585 RTD| -1.445| 2.364| 18.106| 0| 0| -1.668| 20.585 RTD| -1.671| 2.377| 18.016| 0| 0| -1.671| 20.585 RTD| -1.475| 2.384| 19.541| 0| 0| -1.671| 20.585 RTD| -1.470| 2.356| 17.344| 0| 0| -1.671| 20.585 RTD| -1.483| 2.418| 20.039| 0| 0| -1.671| 20.585 RTD| -1.469| 2.374| 14.998| 0| 0| -1.671| 20.585 (Contrôle-C) ---|-----------|-----------|-----------|--------|------|------------------------- RTS| -1.671| 2.388| 20.585| 0| 0| 00:00:10/00:00:10 [bin]#
Naturellement, pour valider une configuration temps-réel, il faudra exécuter ces tests pendant des durées très longues, avec une charge système importante et une activité intense des périphériques.
Conclusion
Je ne conseille pas d’installer Xenomai sur un poste de travail bureautique, ceci ne présente pas d’intérêt et peut même diminuer (très légèrement) les performances moyennes. L’intérêt d’un environnement temps-réel strict comme Xenomai apparaît sur des systèmes industriels ou scientifiques ayant des contraintes temporelles fortes dans leurs interactions avec des périphériques externes. Pour ce type d’applications (employant généralement des cartes embarquées spécifiques ou des PC industriels durcis), on emploie souvent des installations Linux personnalisées plutôt que des distributions grand public. Toutefois, je trouve très intéressant de pouvoir disposer de Xenomai et de tous son environnement de fonctionnement directement sur le poste du développeur, permettant ainsi des tests rapides des applications sans nécessiter un transfert systématique sur la machine cible.
manifique tuto … ca a marché sur mn pc
je voulais vou posez une question par rapport au test comment peut on confirmé a partir des résultats afficher de latency ?
aprés dire ca marche pas au moment de l’execution d’un programme je reçoit l’horrible erreur :
administrateur@ubuntu:~$ sudo ./ex01
Xenomai: incompatible ABI revision level
(user-space requires ‘3’, kernel provides ‘4’).
Bonjour,
J’ai le même problème, avez-vous réussi à le résoudre?
Merci.
Guillaume
Ce genre d’erreur est généralement dû à une différence entre la toolchain utilisée pour compiler le noyau et les bibliothèques de Xenomai et celle employée pour compiler le programme exécutable.
Merci à vous, en effet un paquet (libxenomai) qui n’aurait pas dû être installé était à l’origine du problème. Le désinstaller l’a résolu.
Merci pour ce tutoriel qui m’a beaucoup aidé!
Guillaume
Your tutorial is amazing, great job it all works perfectly! Thank you..
paquet xenomai-runtime pardon