View the site in Français View the site in English (USA) Site displayed in English (GB)
You are here: ac6 > ac6-formation > Languages > Embedded C programming

L2 Embedded C programming

Le langage C pour les systèmes embarqués

Objectifs
bullet_jaune_1 Découvrir le C embarqué au moyen d'exercices sur une carte cible avec un microcontrôleur STR912FA (coeur ARM)
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 périphériques d'E/S
bullet_jaune_1 gérer des interruptions
bullet_jaune_1 gérer la transmission/réception série de données
bullet_jaune_1 Interfacer C et assembleur pour mettre en oeuvre des instructions spécifiques du processeur cible
Matériel
bullet_jaune_2 Un PC, une carte STR912-SK et une sonde JTAG Lauterbach par binôme
bullet_jaune_2 Environnement de développement croisé : Eclipse avec compilateur GCC et environnement de debug Trace32 (pour les sondes Lauterbach)
bullet_jaune_2 Manipulations sur carte nue
bullet_jaune_2 Un support de cours ainsi que les solutions des exercices
Pré-requis
bullet_jaune_2 Connaissance élémentaire du langage C
bullet_jaune_2 Connaissances de l'arithmétique binaire
bullet_jaune_2 Connaissance d'un processeur recommandée

Outline
Conception d'un logiciel structuré
bullet_jaune_2 Découpage d'une application en plusieurs fonctions
bullet_jaune_2 Séparation en fichiers distincts
bullet_jaune_2 Intérêt des fichiers header et des librairies
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
Exercice : mise en œuvre de la chaîne de compilation
Les types du langage C et les opérateurs
bullet_jaune_2 Classes d'allocation des variables (static, automatic, register et extern) et analyse de leurs durées de vie
bullet_jaune_2 Les types scalaires : char, int, float et double
bullet_jaune_2 Codage des nombres entiers en code binaire naturel ou en code complément à 2
bullet_jaune_2 Déclaration des variables
bullet_jaune_2 Les conversions de type implicites et explicites (casting)
bullet_jaune_2 Les directives de compilation pour forcer l'alignement du code et des données, intérêt sur les processeurs munis de caches
bullet_jaune_2 L'attribut volatile pour éviter les optimisations de code par le compilateur
bullet_jaune_2 Les constantes
bullet_jaune_2 Les opérateurs du C : logiques, arithmétiques et relationnels
bullet_jaune_2 L'opérateur ","
bullet_jaune_2 Priorité entre opérateurs
Exercice : écriture de programmes mettant en oeuvre les concepts ci-dessus
Les traitements itératifs et conditionnels
bullet_jaune_2 La structure if/else
bullet_jaune_2 La structure switch/case
bullet_jaune_2 Les boucles : while, do/while et for
bullet_jaune_2 Les instructions break et continue
bullet_jaune_2 L'instruction goto
bullet_jaune_2 Les optimisations du compilateur au niveau des structures de contrôle du langage C : exemple le dépliement des boucles
Exercice : écriture de programmes mettant en oeuvre les notions ci-dessus
Les pointeurs et les tableaux
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 mono et multi multi-dimension
bullet_jaune_2 Pointeurs constants et volatile
bullet_jaune_2 Les pointeurs sur fonctions
bullet_jaune_2 Les tableaux de pointeurs
Exercice : allocation d'un pointeur sur un port d'IO
Exercice : opérations courantes sur les pointeurs
Exercice : recopie de tableaux avec les notations pointeur et tableau
Les structures et les unions
bullet_jaune_2 Déclaration de variables structure
bullet_jaune_2 Déclaration de pointeurs sur des varaiables structure
bullet_jaune_2 Accès aux champs d'une structure
bullet_jaune_2 Mise en évidence du padding imposé par les règles d'alignement
bullet_jaune_2 Directive de compilation : #pragma pack
bullet_jaune_2 Les formats big et little endian
bullet_jaune_2 Les structures à champ de bits et modélisation des périphériques
bullet_jaune_2 Utilisation de typedef
bullet_jaune_2 Les tableaux de structures
bullet_jaune_2 Le type union pour envisager un même emplacement mémoire de différentes manières
Exercice : Exercice: modélisation du timer du Str912FaW44
Les fonctions
bullet_jaune_2 Prototypage des fonctions : notions d'argument et de valeur de retour
bullet_jaune_2 Déclarations anticipées de fonctions
bullet_jaune_2 Les espaces de validité des variables
bullet_jaune_2 La récursivité : impact sur la pile
bullet_jaune_2 Mise en évidence de l'allocation d'un stack frame lors du processus d'appel
bullet_jaune_2 Visualisation des stacks frames empilés (call stack)
bullet_jaune_2 la convention d'appel
bullet_jaune_2 La fonction main et ses arguments
bullet_jaune_2 Utilité des tableaux de pointeurs sur des fonctions
bullet_jaune_2 Interface C/assembleur
Exercice : Exercice : appel d'une fonction avec les deux modes de passage de paramètres
Exercice : Exercice : écriture d'une fonction récursive qui calcule la factorielle d'un nombre
Exercice : Exercice : interfacer du C avec du code assembleur
L'allocation dynamique
bullet_jaune_2 Les fonctions d'allocation dynamique de mémoire : malloc, calloc, realloc et free
bullet_jaune_2 Intérêt de l'opérateur sizeof
bullet_jaune_2 Allocation dynamique versus allocation statique de mémoire
bullet_jaune_2 Allocation dynamique de mémoire et temps réel
bullet_jaune_2 Algorithmes d'allocation dynamique de mémoire
bullet_jaune_2 Distinction tas / pile
bullet_jaune_2 Tas par défaut et tas privé
Exercice : Exercice :réalisation d'une liste chaînée de tâches prêtes
Interruptions, transmission/réception série de caractères
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
bullet_jaune_2 Initialisation d'un UART
bullet_jaune_2 Ecriture de fonctions bas niveau pour lire et écrire des caractères du et vers un UART
Exercice : Exercice : programmation d'un timer pour générer des interruptions
Exercice : Exercice : programmation d'un uart pour recevoir et transmettre des caractères
Le langage C dans le contexte embarqué
bullet_jaune_2 Phases de startup et de terminaison
bullet_jaune_2 Cstartup : initialisation du pointeur de pile et mise à 0 des variables non initialisées
bullet_jaune_2 Nécessité de l'attribut volatile
bullet_jaune_2 Portabilité:
bullet_jaune_3 big-endian et little endian
bullet_jaune_3 padding et alignement
bullet_jaune_2 Optimisation du code
bullet_jaune_2 Ecriture de code efficace
Exercice : Mise en évidence et détection de fuites mémoire
Les entrées/sorties standards
bullet_jaune_2 Les fonctions de la bibliothèque stdio
bullet_jaune_2 Prototypage des fonctions de base : getchar et putchar
bullet_jaune_2 Prototypage des fonctions qui effectuent un formatage : printf, scanf
bullet_jaune_2 Notion de fichier : l'accès aux fichiers
bullet_jaune_2 Traitement des erreurs : stderr et exit
Exercice : utilisation des fonctions stdio pour la communication avec un terminal
Mise au point
bullet_jaune_2 Sonde JTAG Lauterbach
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, variables, registres
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