|
L'utilisation de Linux dans les environnements industriels, pour des
applications à fortes contraintes temporelles ou sur des systèmes
retreints nécessite une bonne connaissance des mécanismes sous-jacents,
comme l'ordonnancement des tâches, la gestion mémoire, ou le
fonctionnement des drivers du noyau.
Ce cours vous propose une exploration en profondeur de l'ordonnanceur,
et l'étude des possibilités - et des limites - de Linux pour des
applications temps-réel.
En outre on y trouvera une présentation détaillée des outils et
environnements de développement, ainsi que les solutions disponibles
pour la construction de systèmes embarqués autour d'un noyau Linux.
Organisation
Durée : 4 jours.
Pré-requis : les participants doivent avoir une connaissance
du système Unix/Linux (niveau utilisateur), ainsi qu'une bonne familiarité
avec le langage C.
Thèmes abordés
- Développement industriel sous Linux : outils de développement et de mise au
point des applications, utilisation de l'environnement Eclipse, compilation et débogage
croisés pour une cible embarquée, ajustement et compilation du noyau Linux.
- Ordonnancement sous Linux : multi-tâche (processus et threads) et communication
entre tâches, configuration de l'ordonnanceur temps-partagé classique, utilisation de
l'ordonnanceur temps-réel (souple) de Linux.
- Temps-réel strict sous Linux : principe du temps-réel strict, solutions pour
Linux, mise en oeuvre et développement avec les solutions RTAI et Xenomai.
- Linux embarqué : panorama de solutions embarquées avec Linux ou ucLinux, construction
d'un noyau et d'un environnement réduit, étude du boot du système, démarrage automatique des
applications personnalisées.
e
Plan détaillé
Première journée - Environnements et outils de développement industriel sous Linux
1ère séquence 9h00-10h30 - Environnement Linux
Introduction à Linux et aux logiciels libres.
Licences GPL, LGPL, BSD et implications pour le développement industriel.
Versions du noyaux et distributions courantes de Linux.
2ème séquence 10h45-12h15 - Outils de développement libres
Environnements intégrés (Eclipse, KDevelop).
Editeurs de textes (Vi, Emacs, Nedit, Kwrite).
Outils de compilation (Gcc, Tcc, Gas) et fichiers Makefile.
Outils de débogage et de mise au point (Gdb, Ddd, Gprof, Gcov, Strace, Ltrace).
Débogage des allocations mémoire (Mtrace, Mcheck, Electric Fence, Valgrind).
Compilation et utilisation de bibliothèques statiques et dynamiques.
Travaux pratiques :
Utilisation du compilateur GCC, effets des différentes options.
Détection d'erreurs à la compilation, à l'édition des liens.
Débogage en cours de fonctionnement avec GDB.
Débogage post-mortem avec GDB.
Détection de fuites mémoires.
Détection de débordements de buffers.
Statistiques d'exécution et tests en couverture.
Pause déjeuner
3ème séquence 13h30-15h15 - Développement avec Eclipse et le CDT
Présentation et utilisation de l'environnement Eclipse avec le plug-in CDT.
Création de projet, assistance en ligne, indexation.
Débogage classique, débogage post-mortem, débogage d'application en fonctionnement.
Travaux pratiques :
Création et compilation d'application avec Eclipse.
Utilisation du débogueur intégré.
Compilation et utilisation de bibliothèques statiques et dynamiques avec Eclipse.
4ème séquence 15h30-17h00 - Développement avancé, contexte industriel
Compilation et installation du noyau Linux 2.6.
Création et utilisation d'une chaîne de compilation croisée.
Travaux pratiques :
Compilation et installation d'un noyau Linux personnalisé.
Utilisation d'une chaîne de compilation croisée et test sur carte à processeur ARM.
Utilisation d'Eclipse pour compilation croisée et débogage distant (du PC de développement vers la cible à processeur ARM).
Deuxième journée - Ordonnancements temps-partagé et temps-réel souple
1ère séquence 9h00-10h30 - Multi-tâches sous Linux
Processus : principe, création, déroulement…
Threads : concepts, création et exécution de threads.
Synchronisation de tâches : sémaphores, mutex, signaux, etc.
Travaux pratiques :
Création de processus, attente de fin de processus fils, transmission de code de retour.
Création de threads, vérification du partage des données.
Synchronisation de threads par mutex et verrous rwlock.
Synchronisation de processus par sémaphores et signaux.
2ème séquence 10h45-12h15 - Mesures horaires et attentes
Précision des mesures horaires et des attentes (usleep et nanosleep).
Fonctionnement périodique (setitimer et timers Posix).
Travaux pratiques :
Verification de la précision des mesures avec time(), gettimeofday() et lecture du TSC.
Vérification de la granularité et de la régularité des sommeils et des timers.
Pause déjeuner
3ème séquence 13h30-15h15 - Temps partagé sous Linux
Configuration des priorités des processus.
Implications de la préemptibilité du noyau 2.6.
Travaux pratiques :
Influences des priorités sur l'ordonnancement temps-partagé.
Visualisation du partage du temps CPU entre processus.
4ème séquence 15h30-17h00 - Temps-réel souple Posix.1b
Principes, configuration de l'ordonnancement temps-réel des processus et des threads.
Problèmes algorithmiques liés au temps-réel (synchronisation, inversion de priorité, etc.) et solutions.
Limites du temps-réel sous Linux standard.
Travaux pratiques :
Étude de l'ordonnanceur Linux : Noyaux 2.0 à 2.4, noyaux 2.6.
Création de processus temps-réel. Verification de leur efficacité.
Vérification de la précision des timers et sommeils.
Troisième journée - Temps-réel strict sous Linux
1ère séquence 9h00-10h30 - Linux et le temps-réel strict
Concepts de temps-réel strict : Principe des micro-noyaux RT-Linux, RTAI, Adeos, Xenomai, LXRT.
Installation de RTAI et écriture de taches.
Travaux pratiques :
Compilation et installation de RTAI.
Création de tâches temps-réels simples.
2ème séquence 10h45-12h15 - API essentielle de RTAI
Tâches périodiques et sporadiques.
API de RTAI : attentes actives et mises en sommeil.
Timers temps-réel. Configuration du timer matériel.
Choix d'un ordonnancement périodique ou one-shot.
Synchronisation des tâches par sémaphores, files de message et RPC.
Communication avec les processus utilisateur par fifos temps-réel et buffers partagés.
Travaux pratiques :
Création de tâches périodique.
Communication entre tâches temps-réel et processus.
Vérification de la granularité et de la précision des timers.
Pause déjeuner
3ème séquence 13h30-15h15 - RTAI avancé et LXRT
Gestion bas-niveau des interruptions, et émulation d'interruptions pour le noyau Linux.
Utilisation de l'extension LXRT : Ordonnancement temps-réel strict en mode utilisateur.
Travaux pratiques :
Création de tâches et basculement en temps-réel strict.
Gestion des interruptions depuis l'espace utilisateur.
Communication avec les autres tâches.
4ème séquence 15h30-17h00 - Xenomai :une autre solution temps-réel
Installation et API de Xenomai : API native et émulation des API Psos, Vrtx, VxWorks.
Travaux pratiques :
Installation de Xenomai.
Ecriture de tâches périodiques et de gestionnaires d'interruption.
Utilisation des API d'émulation.
Quatrième journée - Environnements restreints et systèmes embarqués
1ère séquence 9h00-10h30 - Choix d'une solution embarquée
Problématique des systèmes embarqués. Contraintes matérielles, logicielles et opérationnelles.
Choix d'un système d'exploitation embarqué. Panorama de solutions libres.
Système uCLinux : API, environnement de développement.
Linux embarqué : choix d'une version du noyau, et options essentielles pour la réduction de sa taille.
Système de fichiers généraux (Ext2/3, Reiserfs, Vfat) et spécifiques pour les systèmes embarqués (Cramfs ou Jffs).
Travaux Pratiques :
Installation de la chaîne de compilation uCLinux. Compilation d'une application personnalisée pour uCLinux.
Transfert et test sur cible à processeur MC68EZ328.
Compilation d'un noyau Linux de taille réduite.
Création d'un système de fichiers.
2ème séquence 10h45-12h15 - Construction d'une solution embarquée personnelle
Bibliothèques système standards et réduites (uClibc, Newlib, DietLibc).
Applications et utilitaires à embarquer (Busybox, TinyLogin, EmbUtils, etc.).
Applications réseau minimales. Configuration de Bootp, Nfs, Tftp.
Interface utilisateur : Notification par Leds, afficheur LCD texte (LCDproc) ou graphique (uLCD), écran texte, semi-graphique (Ncurses) et graphique.
Interfaces graphiques optimisées. Configuration du FrameBuffer Vga et Vesa. Utilisation des modules DirectFB et FBUI.
Interfaces graphiques Qt-embedded, Gtk, Nano-X.
Configuration d'un chargeur de démarrage (Uboot, RedBoot, Grub, Lilo). Installation en mémoire flash (XIP).
Travaux pratiques
Incorporation d'applications minimales et test sur périphérique amovible (disquette ou clé USB).
Ecriture d'application utilisant une interface par Leds ou afficheur LCD.
Utilisation d'un environnement graphique minimal nano-X. Installation et configuration d'un serveur HTTP embarqué.
Pause déjeuner
3ème séquence 13h30-15h15 - Analyse et personnalisation du boot du système
Phase de boot : Mise sous tension, Bios, Chargeur (Lilo, Grub, UBoot) du noyau.
Démarrage du noyau et chargement d'un disque ram préliminaire (initrd). Lancement du processus Init.
Initialisation depuis l'espace utilisateur : fichier /etc/inittab et script rc.sysinit.
Changement de RunLevel et invocation des scripts rc.d.
Chargement des services (démons).
Rappels concernant la programmation shell.
Travaux pratiques :
Création et personnalisation d'un disque initrd.
Remplacement du processus Init par une version personnalisée et remplacement par un script shell.
Lancement d'un démon en arrière-plan.
Démarrage automatique d'une application en mode texte, et en mode graphique.
4ème séquence 15h30-17h00 - Conclusion
Notions de sécurité informatique sur les systèmes embarqués.
Discussions libres sur l'ensemble des thèmes abordés.
Travaux pratiques :
Expérimentations libres suivant les demandes des participants.
|