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

L71 Programmation temps réel

La programmation embarquée et temps réel en C, C++ et Java(TM).

Java est une marque déposée de Sun Microsystems
Objectifs
bullet_jaune_1 Découvrir les concepts de base du multi-tâches et du temps réel
bullet_jaune_1 Apprendre à lire des diagrammes de conception temps-réel UML-RT
bullet_jaune_1 Comprendre le fonctionnement d'une chaîne de compilation
bullet_jaune_1 Analyser les options d'optimisation de code du compilateur
bullet_jaune_1 Développer des applications pour accéder aux ports d'E/S et gérer les interruptions
bullet_jaune_1 Interfacer C et assembleur pour mettre en œuvre des instructions spécifiques du processeur cible
bullet_jaune_1 Maîtriser les difficultés de la programmation concurrente
bullet_jaune_1 Connaitre les standards applicables
bullet_jaune_1 Découvrir les contraintes temps réel (déterminisme, interruptions, préemption...)
bullet_jaune_1 Comprendre les implications des architectures des processeurs en contexte temps-réel (cache, pipeline,...)
bullet_jaune_1 Mettre au point des applications multi-tâches
bullet_jaune_1 Utiliser le langages C pour implémenter un noyau temps-réel minimal
A la demande des développeurs auxquels elle est particulièrement destinée cette formation met principalement l'accent sur de nombreux exercices pratiques allant jusqu'à la réalisation effective d'un système temps-réel embarqué.
Les personnes désireuses d'un cours couvrant de façon plus large les problèmes d'utilisation d'UML/RT dans le contexte projet peuvent regarder également notre cours référence L70 - Les projets temps réel
Matériel
bullet_jaune_2 Un PC et une carte ColdFire par binôme
bullet_jaune_2 Chaîne de compilation croisée et sonde d'émulation BDM
bullet_jaune_2 Machine virtuelle Java
bullet_jaune_2 Manipulations et exercices en environnements natif et croisé
bullet_jaune_2 Un support de cours ainsi que la disquette contenant les exemples
Pré-requis
bullet_jaune_2 Connaissance de la programmation en C, C++ ou Java (niveau cours L2, L3 ou L4)
bullet_jaune_2 Connaissance d'un microprocesseur souhaitée
bullet_jaune_2 Connaissance de la programmation embarquée utile

