Xenomai 2.6.0 sur Ubuntu 11.10

Publié par cpb
Déc 28 2011

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.

7 Réponses

  1. fedios dit :

    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 ?

  2. fedios dit :

    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’).

    • Guillaume dit :

      Bonjour,

      J’ai le même problème, avez-vous réussi à le résoudre?
      Merci.

      Guillaume

      • cpb dit :

        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.

        • Guillaume dit :

          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

  3. Goran dit :

    Your tutorial is amazing, great job it all works perfectly! Thank you..

  4. Guillaume dit :

    paquet xenomai-runtime pardon

URL de trackback pour cette page