Site affiché en Français Voir le site en English (USA) Voir le site en English (GB)
Vous êtes ici: ac6 > ac6-formation > Temps réel > Programmation Temps-Réel et Multi-Core
Télécharger le catalogue
Télécharger le catalogue
Télécharger la page
Télécharger la page
Ecrivez nous
Ecrivez nous
Version imprimable
Version imprimable
 

RT1 Programmation Temps-Réel et Multi-Core

Comment éviter les pièges de la programmation temps réel et multi-processeur, en particulier sous Linux


formateur
Objectifs
bullet_jaune_1 Découvrez les notions de multitâche temps réel
bullet_jaune_1 Comprendre les problèmes liés aux CPUs multi-coeurs
bullet_jaune_1 Maîtriser la programmation concurrente
bullet_jaune_2 Sur le même processeur
bullet_jaune_2 Sur un système multiprocesseur
bullet_jaune_1 Comprendre les contraintes temps réel
bullet_jaune_2 Déterminisme
bullet_jaune_2 Préemption
bullet_jaune_2 Interruptions
bullet_jaune_1 Interactions avec l'architecture du processeur
bullet_jaune_2 Cache
bullet_jaune_2 Pipeline
bullet_jaune_2 Optimisations
bullet_jaune_2 Multi-core et Hyperthreading
bullet_jaune_1 Débogage d'applications temps réel
bullet_jaune_1 Comprendre la structure d'un noyau temps réel
Ce cours apprend à maîtriser la programmation temps réel et multi-tâches en comprenant comment résoudre efficacement les problèmes rencontrés en fonction des primitives disponibles sur l'OS utilisé.
Matériel
bullet_jaune_2 Un PC Linux par binôme
bullet_jaune_2 Une carte cible sous Linux
bullet_jaune_2 Compilateur et débogueur croisés
bullet_jaune_2 Support de cours imprimé
bullet_jaune_2 Présentation et solutions des exercices
Pré-requis
bullet_jaune_2 Bonne connaissance de la programmation C, si possible en environnement embarqué
bullet_jaune_2 Compréhension de base de l'architecture des processeurs
Démarche pédagogique
bullet_jaune_2 Les exercices s'attachent à mettre en œuvre les mécanismes disponibles pour résoudre des problèmes classiques: Readers-writers, producteurs-consommateurs, le repas des philosophes...
bullet_jaune_2 Chaque exercice comprend une explication détaillée et un schéma, ce qui aide à comprendre le fonctionnement des algorithmes.
bullet_jaune_2 Pour chaque exercice il est fourni un code quasiment complet avec des parties à compléter, ce qui permet, après une phase de compréhension du code fourni, de maîtriser des fonctionnalités qui habituellement prennent des heures à concevoir.
bullet_jaune_2 Le cours comprend des exercices facultatifs destinés à approfondir la compréhension des sujets traités.

