dv3

Introduction

Cette présentation s’adresse à toutes les personnes qui désirent expérimenter la programmation temps réel sous Linux. Elle suppose que vous possédez déjà des compétences sur Linux et Ubuntu. L’installation d’un noyau temps réel dur dans Ubuntu sera utilisée pour piloter un automate avec le logiciel CNC de www.linuxcnc.org

Important cette installation est expérimentale. Avant de l’utiliser sur un équipement de valeur, vous devez effectuer des tests très approfondis. Le hardware est un élément en tout cas aussi important que le logiciel dans l’exécution des programmes temps réel et celui-ci doit être sélectionné en conséquence. Pour toutes ces raisons, l’auteur ne donne aucune garantie sur le fonctionnement de ces systèmes.

Il n’est pas nécessaire d’avoir un ordinateur dernier cri et puissant pour cette expérimentation. En particulier il faut qu’il soit équipé d’un ou deux ports parallèles. Si votre machine n’est pas équipée de ce genre de périphérique, vous devrez probablement acheter une carte additionnelle.

Vous trouverez dans le menu ci-dessous un ensemble de scripts qui automatisent ces tâches. Ceci aussi pour une localisation différente que le Français par contre les exemples du texte fonctionnent que sur un système en français. La durée des préparations avant la compilation du noyau est d’environs une heure cela varie selon votre connexion internet. La compilation peut durer de quelques minutes à plusieurs heures selon la puissance de la machine.

Couramment dans Linux les sources sont déposées dans le dossier usr/src mais dans cette méthode j’utilise un dossier nommé Xenomai dans le dossier utilisateur.

La commande sudo dont j’abuse l’usage dans mes exemples permet l’exécution d’une commande en mode super utilisateur. On peut en limiter l’usage en gérant les droits de l’utilisateur, mais ce n’est pas le but de mon article.

Quelques références

On retrouve les dernières versions
    de Xenomai sur ce lien : http://download.gna.org/xenomai/stable/
    des noyaux Linux sur ce lien : https://www.kernel.org/pub/linux/kernel/

Le site de Xenomai http://www.xenomai.org/

Installation d’Ubuntu et préparation

La première étape consiste donc à installer Ubuntu 12.04 LTS. Vous pouvez télécharger l’image ISO du disque d’installation depuis le site http://www.ubuntu.com/download/desktop sélectionnez la version desktop 32 ou 64 bits et gravez le DVD. (voire la note ci-dessous)

Le CD est multilingue et pour en profiter cliquez ou utilisez la touche [Enter] quand cette icône s’affiche.

Icone Ubuntu

Le choix de la langue et de la localisation de votre installation sera par la suite assisté et trivial.
Pour terminer, installez les dernières mises à jour avec le gestionnaire de mise à jour.

Personnalisation et installation des utilitaires

Note Les noms de dossiers des exemples sont donnés pour une version 32 bits et en français d’Ubuntu. Les scripts de ce document sont adaptés à d’autres langues et versions.
Le gestionnaire de paquets synaptic : (optionnel)

Cet outil graphique (GUI) permet l’ajout et la suppression de paquet dans votre système.

~$ sudo apt-get install synaptic
L'éditeur Geany (optionnel)

Gedit est un autre éditeur et il est déjà présent sur le système, mais j’apprécie Geany un EDI très bien fait. Idéal pour éditer du code Python, C, PHP et bien d’autres.

~$ sudo apt-get install geany
Grub customizer (important)

Outil de personnalisation de GRUB le bootloader d’Ubuntu. Ce qui nous permettra de choisir entre différents noyaux (Kernel) au démarrage du système et éventuellement revenir en arrière après une installation.

~$ sudo add-apt-repository ppa:danielrichter2007/grub-customizer
~$ sudo apt-get update
~$ sudo apt-get install grub-customizer
Installation d’outils divers pour la compilation
~$ sudo apt-get install devscripts debhelper dh-kpatches findutils autotools-dev
autoconf automake libtool
Installation des outils de compilation du noyau
~$ sudo apt-get install fakeroot build-essential crash kexec-tools
makedumpfile kernel-wedge kernel-package
~$ sudo apt-get build-dep linux
~$ sudo apt-get install git-core libncurses5 libncurses5-dev libelf-dev
asciidoc binutils-dev