Plan
Introduction au temps réel
bullet_jaune_2 concepts temps réel de base
bullet_jaune_2 contraintes particulières du temps réel
bullet_jaune_2 programmation structurée et objet
bullet_jaune_2 apports des techniques objets
L'approche temps réel avec UML
bullet_jaune_2 genèse d'UML
bullet_jaune_2 modèles UML standards
bullet_jaune_2 cycle de développement Objet
bullet_jaune_2 contraintes liées à l'interprétation des diagrammes
bullet_jaune_2 comment lire les diagrammes UML
Analyse des éléments constitutifs d'une chaîne de compilation
bullet_jaune_2 Explication des étapes du processus de génération de code en natif et en croisé
bullet_jaune_2 Rôle du compilateur, de l'assembleur et du linker
bullet_jaune_2 Paramétrage en fonction d'un mapping mémoire
bullet_jaune_2 Structure d'un programme source C, distinction des parties essentielles : préprocesseur, déclaration des variables globales, fonctions
bullet_jaune_2 Découpage d'une application en fichiers distincts
bullet_jaune_2 Le préprocesseur
bullet_jaune_2 Les instructions define et include
bullet_jaune_2 Ecriture de macros
bullet_jaune_2 Précautions à prendre dans les headers pour éviter les redéclarations de variables
bullet_jaune_2 Notion de projet, réalisation de librairies
Exercice : mise en œuvre de la chaîne de compilation et fabrication d'une librairie
Particularités de la programmation dans le contexte embarqué
bullet_jaune_2 Analyse d'une instruction de transfert assembleur pour comprendre l'accès à la mémoire
bullet_jaune_2 Mise en évidence de la distinction adresse / contenu
bullet_jaune_2 Calculs d'adresses, opérations mêlant pointeurs et adresses absolues
bullet_jaune_2 Les tableaux de pointeurs
Exercice : allocation d'un pointeur sur un port d'I/O
bullet_jaune_2 Accès aux champs d'une structure
bullet_jaune_2 Déclaration de variables et de pointeurs sur type structuré
bullet_jaune_2 Explication du padding imposé par les règles d'alignement : options pack du compilateur
bullet_jaune_2 Les formats big et little endian
bullet_jaune_2 Les structures à champ de bits : modélisation des périphériques
bullet_jaune_2 Les unions : une même zone mémoire peut être envisagée de différentes manières
Exercice : modélisation de l'UART du ColdFire au moyen d'une union et d'une structure à champs de bits et communication avec un terminal
bullet_jaune_2 Utilité des tableaux de pointeurs sur des fonctions
Exercice : lancement d'une fonction à partir d'un tableau de pointeurs
bullet_jaune_2 Distinction entre adressage absolu et adressage relatif pour la relogeabilité du code et des données
bullet_jaune_2 Réentrance des handlers d'exception
bullet_jaune_2 Cstart : initialisation du pointeur de pile et mise à 0 des variables non initialisées
bullet_jaune_2 Inconvénients des fonctions Setjmp et Longjmp
bullet_jaune_2 Gestion de la mémoire
bullet_jaune_3 Algorithmes
bullet_jaune_3 Gestion des fuites mémoire
bullet_jaune_2 Mise en EPROM d'une application
Exercice : mise en évidence et détection de fuites mémoire
Principe de fonctionnement d'un système Temps réel et embarqué
bullet_jaune_2 Notion de tâche
bullet_jaune_2 Cadencement des tâches selon leur priorité, préemption
bullet_jaune_2 Sauvegarde de contexte
bullet_jaune_2 Nécessité d'un tick temps réel pour déclencher les commutations de tâches
Les traitements concurrents
bullet_jaune_2 Recensement des champs d'un descripteur de tâche
bullet_jaune_2 Réalisation d'une structure chaînée des tâches en attente d'exécution
bullet_jaune_2 Insertion d'un nouveau descripteur lors du chargement d'une nouvelle tâche
bullet_jaune_2 Exemple de règles d'ordonnancement: priorité évoluant en fonction du temps
bullet_jaune_2 Réorganisation de la file lors de l'invocation de l'ordonnanceur: préemption
Les interruptions
bullet_jaune_2 Nécessité des interruptions dans un système embarqué
bullet_jaune_2 Distinction entre déclenchement sur front et sur niveau
bullet_jaune_2 Acquittement logiciel
bullet_jaune_2 Ecriture d'un gestionnaire d'interruption : distinction des 3 étapes prologue / corps / épilogue
bullet_jaune_2 Table de vecteurs
bullet_jaune_2 Ecriture des fonctions d'installation et de lecture de vecteur
Exercice : lancement d'une action suite à une interruption
Mise au point
bullet_jaune_2 Communication avec la cible
bullet_jaune_2 Les différents niveaux de mise au point : C, assembleur
bullet_jaune_2 Les fenêtres du debugger : source, mémoire, pile et variables
bullet_jaune_2 Positionnement de points d'arrêt
bullet_jaune_2 Analyse de la pile et extraction des stacks frames correspondant aux fonctions imbriquées
bullet_jaune_2 Les procédés de mise au point sur les processeurs récents munis de cache : synchronisation avec un analyseur logique
La programmation dans le contexte multi-tâches
bullet_jaune_2 Structures de données:
bullet_jaune_3 Listes simplement chaînées
bullet_jaune_3 Listes doublement chaînées
bullet_jaune_3 Listes circulaires
bullet_jaune_3 Files d'attentes
bullet_jaune_3 Piles
Exercice : réalisation de listes chaînées utilisables en contexte multi-tâches
bullet_jaune_2 Noyau temps-réel minimal
bullet_jaune_3 descripteurs de tâches
bullet_jaune_3 scheduling
Exercice : réalisation d'un scheduler simple, "fair scheduling"
bullet_jaune_2 Synchronisation entre tâches
bullet_jaune_3 Modes de synchronisation
bullet_jaune_3 Primitives de synchronisation
Exercice : gestion d'un sémaphore, "fixed scheduling"
bullet_jaune_2 Gestion des accès concurrents
bullet_jaune_3 Variable simple
bullet_jaune_3 Structure de données
bullet_jaune_3 Entre tâches
bullet_jaune_3 Entre tâches et routines d'interruption
Exercice : synchronisation et communication entre tâches
bullet_jaune_2 Gestion de la mémoire
bullet_jaune_3 Algorithmes
bullet_jaune_3 Gestion des fuites mémoire
Exercice : mise en évidence et détection de fuites mémoire