+ +
- -
Systèmes d'Exploitation
Calendrier  Détails
Programmation
 
Calendrier  Détails
Processeurs ARM
 
Calendrier  Détails
Processeurs PowerPC
 
 
 
 
Calendrier  Détails
Communications
 
 
Calendrier  Détails
+ +
> >
- -

Dernières Nouvelles

Webinaire Linux Embarqué avec System Workbench for Linux sur SoC STMicroelectronics STM32MP1 (gratuit)

Contrôle moteur par des gestes avec System Workbench for Linux sur un MCU STM32MP1 (présentation vidéo)

 
ac6 >> ac6-training >> Programmation >> Langages >> Programmation Temps-Réel et Multi-Core Télécharger le catalogue Télécharger la page Ecrivez nous 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
  • Découvrez les notions de multitâche temps réel
  • Comprendre les problèmes liés aux CPUs multi-coeurs
  • Maîtriser la programmation concurrente
    • Sur le même processeur
    • Sur un système multiprocesseur
  • Comprendre les contraintes temps réel
    • Déterminisme
    • Préemption
    • Interruptions
  • Interactions avec l'architecture du processeur
    • Cache
    • Pipeline
    • Optimisations
    • Multi-core et Hyperthreading
  • Débogage d'applications temps réel
  • 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
  • Un PC Linux par binôme
  • Une carte cible sous Linux
  • Compilateur et débogueur croisés
  • Support de cours imprimé
  • Présentation et solutions des exercices
Démarche pédagogique
  • 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...
  • Chaque exercice comprend une explication détaillée et un schéma, ce qui aide à comprendre le fonctionnement des algorithmes.
  • 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.
  • Le cours comprend des exercices facultatifs destinés à approfondir la compréhension des sujets traités.

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