Télécharger les sources de Xenomai et décompression

Les versions stables de Xenomai sont listées ici : http://download.gna.org/xenomai/stable/ dans ma démonstration je vais utiliser la dernière version du moment : 2.6.3 (octobre 2013)

Le téléchargement dans le dossier de votre environnement
~$ cd ../Téléchargements
~$ wget http://download.gna.org/xenomai/stable/xenomai-2.6.3.tar.bz2
~$ cd ..
Décompression dans le dossier Xenomai
~$ mkdir -p Xenomai
~$ cd Xenomai
~$ tar -xvjf ../Téléchargements/xenomai-2.6.3.tar.bz2

Vous trouverez dans ce sous-dossier de xenomai-2.6.3 ksrc/arch/x86/patches/ les patchs possibles pour différentes versions du noyau. Dans la version sélectionnée les noyaux patchables sont la 3.4.6, 3.5.7, 3.8.13. Le fichier README dans le même dossier donne des indications pour trouver d’autres patchs.
Ce lien propose d’autres patchs http://download.gna.org/adeos/patches/ Le patch ipipe-core-3.8-x86-1.patch trouvé dans cet emplacement n’a pas fonctionné chez moi.

Construction et installation des paquets Xenomai
~$ cd xenomai-2.6.3
~$ dpkg-buildpackage -uc -us
~$ cd ..
~$ sudo dpkg -i *.deb

Télécharger les sources du noyau et compilation

Télécharger,décompresser et préparer

Le téléchargement dans le dossier de votre environnement
~$ cd ../Téléchargements
~$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.8.13.tar.bz2
~$ cd ../Xenomai
Décompression dans le dossier linux-xx.x.x
~$ tar -xvjf ../Téléchargements/linux-3.8.13.tar.bz2
Application des patchs aux sources du noyau

Dans cette opération il est nécessaire de connaitre la largeur de mot de votre processeur 32 ou 64 bits pour le paramètre --arch. Pour trouver cette information, vous pouvez lancer cette commande elle retourne le type utilisé par Ubuntu installé sur la machine.

-$ uname -m

Et lscpu va retourner les informations sur le processeur. Si vous filtrez le résultat avec grep sur le mot bit vous connaitrez les possibilités du processeur de la machine.

-$ lscpu | grep bit
Note La largeur de mot du processeur 32 ou 64 bits doit être la même que celle pour laquelle votre système d’exploitation a été compilé.

Voici un exemple pour la version 32 bits. Vous pouvez observer le paramètre --arch ou se trouve cette information. Le paramètre --ipipe spécifie l’emplacement des patchs du noyau. Vérifiez le nom du fichier il peut évoluer avec les versions ou omettez le paramètre --ipipe et laisser-faire le script. Enfin le paramètre --Linux indique le dossier des sources Linux à patcher.

~$ cd xenomai-2.6.3
~$ scripts/prepare-kernel.sh --arch=i686
--ipipe=ksrc/arch/x86/patches/ipipe-core-3.8.13-x86-4.patch
--Linux=../linux-3.8.13 --verbose
~$ cd ../linux-3.8.13

Compilation

Adaptation de la configuration avec l’outil menuconfig =====

Il est nécessaire de configurer le noyau avant sa compilation. Cette configuration porte essentiellement sur les paramètres ACPI. Nous devons désactiver les propriétés susceptibles de modifier le rythme de l’horloge du CPU. Il est évident que pour une utilisation temps-réel il n’est pas concevable que le processeur puisse changer sa fréquence de fonctionnement ou se mettre en pause.

Important Ces mêmes modifications doivent aussi être appliquées au BIOS de votre système sinon cela ne fonctionnera pas correctement.
~$ make menuconfig
Note Attention à dimensionner correctement la console aux minimum 19 lignes de 80 caractères.

Dans le menu Processor type and features --→   image
    Désactiver Enable -fstack-protector buffer overflow detection   image
    Dans Processor family Sélectionner le type de processeur de votre machine image
    La commande grep -i "model name" /proc/cpuinfo vous informe.
    Dans Preemption Model
       Sélectioner Preemptible Kernel (Low-Latency Desktop) image