Plan
Premier jour
Introduction au temps réel
bullet_jaune_2 Les concepts de base du temps réel
bullet_jaune_2 Les contraintes du temps réel et de l'embarqué
bullet_jaune_2 Multi-tâches et temps-réel
bullet_jaune_2 Multi-coeur et Hyperthreading
Exercice : Installation de l'environnement de développement sur le système hôte (si nécessaire)
Exercice : Installation de l'environnement d'exécution sur la cible
Exercice : Création d'une routine de changement de contexte
Structures de données et parallélisme
bullet_jaune_2 Nécessité des structures de données
bullet_jaune_2 Structures de données et multi-tâches
bullet_jaune_3 Les listes (simple ou double liens)
bullet_jaune_3 Listes circulaires
bullet_jaune_3 FIFOs
bullet_jaune_3 Piles
bullet_jaune_2 Preuves d'intégrité des structures de données
bullet_jaune_3 Assertions
bullet_jaune_3 Pré et post-conditions
Exercice : Construction d'un gestionnaire de listes chaînées génériques utilisable en environnement parallèle
Second jour
Gestion mémoire
bullet_jaune_2 Les algorithmes de gestion mémoire
bullet_jaune_3 Buddy system
Exercice : Écriture d'un gestionnaire de mémoire système simple utilisant l'algorithme "buddy"
bullet_jaune_3 Best fit
bullet_jaune_3 First fit
bullet_jaune_3 Gestion de pools
Exercice : Écriture d'un gestionnaire de mémoire générique, multi-niveau
bullet_jaune_2 Les erreurs mémoire
bullet_jaune_3 Fuites mémoire
bullet_jaune_3 Accès à de la mémoire non allouée ou déjà libérée
Exercice : Amélioration du gestionnaire de mémoire pour la détection d'erreurs mémoire
bullet_jaune_3 Surveillance des piles
Exercice : Amélioration de la commutation de contexte pour surveiller l'utilisation de la pile
Les composants d'un système temps réel
bullet_jaune_2 Les tâches et les descripteurs de tâches
bullet_jaune_3 Contenu du descripteur de tâche
bullet_jaune_3 Listes de descripteurs de tâches
bullet_jaune_2 Changement de contexte
bullet_jaune_2 Mécanismes d'ordonnancement et de préemption
bullet_jaune_3 Ordonnancement avec ou sans tic d'horloge
bullet_jaune_2 Modes d'ordonnancement et preuves d'ordonnançabilité
bullet_jaune_3 Ordonnancement à priorités fixes
bullet_jaune_3 Ordonnancement RMA et EDF
bullet_jaune_3 Ordonnancements adaptatifs
Exercice : Écriture d'un ordonnanceur simple, à priorités fixes
Troisième jour
Gestion d'interruptions dans les systèmes temps-réel
bullet_jaune_2 Besoin d'interruptions dans un système temps réel
bullet_jaune_3 Interruptions de timer
bullet_jaune_3 Interruptions de périphériques
bullet_jaune_2 Notion d'interruption sur niveau ou sur front
bullet_jaune_2 Acquittement matériel et logiciel
bullet_jaune_2 Vectorisation des interruptions
Exercice : Écriture d'un gestionnaire d'interruption simple
bullet_jaune_2 Interruption et ordonnancement
Exercice : Extension de l'ordonnanceur pour supporter un ordonnancement en ronde (round-robin)
bullet_jaune_2 Affectation des interruptions aux processeurs
bullet_jaune_2 Ordonnancement multi processeur
Exercice : Étude d'un ordonnanceur multi-coeurs
Les primitives de synchronisation
bullet_jaune_2 Mise en attente et réveil des tâches
bullet_jaune_2 Sémaphores
Exercice : Mise en œuvre des sémaphores par interaction directe avec l'ordonnanceur
bullet_jaune_2 Exclusion mutuelle
bullet_jaune_3 Spinlocks et masquage d'interruptions
bullet_jaune_3 Mutex ou sémaphores
Exercice : Mise en œuvre du mécanisme de mutex
bullet_jaune_3 Mutex récursifs et non récursifs
Exercice : Vérifier la bonne imbrication des mutex récursifs et l'utilisation de mutex non récursifs
bullet_jaune_3 Le problème de l'inversion de priorité
bullet_jaune_3 L'héritage de priorité (le mécanisme automagique)
bullet_jaune_3 Le plafond de priorité (la réponse centrée sur la conception)
Exercice : Mise en place du mécanisme de plafond de priorité
bullet_jaune_2 Mutexes et variables condition
Exercice : Ajout du support des variables condition aux mutex
bullet_jaune_2 Les boites aux lettres
Quatrième jour
Solutions aux problèmes de parallélisme
bullet_jaune_2 Les divers problèmes de la programmation parallèle
bullet_jaune_3 Accès concurrent non maîtrisé
Exercice : Le problème "producteur-consommateur", ou une illustration d'accès concurrents et sa solution
bullet_jaune_3 Deadlocks (étreinte fatale)
bullet_jaune_3 Livelocks (blocage vivant)
bullet_jaune_3 Starvation (famine)
Exercice : Le problème du "dîner des philosophes", illustration des risques de deadlocks, livelocks et de famine
Les Pthreads sous Linux
bullet_jaune_2 Le standard pthread
bullet_jaune_3 threads
bullet_jaune_3 mutexes et variables condition
Exercice : Résolution du problèmes des lecteurs et des écrivains avec des threads POSIX
bullet_jaune_3 Variables spécifiques à un thread
Exercice : Maintient de statistiques par thread pour le problème des lecteurs et écrivains
bullet_jaune_2 Sémaphores POSIX
bullet_jaune_2 Ordonnancement sous Linux
bullet_jaune_3 changements de contexte
bullet_jaune_3 politiques d'ordonnancement (temps réel, classique)
bullet_jaune_3 préemption
Cinquième jour
Multi-tâches dans le noyau Linux
bullet_jaune_2 La gestion de mémoire du noyau
bullet_jaune_3 Les algorithmes d'allocation de mémoire "buddy" et "slab"
bullet_jaune_2 Gestion des tâches sous Linux
bullet_jaune_2 Threads noyau Linux
bullet_jaune_3 Création
bullet_jaune_3 Terminaison
bullet_jaune_2 Programmation concurrente dans le noyau
bullet_jaune_3 Opérations atomiques
bullet_jaune_3 Spinlocks
bullet_jaune_3 Spinlocks en lecture/écriture
bullet_jaune_3 Sémaphores et sémaphores en lecture/écriture
bullet_jaune_3 Mutexes
bullet_jaune_3 Verrous séquentiels
bullet_jaune_3 Le mécanisme "Lecture/Copie/Mise-à-jour" (RCU)
Exercice : Création d'un mécanisme de barrière d'exécution à partir des primitives de synchronisation du noyau Linux
bullet_jaune_2 Les mécanismes de base de synchronisation de threads
bullet_jaune_3 Les files d'attente
bullet_jaune_3 Les événements de complétion
bullet_jaune_2 Les timers matériels
bullet_jaune_3 Clockevents
bullet_jaune_2 Les timers logiciels
bullet_jaune_3 Délais d'exécution
bullet_jaune_3 Timers noyau
bullet_jaune_3 Timers haute résolution
Exercice : Création d'un évènement de synchronisation, à partir des mécanismes de synchronisation de base