Dans le menu Power management and ACPI options --→   image
    Désactiver Hibernation   image
    Désactiver ACPI     image

    Dans le menu CPU Frequency scaling --→   image
      Désactiver CPU Frequency scaling   image

Et sauver. Vous retrouverez vos réglages dans le fichier caché .config du dossier ~/Xenomai/linux-x.x.xx

Si vous désirez compiler à partir d’une version minimale de la configuration, utilisez la commande suivante avant de commencer.

make defconfig

Attention, cette approche demande plus de compétence. Vous trouverez des informations plus précises sur cette page cette page.

Compilation du noyau

Nous voici arrivés à la compilation du noyau. La première commande va faire le ménage. Vous pouvez optimiser les performances de la compilation en indiquant dans le paramètre CONCURRENCY_LEVEL le nombre de tâches de compilation exécutables en parallèle. La valeur est au moins égale ou légèrement supérieure au nombre de processeurs de votre machine.
Et cette commande pour extirper cette information de votre système.

~$ lscpu | grep '^CPU'

fakeroot lance la commande make-kpkg en mode super utilisateur les paramètres précisent que l’on compile le noyau avec un disque mémoire pour le boot et ce noyau aura le nom donné dans append-to-version. Les paquets de l’image du noyau kenel-image, les entêtes kernel-headers et des modules seront générés.

~$ make-kpkg clean
~$ CONCURRENCY_LEVEL=5
~$ fakeroot make-kpkg --bzimage --initrd --append-to-version=-xenomai-2.6.3
kernel-image kernel-headers modules
~$ cd ..
Important Cette opération peut durer de quelques minutes à plusieurs heures. La durée varie sensiblement selon les performances de votre système.

Pour installer les paquets compilés, cette commande.

~$ sudo dpkg -i linux*.deb

Installation du noyau

Mise à jour de grub

Je suppose que cela s’est bien passé alors on peut installer le noyau dans le gestionnaire de boot et commencer à expérimenter

~$ sudo update-initramfs -c -k 3.8.13-xenomai-2.6.3
~$ sudo update-grub

Puis on relance la machine (reboot)

~$ sudo /sbin/reboot

L’outil grub-customizer vous permet de personnaliser le processus de démarrage, choix du noyau par défaut, écran de boot etc.

~$ grub-customizer

Je propose de paramétrer l’affichage du menu de boot avec une latence de 10 secondes. Cela nous permet de sélectionner au démarrage une autre version du noyau. Ce réglage se retrouve dans l’onglet "Paramètres généraux" cocher "afficher le menu". Pour les autres options, je vous laisse faire vos propres expériences.

Grub Screen
Reprendre, cela ne s’est pas bien passé

Si vous voulez reprendre la configuration et recompiler le noyau exécutez ces commandes. Elles vont supprimer les fichiers de compilation et le .config

~$ cd ~/Xenomai/linux-3.8.13
~$ make mrproper

Premier test

Nous sommes prêts à effectuer les premiers tests. Nous vérifions la version du noyau actif avec la commande uname. Celle-ci retourne nom du système, version et date du noyau, type de plateforme, type de système.

~$ uname -a

Si vous lisez 3.8.13-xenomai-2.6.3 c’est que notre noyau est bien en service.

La commande dmesg avec un filtrage grep et I-pipe permet de confirmer que les processus Xenomai ont bien démarré.

~$ dmesg | grep I-pipe
[    0.905660] I-pipe: head domain Xenomai registered.
~$ dmesg | grep Xenomai
[    0.905660] I-pipe: head domain Xenomai registered.
[    0.906088] Xenomai: hal/x86_64 started.
[    0.906341] Xenomai: scheduling class idle registered.
[    0.906343] Xenomai: scheduling class rt registered.
[    0.910618] Xenomai: real-time nucleus v2.6.3 (Lies and Truths) loaded.
[    0.910620] Xenomai: debug mode enabled.
[    0.911711] Xenomai: starting native API services.
[    0.911716] Xenomai: starting POSIX services.
[    0.911824] Xenomai: starting RTDM services.

Xenomai installe un petit test de latence que nous allons construire puis lancer.

~$ cd /usr/share/libxenomai-dev/examples/native/
~$ sudo make
~$ sudo ./trivial-periodic

Vous trouverez des tests plus conséquents dans le dossier /usr/lib/xenomai/testsuite