Systèmes Embarqués Temps Réel - David Delfieu August 24, 2018 - Plate-forme d ...

 
CONTINUER À LIRE
Systèmes Embarqués Temps Réel - David Delfieu August 24, 2018 - Plate-forme d ...
Systèmes Embarqués Temps Réel

          David Delfieu

         August 24, 2018
Systèmes Embarqués Temps Réel - David Delfieu August 24, 2018 - Plate-forme d ...
2
Systèmes Embarqués Temps Réel - David Delfieu August 24, 2018 - Plate-forme d ...
Contents

1 Définitions générales                                                                                                         5
  1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .    5
      1.1.1 Les aspects matériels . . . . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .    5
      1.1.2 Les différents choix de puces dans l’embarqué . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .    8
  1.2 Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .    8
      1.2.1 Architecture Materielle . . . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .    8
      1.2.2 Architecture Logicielle . . . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .    8
  1.3 Programmation Synchrone . . . . . . . . . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   11
      1.3.1 Code C, programmation Synchrone sur un micro-contrôleur .              .   .   .   .   .   .   .   .   .   .   .   14
      1.3.2 Aspect recherche et developpement autour du “synchrone” .              .   .   .   .   .   .   .   .   .   .   .   15
  1.4 Programmation Asynchrone . . . . . . . . . . . . . . . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   15
      1.4.1 Ordonnancement . . . . . . . . . . . . . . . . . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   16
      1.4.2 Les différent états d’une tâche . . . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   16
  1.5 LINUX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   17
      1.5.1 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   17

2 Programmation multi-tâche                                                                                                    19
  2.1 Les Processus Unix System V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                              19
      2.1.1 Création d’un processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                              20
      2.1.2 Création de plusieurs processus . . . . . . . . . . . . . . . . . . . . . . . . . . .                              20
      2.1.3 Boucle de création de processus . . . . . . . . . . . . . . . . . . . . . . . . . . .                              21
  2.2 La communication entre processus Unix . . . . . . . . . . . . . . . . . . . . . . . . . .                                24
      2.2.1 Les pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                            24
      2.2.2 Les pipes “non nommés” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                               25
      2.2.3 Les sémaphores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                             27
  2.3 Les Threads Posix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                            28
      2.3.1 Création de thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                             29
      2.3.2 Protéger une variable globale accédèe par plusieurs thread, à l’aide d’un sémaphore                                31
      2.3.3 Tableau de threads et passage de paramètre . . . . . . . . . . . . . . . . . . . .                                 33

3 Système embarqué temps réel                                                                          35
  3.1 La cible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
      3.1.1 Boot de la cible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

                                                    3
Systèmes Embarqués Temps Réel - David Delfieu August 24, 2018 - Plate-forme d ...
3.1.2 Configurer le boot : U-Boot . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   35
   3.2   La carte d’entrée-sortie : VMOD . . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
         3.2.1 VMOD_IO . . . . . . . . . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
         3.2.2 Les ports d’Entrées-sorties . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
   3.3   Drivers . . . . . . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   39
         3.3.1 Driver caractère . . . . . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   39
         3.3.2 Installation de Drivers . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   39
         3.3.3 Drivers de nos cartes d’ES . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   40
         3.3.4 Installation du driver de la MTTL .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   40

4 ANNEXES                                                                                                                                                          43
  4.1 Connectivité IP . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   43
      4.1.1 Le protocole IP . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   43
      4.1.2 Les 7 couches du modèle OSI            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   43
      4.1.3 Le réseau Internet : 4 couches         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   44
      4.1.4 Applications NFS . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   46
      4.1.5 Applications ftp . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   47
      4.1.6 Applications http . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   47

                                                           4
Systèmes Embarqués Temps Réel - David Delfieu August 24, 2018 - Plate-forme d ...
Chapter 1

Définitions générales

1.1      Introduction
Les Systèmes Temps Réel (ST R) on été introduits avec le système de guidage de l’alunisseur des
missions Apollo. Aujourd’hui on trouve ces systèmes dans les objets les plus courant : régulateur
de vitesse, voitures autonômes smartphones, consoles de jeux, électroménager, GP S. Mais ces sys-
tèmes sont évidement présent dans l’avionique avec les systèmes de contrôle de vol et de guidage ou
dans le médical et surtout dans l’automobile dans lesquelles on peut trouver plusieurs centaines de
microcontrôleur ! Dans ces derniers domaines, la sureté de fonctionnement, la robustesse et la qualité
des informations produites sont des critères déterminants de conception qui priment par rapport à la
performance pure.
   D’un point de vue matériel un ST R est composé de micro1 de mémoires de périphériques de sa
propre alimentation.

Definition 1.1.1 Les caractéristiques d’un Système Embarqué Temps réel sont en priorité la sureté
de fonctionnement (CEM, robustesse, redondance), des temps d’exécution de tâche qui doivent êtres
déterministes (où au pire, bornés), une consommation énergétique qui doit être est la plus faible possible
par rapport au service rendu et un encombrement du programme limité.

1.1.1     Les aspects matériels
Il y a deux grandes catégories matérielles de ST R : les cartes électroniques et les racks. Les cartes
électroniques sont généralement des petits systèmes qui embarquent des microcontroleurs voir des
microprocesseurs. Les racks portent eux, des cartes à microprocesseurs ou des System-on-Chip (SoC).

Les Principaux microprocesseurs de l’embarqué
Smartphones
  1
   On désigne par micro, tout composant comportant une unité de calcul : Microprocesseur, Microcontrôleur, DSP,
FPGA, SoC

                                                      5
• L’Apple A6 est un système mono-coeur conçu conjointement par P.A. Semi et Intrinsity et
     fabriqué par Samsung. L’entreprise affirme qu’il est jusqu’à deux fois plus rapide et jusqu’à deux
     fois plus performant au niveau graphique que l’Apple A5. Il est intégré pour la première fois
     dans l’iPhone 5, dévoilé le 12 septembre 2012.

   • La puce A7 utilise l’architecture 64 bits ARMv8 basée sur un processeur bi-cœur et une unité
     graphique intégrée (GPU). La micro-architecture ARMv8 double le nombre de registres du A7
     comparé au A6. Le SoC A7 inclut plus de 1 milliard de transistors sur une puce de 102 mm2.

   • Galaxy S6. Il dispose d’un processeur Exynos 7420. Samsung conçoit et fabrique ce circuit
     intégré. Cette puce est gravée en 14 nm2 et gère les instructions 64 bits6. La puce contient 8
     cœurs : elle est constituée d’une partie comprenant 4 cœurs ARM à 2,1 GHz et 4 cœurs ARM à
     1,5 GHz2.

   • Galaxy S7 : Pour les États-Unis, Le S7 et S7 Edge se doteront du Snapdragon 820 de Qualcomm.
     Pour l’Asie de l’Ouest, ce sera le Exynos G930FD et dans le reste du monde, le Exynos 8890
     (tous deux produits par Samsung).

Autres Systèmes Embarqués GPS, radars mobiles, robots, ... Autant de ST R sont des systèmes
embarqués qui contiennent soit des microprocesseurs spécifiques, soit des “System on Chip”.

   Microprocesseurs :

   • Intel Medfield, intel ATOM, intel Core2Duo, Intel i3, i5, i7.

   • PowerPC (anciennement Apple, IBM, Freescale).

   • AMD Geode, AMD Fusion G-series.

    System on Chip (SoC) : Les SoC sont des composants dont le design de base est souvent
achété (cas des coeurs ARM) puis personalisés. C’est le cas d’Apple et Samsung qui achètent des
coeurs à ARM puis les particularisent. Pour apple, c’est ensuite Samsung qui les réalise !! Pour les
Soc plus petits : FPGA et CPLD, il existe des logiciels qui permettent d’implanter ou de définir des
architectures processeurs.

Les Principaux microcontrôleurs de l’embarqué
Microcontroleurs La dernière catégorie à puce relève des systèmes basés à partir de micro-contrôleurs
: Les automobiles embarquent aujourd’hui entre 30 (entrée de gamme) et 250 micro-contrôleur(modèles
de luxe) : une par fonction, comme le lève-vitre ou l’essuie-glace mais aussi pour les fonctions de sécu-
rité comme l’ABS ou l’airbag.

   • ATmega*** (ATMEL),

   • PIC (Microchip),

                                                   6
• M68HC*** (Motorola),

   • ST10F*** (ST-Microelectronics)

Microcontroleurs dédiés au Traitement du signal

   • Texas Instrument : C5000,C6000

   • freescale ;

   • Microchip : dsPIC30F et dsPIC33F

   • Qualcomm

                       Figure 1.1: carte micro : microP, microC, DSP, FPGA

Les systèmes sur étagères : "Rack"
Quand il n’y a pas de problème de consommation et ni d’espace que l’on exige une grande puissance de
calcul ainsi qu’une très grande tolérance aux pannes, une forte sureté de fonctionnement et que de plus,
ni le poids ni les dimensions on peut trouver des systèmes sur étagère. On trouves ces équipements
dans le transport : les avions, trains, bateaux, centreaux de communication.

                                     Figure 1.2: système de Rack

   Les systèmes "rackables" diffèrent par leur format :

   • Carte PC/104, taille standard : 90,17 x 95,89 mm ;

   • Carte compact PCI ;

                                                   7
Figure 1.3: Un rack 5U

                                      Figure 1.4: Un Rack 3U

   • Carte Europe ;
   • Carte bus VME.
   Les caractéristiques du système vu en TP sont :
   • Rack 3U et 5U ;
   • Alimentation propre ;
   • Carte bab740 : Microprocesseur de type PPC ;
   • 1 carte d’E/S ;
   • format VME ;

1.1.2    Les différents choix de puces dans l’embarqué
Le marché des semi-conducteurs pesait 341 milliards en 2015 dont 90 milliards pour les micro. Et
l’electonique représente 25 % du cout d’une automobile ! 10% d’un avion. Dans ce marché, les “PC”
représente à peine 3,5 milliards de dollars (80% intel, 10% AMD, 10 % autres), tandis que les cartes
vidéos, consoles, téléphones représente environ 4 milliards de micro : ARM = 80%: (Apple et Samsung)
90 % des micro pour l’embarqué utilisent autre chose que Windows.

1.2     Architecture
1.2.1    Architecture Materielle
1.2.2    Architecture Logicielle
Un SETR est un système bouclé multi-tâches dont le temps de réponse est adéquat avec la dynamique
de son environnement. Un exécutif temps réel est un système d’exploitation minimal ajusté au hard-
ware auquel il est destiné. Seuls les drivers justes nécessaires sont inclus dans l’exécutif. De même,

                                                  8
Entités           Caractéristiques                   Avantages
 PORT d’E/S         Configuration d’E/S                Accés direct
                                                     aux actionneurs
                                                      et aux switch
    CAN               Conversion AN                signaux numériques
Communications       Port SPI, UART           pas de périphériques externes
                      I2C, bus CAN
Timers et PWM    Tempo signaux périodiques         mise en oeuvre facile
   Codage            boucle, tableaux,                   Efficace
                       Interruptions

                 Table 1.1: Les micro-contrôleurs

                 Table 1.2: Data Signal Processor

            Entités              Caractéristiques        Avantages
        Filtres logiciels              MAC               gain Hard
       Interfaces Codecs       Ports Séries rapides      gain Hard
          Gros débits                  DMA            Moins d’attente
   Accés données programme     Architecture Harvard   Exécution rapide

     Table 1.3: Les micro-contrôleurs de traitement du signal

                    Table 1.4: Microprocesseur

  Besoin     micro et petit        Moyen/Gros         Embarqué critique
   RAM     100ko < x < 4M o      4M o < x < 64mo          Go - To
  FLASH    100ko < x < 4M o       8M o < 16M o            Go - To
   Proc.   Dragon Ball : 68K          MIPS               Pentium
                Mcore              Hitashi SH            PowerPC
               Coldfire                X86                Crusoe
                 ARM
  Carac.   MMU optionnelle          Carte mère           PCI,VME, ...
  Appli.    PDA, Portable            Routeur           Commutateur tél.
           Caméra numérique      Stockage réseaux       Serveur central
                                Imprimante réseaux       Gros routeur

                 Table 1.5: Les microprocesseurs

                                    9
Mémoire      Timer
                                             FPGA                                  UART

                                                                                  PWM

                         Capteurs          CAN               CPU                 CNA      Actionneurs

                                           In

                                    Interface utilisateur
                                          PC Hôte
                                                               Environnement
                                                                 Exterieur

seuls les services systèmes nécessaires sont dans l’exécutif. Ce système multi-tâches est ordonnancé
par un exécutif temps réel. Les tâches et l’exécutif sont compilées dans le même exécutable appellée :
image. Un SETR aura un temps de réponse adéquat si la somme du temps d’acquisition, de traitement
et d’application de la commande est inférieure à la période d’échantillonage de l’information. Pour
cela il faut que l’exécutif soit déterministe et préemptif. Une application de contrôle commande est
généralement décomposée en tâches.

Definition 1.2.1 Une tâche correspond à une fonctionnalité logicielle et matérielle comportant peu
d’interactions avec les autres tâches et dont la granularité définie une complexité permettant une im-
plémentation rapide.

Exemple

Par exemple prenons le cas d’une régulation en courant d’une Machine à Courant Continu (MCC). On
désire pouvoir par une saisie de consigne en courant, maintenir constant un certain courant quelque
soit la charge appliquée sur l’axe de la MCC., On peut décomposer cette application en trois tâches :

   • Une tâche d’acquisition de la consigne ;

   • Une tâche d’échantillonnage lecture du courant ;

   • Une tâche de calcul et d’application du correcteur ;

   Nous allons maintenant traiter cet exemple au travers de deux axes méthodologiques différents :
Synchrone et Asynchrone.

                                                                10
1.3     Programmation Synchrone
Une programmation “synchrone” partage une application en tâches qui sont lancées de façon synchrones
par rapport à des évènements correspondant généralement à des interruptions.

                                                                             Programmation SYNCHRONE

                                                    Programme Principal

                                                        IT Timer                                                                                    SPIT Timer
                                                                                                                                                    ...
                                                                  IT Externe                                                                        ...

                                                         IT CAN
                                                                                                                                   SPIT IT Externe
                                                                                                                                   ...
                                                                                                                                   ...

                                                                                           SPIT CAN
                                                                                           ...
                                                                                           ...

Exemple
Pour implémenter l’exemple, on découpe l’appllication en plusieurs tâches :

   • Programme principal qui initialise les différents périphériques et le timer, puis il ne fait rien (ou
     pas grand chose) ;

   • La tâche d’acquisition de consigne : durée 30 µs, appelée toutes les secondes ;

   • La tâche d’acquisition du courant : durée : 30 µs, appelée toutes les 200 µs;

   • La tâche de calcul et d’application du correcteur : durée : 100 µs, appelée toutes les 200 µs;

   Chaque tâche est lancée de façon synchrone avec un évènement d’interruption dans un sous-
programme d’interruption. On peut aussi envisager d’effectuer plusieurs sous-taches dans un pro-
gramme d’interruption à condition que ces sous-tâches ne soient pas bloquantes.

                                 Lecture Consigne           30 μs
                                                                                                            TLc= 1 s                                          30 μs

                                                         30 μs        30 μs     30 μs     30 μs     30 μs     30 μs     30 μs     30 μs     30 μs          30 μs
                                  Lecture Courant IM
                                                                TIM=200 μs

                                  Calcul Correcteur    100 μs       100 μs    100 μs    100 μs    100 μs    100 μs    100 μs    100 μs    100 μs         100 μs

                                                        TCC=200 μs

                                Tâche en traitement

                                                       Tg=200 μs

                                                            Déroulement de tâches en Programmation Synchrone

                          Figure 1.5: Exemple d’ordonancement préemptif

                                                                                                       11
Le code suivant, est un exemple de programmation synchrone en assembleur pour un micropro-
cesseur 68000. On y remarque le programme principal et les sous-programmes d’interruption.
        ORG      $0FF0000
        LEA      PILE(PC),A7
INITPIA CLR.B    CRB           Le Port B commande les Timers
        MOVE.B   #$1F,DDRB
        MOVE.B   #4,CRB
        CLR.B    CRA
        MOVE.B   #7,DDRA
        MOVE.B   #4,CRA
        PEA      IT3(PC)
        MOVE     #27,-(A7)
        MOVE     #5,-(A7)
        TRAP     #13
        ADDQ.L   #8,A7
        PEA      IT2(PC)
        MOVE     #26,-(A7)
        MOVE     #5,-(A7)
        TRAP     #13
        ADDQ.L   #8,A7

************** LES initialisation des 3 TIMERS **********************
* CPT0 de U1 : periode de hachage PWM : 125 us f = 1 Mhz
        MOVE.B #$14,CRW
        MOVE.B #125,CPT0
        MOVE.B #$16,CW
        MOVE.B #125,CT0
        MOVE.B #$96,CW       10 01 | 011 0 generation du signal convst
        MOVE.B #125,CT2
        CLR.B   ORA     * aiguillage du multiplexeur analogique
************** * Les activations des IT et Timers **********************
        MOVE.B #5,CRA         IT3
        MOVE.B #5,CRAx        IT2
        MOVE.B #11,ORB       * mise en route de G10,G20 et G22
LOOP    BRA     LOOP    La Boucle Infinie
        TRAP    #0

**************** IT Num 2 : Le Calcul du correcteur ***********************
IT2     MOVE.L #IREF,D0         Temps Execution = 60 us
        ASL     #1,D0           D0 = 2 * IREF
        SUB.L   D2,D0           D0 = 2IREF - 5IMn = EPSn
        MOVE.L D0,D3            D3 = EPSn
        ADD.L   D4,D3           D3 = In = In-1 + EPSn       D4 = In-1
        MOVE.L D3,D5            D5 = In
        MOVE.L D3,D4            D4 = In-1
MOVE.L   #10500,D7      D1
1.3.1    Code C, programmation Synchrone sur un micro-contrôleur
Le code suivant, est un exemple de programmation synchrone en C pour un microcontroleur ATMega8.
On y remarque le programme principal (main) et les sous-programmes d’interruption (ISR).

#include 
...
void sleep(int dzs){for(int i=0;i
Au niveau des avantages, la programmation est très efficace car prôche du hard. Sa structure est
minimale donc très performante. Il n’y a pas d’exécutif donc pas d’ordonnancement et le comportement
est de ce fait déterministe.
    Par contre, il est difficile de faire évoluer le système. Si l’on veut rajouter une tâche, on doit avoir
une source d’interruption supplémentaire. De plus, le temps d’exécution de la nouvelle tâche doit être
“compatible” avec les autres temps d’exécutions.
    Dans l’exemple : On a une periode globale de 100µs. A ces instants on a au plus : 3 tâches avec
100 + 30 + 30 = 160µs. Le temps dexécution le plus grand est donc de 40µs.
    Sur une architecture synchrone les coûts de développement sont très importants : La programma-
tion de ces systèmes nécessite une maîtrise complète de la partie hardware. En effet, Ces systèmes
intimement liés au hardware sont généralement développés au moins en partie en assembleur et en
C ce qui augmente encore les coûts de développements et de maintenance. La lisibilité du code est
souvent faible (assembleur, code très lié au hard) et le code n’est pas portable.

1.3.2    Aspect recherche et developpement autour du “synchrone”
Des langages spécifiques dit “synchrones” ont été développés dans des laboratoires de recherche. Ils
restent cantonnés à des programmes de recherche et développement des très grandes entreprises comme
Airbus ou Boing mais restent très peu utilisés dans le reste de l’industrie.

Definition 1.3.1 Langages Synchrones : Esterel, Lustre, Statecharts Ce sont des langages à haut
niveau d’abstraction dont les instructions de bases manipulent des évènements. Ils sont qualifiés de
"synchrones" car ces évènements jouent le rôle de marqueurs temporels. Ils sous-entendent la présence
d’une horloge d’échantillonnage temporel permettant de les synchroniser.

1.4     Programmation Asynchrone
La programmation asynchrone implique l’utilisation d’un système d’exploitation (SE ou OS en Anglais).
Un système d’exploitation permet, de gérer les tâches de l’application : Il décide de lancer les
tâches, il attend leur comptes rendus d’exécution, les interrompt pour ne lancer d’autres : On parle
d’ordonnancement. L’OS gère, de plus, tous les éléments physiques ou logiciels du système tel que
la mémoire, les entrées sorties du système et la communication avec l’exterieur. La gestion de pé-
riphérique est faite à l’aide de driver. Les tâches peuvent être implémentés (en C sous Unix/LINUX)
par des processus ou des threads.
    Le style asynchrone de conception d’une application offre une structure souple : On peut ajouter
ou supprimer des tâches de façon simple. Le code est lisible (langage haut niveau tyoe C) et détaché
du hard, la maintenance est donc plus aisée et le code est portable sur d’autres système ou processeurs.
La communication avec le hard se fait via des drivers. Et suivant les drivers portés dans le noyau on
va pouvoir faire des tâches de très haut niveau : Protocole TCP/IP, telnet, serveur http, ...
    Quant aux inconvénients : L’image intègre un mini système d’exploitation (qlqs Mo) en plus de
l’application et cet OS rend le système moins performant à cause des changements de contextes (cf
figure 1.5.1). De plus, le comportement temporel n’est pas forcement déterministe. Une tâche moins
urgente peut s’exécuter avant une autre qui est plus urgente ! Du déterminisme temporel peut être

                                                   15
réablit ou forcé pour un nombre restreint de tâches de haute priorité. Pour atteindre un même niveau
de déterminisme en asynchrone qu’en synchrone : il faut un processeur beaucoup plus puissant donc
plus consommateur d’énergie électrique et plus de mémoire.

1.4.1    Ordonnancement
Le rôle principal d’un OS est d’ordonnancer les tâches. Généralement les OS ont une politique qui essaie
de servir de façon plus ou moins équitable l’ensemble des tâches. Pour cela est définit un intervalle de
temps très court : ordre de la milliseconde, appelé quantum. Chaque expiration de quantum, provoque
l’interruption de la tâche en cours et l’election par l’OS d’une nouvelle tâche ce qui donnera, comme
le quatum est petit, l’impression que toutes les tâches s’exécutent en même temps. Cette impression
sera d’autant plus importante que le nombre de coeur est important. En effet, sur une architecture
muti-coeur, les tâches seront en plus distribuées sur les différents coeurs.
    Une tâche dispose d’un quantum de temps. Au bout de ce quatum elle est preemptée par l’OS.
Elle peut se terminer avant l’expiration du quantum, par une fin naturelle ou être bloquée par une
demande d’une entrée-sortie bloquante. Le quantum permet d’assurer une redistribution régulière des
ressources CP U . Dans la figure suivante, toutes les tâches évoluent de concert.

                   Lecture Consigne

                    Lecture Courant

                    Calcul Correcteur

                  Tâche en traitement

                 Election d'une nouvelle tâche à éxecuter : Surcoût temporel

                              Figure 1.6: Exemple d’ordonancement préemptif

Exemple d’ordonnancement :

1.4.2    Les différent états d’une tâche
   • Activer : La tâche entre dans un processus électif : File d’attente des tâches "Prêtes";

   • Démarrer : Le tâche en tête de la FA "Prête" est élue, elle a 100% du CPU ;

   • Arrêter : Le tâche est interrompue, elle a terminée son quantum de temps ;

                                                                16
Non planifiée

                                     Activer          Terminer
                                                                  Continuer

                    Terminer                   Tâche Prête                       Bloquée

                                                                  Suspendre
                                   Démarrer            Arrêter

                                         Tâche en traitement
                                                                         Suspendre

                                 Les Différents états d'une tâche

   • Suspendre : Le tâche a demandé une ressource non encore disponible ou s’est endormi elle-même
     (sleep) ;

   • Continuer : La ressource demandée est maintenant disponible ou le sommeil est terminé, le tâche
     rentre à nouveau dans la FA "Prête".

   • Terminer : Le tâche s’arrête définitivement par l’appel à exit ou return. Elle peut aussi recevoir
     un signal de fin émis par une tâche en traitement.

1.5     LINUX
1.5.1    Historique
Pourquoi LINUX ? Linus Thorvald introduit un OS multitâches comparable à UNIX sur des ordinateurs
PC vers mla fin des années 80.
   • LINUX est dérive d’UNIX, un OS fiable du marché ;

   • LINUX est libre : le source est disponible sans royalties à reverser ;

   • LINUX est foisonnant : de nombreux contributeurs, développeurs le font évoleur et fournissent
     une aide rapide ;

   • Les versions stables de linux sont FIABLES ;

   • LINUX offre une connectivité IP en standard.
   LINUX : sur quel système ?
   • Linux est décliné sur un grand nombre d’architecture :
     Pentium x86, PowerPC, ARM, MIPS, 68000, Coldfire,...

                                                             17
• Taille du noyau est modeste 500ko (au minimum) à plusieurs dizaine de mégaoctets;

• Différentes distributions sont proposées suivant le domaine :
  routeur IP, PDA, portable, ...

• Chargement de modules dynamiques : optimisation taille noyau ;

• Migration aisée de linux à Linux Embarqués.

Historique

• 1991 : la première version de Linux est développé par Linus Torvalds;

• 1999 : Présentation à Linux World d’un système compact PCI sous linux ;

• 2000 : Embedded Linux Consortium : centralise des solutions Linux embarqués ;

• Aujourd’hui : des solutions libres ou commerciales sont concurrentes.

• Solutions libres :

     – RTLinux,
     – RTAI.

• Solutions propriétaires:

     – VxWorks,
     – pSOS,
     – QNX.

                                             18
Chapter 2

Programmation multi-tâche

Deux mécanismes de programmation C sous Unix, permettent d’implémenter la notion de tâche, les
processus et les threads. Ces deux mécanismes apparaissent aussi dans d’autres langages et d’autres
systèmes d’exploitations. On trouve les notions de processus ou de thread en Java par exemple sous
windows. Si les processus/threads Linux correspondent à ceux d’UNIX, ceux de Windows ne corre-
spondent pas tout à fait. Un standard définit ce qu’est un processus ou un thread. Le standard des
processus Unix se nomme les processus Unix System V. Celui des threads se nomme les thread Posix.

2.1        Les Processus Unix System V
Un processus est une implémentation en langage C de la notion de tâche. Un processus est une entité
possédant :
Un contexte d’exécution :

   • Un ensemble sauvegardé de valeurs des registres du processeur ;

   • une zone mémoire associé au code exécutable ;

   • une zone de mémoire dynamique privé ;

   • une zone pour la pile.

   Un environnement d’exécution :

   • Les fichiers ouverts,

   • sa priorité d’exécution,

   • un processus est identifié par un numéro : PID.

   • ...

                                                19
fork()

                                         père                                       fils

                                            PID                                    PID
                                           PPID                                   PPID
                                       Desc. Fichiers       Duplication       Desc. Fichiers
                                        Zone de pile                           Zone de pile
                                       Zone de data                           Zone de data
                                      Zone programme                         Zone programme

                                                         même programme
                                          même valeurs des variables (valeurs d'avant le fork)

                                           MAIS ces codes coexistent à une adresse différente
                                    et les variables appartiennent à des espaces mémoires différents

                                                     Figure 2.1: fork

2.1.1    Création d’un processus
La primitive fork() (cf la figure 2.1) fait partie du paquettage standard "stdio.h"

   • Duplication quasi-complète du patrimoine du père ;

   • Le "fils" se distingue par :

        – La valeur retournée par l’appel système fork() : 0 pour le fils et le pid du fils chez le pere
        – son PID ;
        – son PPID ;
        – sa zone programme, data et pile ;
        – ses propres descripteurs de fichiers ouverts.

2.1.2    Création de plusieurs processus
Un père, un fils

main() {
  int i,PID,res;
  PID=fork();
  if (!PID) { /* Chez le fils */
      for(i=0;i
}
         else { /* chez le pere */
           for(i=0;i
/*Le PERE travaille */
    travaille(iteration);

    printf("Je suis le pere j’ai fini, j’attends la terminaison de mes fils \n");
    for (int j=0;j
printf("\n\n\nJe suis le pere et je m’appelle %d\n",getpid());

    for(i=0;i
• User time : temps CPU utilisé uniquement par le programme utilisateur

   • Sys time : temps utilisé uniquement par le système pour gérer l’exécution de tous les jobs pendant
     l’exécution du processus

Elapsed time = Temps du programme utilisateur + temps système + temps utilisé par les autres
tâches
    La commande ps : Processus state donne les processus du système et différentes informations
(PID, temps d’écution, nom ou commande correspond au processus ...). Tandis que la commande kill
-9 associée à un PID permet de tuer un processus.

2.2     La communication entre processus Unix
Les processus peuvent communiquer à travers deux outils de communication : Les pipes et les Sockets.
Nous allons étudier les pipes.

                            Processus                                 Processus
                            Producteur                               Consomateur
                                                  TUBE

                            Figure 2.2: Information circulant dans un pipe

Principe

2.2.1    Les pipes
Un pipe est un mécanisme qui transporte une information ou une donnée dans un seul sens à la fois
(cf fig. 2.2). Le producteur producteur envoie des données qui circulent dans un tuyau “virtuel” vers
le processus consomateur. On le nomme pipe ou tuyau en français, car les informations ne peuvent
pas se doubler. Une info A émise arrivera avant l’info B émise après A. C’est un mécanisme First In
First Out.
    Les processus peuvent changer de rôle, celui qui était consomateur peut devenir producteur et
l’autre peux devenir consommateur, à condition aussi que les processus modifient leur usage du pipe.
Par contre on ne peux pas avoir les deux processus producteurs ou les deux processus consomateurs
en même temps. Dès lors qu’une communication est établie, un pipe fonctionne à sens unique.
    Ce qui est singulier dans le pipe est que l’information disparaît après lecture. C’est pour cela que
l’on utilise le vocable de producteur/consomateur. Le producteur produit de l’information qui sera
retirée du pipe par le consommateur.
    Il existe deux catégories de pipes :

                                                  24
• Les pipes “non nommés” utilisables entre processus parents qui partagent le même environ-
     nement. Comme ces processus partagent le même environnement ils peuvent se transmettre les
     caractéristiques des pipes sans difficulté.

   • Les pipes “nommés” employés pour les communications entre processus sans liens de parenté. Ils
     s’apparentent à des fichiers en mémoire. Le fonctionnement est sensiblement le même. Ce sont
     des fichiers d’un type spécial à usage interne pour la communication entre processus. Le processus
     Consommateur, lorsqu’il se met en attente de lecture d’une information que le Producteur doit
     lui transmettre à travers le pipe, se synchronise sur ce dernier. Il reçoit, de plus, un message qui
     peut être utilisé pour diriger ses actions.

2.2.2    Les pipes “non nommés”
Si un pipe est nommé, il peut donc être partagé entre un père et sa toute descendance. Soit p le nom
du pipe :

   • p[0] : sortie du pipe, c’est par la que l’on retire de l’information

   • p[1] : entrée du pipe c’est par la que l’on dépose de l’information

    Pour comprendre leur fonctionnement, en voici un exemple réduit à sa plus simple expression.
On crée un pipe par la fonction pipe() puis un processus fils par fork(). Ce fils hérite de tout
l’environnement du père donc du pipe et de ses caractéristiques. Dans un pipe, p[0] représente la
sortie du pipe et p[1] l’entrée du pipe. Dans les deux processsus, un doit être le producteur et l’autre
le consommateur. Le producteur ferme le pipe en lecture par close(p[0]), pour lui le pipe ne peut donc
plus servir qu’en écriture. Celle-ci se fait par la fonction write() qui comprend trois arguments :

   • La structure d’écriture p[1] du pipe

   • La chaîne à transmettre

   • Le nombre de caractères de la chaine.

Si il a terminé sa production le producteur peut fermer p[1].
    Le deuxième fils créé, le consommateur, est employé pour lire les informations envoyées par le
producteur. Ce consommateur ferme le pipe en ecriture par close(p[1]), pour lui le pipe ne peut donc
plus servir qu’en lecture. Celle-ci se fait par la fonction read() qui comprend trois arguments :

   • La structure de lecture p[0] du pipe

   • La chaîne qui receptionne l’information

   • Le nombre de caractères que le consommateur désire recevoir.

Si il a terminé sa production le consommateur peut fermer p[0].

                                                   25
#include 
#include 
main() {
   int fils1, fils2, m, n, p[2], count; char buf[6];
       pipe(p);
       /* creation premier fils : Le producteur */
      if ((fils1=fork())== 0){
       char c;
       close (p[0]);
       fprintf(stdout,"(%d) est le Producteur: \n",getpid());
       do {
               scanf("%c",&c);
             write(p[1],&c,1);
       } while (c!=’T’);
       close(p[1]);
       fprintf(stdout,"fin production \n");
       exit(2);
    }

      /* creation du deuxieme fils : Le consommateur */
    else if ((fils2=fork())==0){
         fprintf(stdout,"fils2 (%d) : lit ds pipe\n",getpid());
         close (p[1]);
         do{
           count = read(p[0],lu,1);
           printf("\t \t \t \t LU : %c\n",*lu);
         }while (*lu != ’T’);
         fprintf(stdout,"fin de consommation \n");
         exit(3);
    }
    else{
        fprintf(stdout,"processus pere %d\n",getpid());
        close(p[0]);
        close(p[1]);
        fprintf(stdout, "wait fils : %d\n",wait(&m));
        fprintf(stdout, "wait fils : %d\n",wait(&n));
        fprintf(stdout, "fin du pere\n");
        exit(0);
    }
}

                                          26
2.2.3    Les sémaphores
Definition 2.2.1 (Semaphore) Un sémaphore est un object permettant à N processus ou thread
(tâche) d’accéder à une même région de code ou a une ressource critique

   Pour cela un sémaphore est un objet qui permet les actions suivantes :

   • L’initialisation

   • Le processus de réservation : semP

   • Le processus de libération : semV

   Code de SemP:

Masquer toutes les ITs;
S--;
if (S File_Attente(S);
reordonnancement();
}
Demasquer toutes les ITs;

Code de SemV :

Masquer toutes les ITs;
S++;
if (S
extern   int getpid();
extern   int fork();
extern   void sleep();
extern   int wait();

int ecran;    /*semaphore */

void imprime() {
  sem_P(ecran);
  for (int i=0;i
peux utilser un logiciel pu composant informatique. C’est donc un ensemble de fonction typée (décrites
dans un *.h) qui indique comment on peut interagir avec le composant. Les threads implémentent la
norme POSIX. Ceux sont des processus légers car ils ont été créés par un processus père avec qui ils
partagent avec lui le même espace mémoire.
   Ils ont les caractéristiques suivantes :

   • Ils peuvent avoir des variables communes (globales) et des variables locales ;

   • Ils partagent les mêmes fichiers et les mêmes ressources ;

   • Ils ont leur propre pile d’exécution ;

   • Ils sont ordonnancés ;

   Voir le code : API "pthread.h"

2.3.1    Création de thread
int         pthread_create(pthread_t *thread,
                           const pthread_attr_t *attr,
                           void *(*start_routine)(void *),
                           void *arg);

   • thread : identifiant, descripteur du thread ;

   • attr : attribut de création ;

   • start_routine : fonction constituant le corps du thread ;

   • arg : argument de la fonction.

void        pthread_exit(void *value_ptr) ;

int        pthread_join(pthread_t thread,
        void **value_ptr) ;

value_ptr : valeur de retour au père. thread : identifiant
   Voir le code : thread2.c
   Deux threads qui partagent et modifient une même variable globale peuvent provoquer un com-
portement non déterministe de l’application.

#include 
#include 
#include 
#include 
#include 
#define NBITER 11000

                                                     29
unsigned int globale=0;

void *ligne1(void *arg);
void *ligne2(void *arg);

int main(){
  int res;
  pthread_t l1, l2;
  char c;

//***************************************************************************
  res=pthread_create(&l1, NULL, ligne1, NULL);
//***************************************************************************
  if (res == -1) {
    perror(" erreur de creation du thread\n");
    exit (EXIT_FAILURE);
  }
//***************************************************************************
  res=pthread_create(&l2, NULL, ligne2, NULL);
//***************************************************************************
  if (res == -1) {
    perror(" erreur de creation du thread\n");
    exit (EXIT_FAILURE);
  }

    printf("attente des fils\n");
    pthread_join(l1,NULL);
    pthread_join(l2,NULL);
    printf("Fin du père, valeur finale de la variable globale = %d\n",globale);
    exit(EXIT_SUCCESS);
}

void *ligne1(void *arg) {
  for(int i=0;i
globale=globale+10;
    }
    printf("Fin du fils2\n");
    pthread_exit(NULL);
}

2.3.2     Protéger une variable globale accédèe par plusieurs thread, à l’aide
          d’un sémaphore
Pour assurer un accès atomique à une variable globale on va s’assurer que l’on ne sera pas interrompu
lorsque l’on modifie la variable. L’usage d’un sémaphore va premettre :

    1. Eviter une élection par l’ordonnanceur dans une région.

    2. Eviter toute interruption.

    3. Masquer les interruptions en début de région et les démasquer en fin de région

#include 
#include 
#include 
#include 
#include 
#include "semaphore.h"
#define NBITER 11000

unsigned int globale=0;

int ecran;

void *ligne1(void *arg);
void *ligne2(void *arg);

int main(){
  int res;
  pthread_t l1, l2;
  char c;

    sem_init();
    ecran=sem_creer(1);

//***************************************************************************
  res=pthread_create(&l1, NULL, ligne1, NULL);
//***************************************************************************

                                                  31
if (res == -1) {
    perror(" erreur de creation du thread\n");
    exit (EXIT_FAILURE);
  }
//***************************************************************************
  res=pthread_create(&l2, NULL, ligne2, NULL);
//***************************************************************************
  if (res == -1) {
    perror(" erreur de creation du thread\n");
    exit (EXIT_FAILURE);
  }

    printf("attente des fils\n");
    pthread_join(l1,NULL);
    pthread_join(l2,NULL);
    sem_detruire();
    printf("Fin du père, valeur finale de la variable globale = %d\n",globale);
    exit(EXIT_SUCCESS);
}

void *ligne1(void *arg) {
  for(int i=0;i
2.3.3      Tableau de threads et passage de paramètre
Boucle de création de thread. On va faire un travail à chaque thread qui est différent grâce à la variable
i. On utilise un sémaphore pour que chaque thread écrive sur une seule et même ligne.
#include 
#include 
#include 
#include 
#include "semaphore.h"
#define N 5 // nombre de threads
int ligne;

void *imprime(void *k){
  int p=(int) k+5,j=0;
  sem_P(ligne);
  for(j=1;j
34
Chapter 3

Système embarqué temps réel

3.1     La cible
La cible est un rack 5U ou 3A relié au PC par le réseau et par une liaison série. On y accède par son
adresse IP. Dans ce rack, on peut y ficher 3 à 5 cartes, dont une est la carte processseurs et les autres
des cartes d’entrées-sorties. On doit tout d’abord booter la cible comme on le ferait pour un PC.

3.1.1    Boot de la cible
Remarque 3.1.1 Boot Le boot c’est l’amorçage d’un système hardware par un programme appelé
bootloader. Le bootloader va chercher sur un périphérique (Disque Dur, Clef USB ou le réseau) un
exécutif qui s’installera en mémoire vive et appellera lui-même des programmes applicatifs.

Remarque 3.1.2 bootloader et MBR Le bootloader d’un PC est un programme placé dans le Master
Boot Record (MBR) qui réalise le boot. Le MBR est la zone d’amoçage d’un PC. Elle contient la table
des partitions (les 4 partitions primaires) du disque dur et le bootloader dont le but est de charger le
système d’exploitation.

3.1.2    Configurer le boot : U-Boot
Remarque 3.1.3 U-Boot U-Boot est un bootloader (logiciel libre), permettant de loader un exécutif
linux par le réseau (Ethernet). U-Boot implémente le protocole TFTP. U-Boot fonctionne sur des
centaines de cartes mère et a été développé pour la très grande majorité des processeurs existant :
PowerPC, ARM, XScale, MIPS, Coldfire, NIOS, Microblaze, et x86.

Proposition 3.1.1 TFTP Trivial File Tranfer Protocol : ce protocole permet de faire des transfert
de fichiers d’une machine à une autre. Il est basé sur l’architecture Client Serveur.

Commande de U-Boot : printenv
printenv : Cette commande affiche l’ensemble des variables de l’environnement.

                                                   35
=> printenv
baudrate=9600
bootdelay=5
stdin=serial
stdout=serial
netmask=255.255.255.0
ipaddr=172.22.64.170
serverip=172.22.64.172

Environment size: 992/16380 bytes
=> printenv ipaddr netmask
ipaddr=172.22.64.170
netmask=255.255.255.0
=>

Commande de U-Boot : setenv
setenv : Cette commande permet de définir une variable ou de supprimer une variable.
usage :
=> setenv   nom valeur
permet de   definir la variable nom avec valeur
=> setenv   nom
permet de   supprimer la variable valeur

Autre exemple :
=> setenv cons_opts console=tty0 console=ttyS0,${baudrate}
=> printenv cons_opts
cons_opts=console=tty0 console=ttyS0,${baudrate}

Commande de U-Boot : saveenv
Permet de sauvegarder de façon persistante dans la mémoire flash, toutes les valeurs des variables
positionnées par la commande setenv.

=> saveenv
Saving Enviroment to Flash...
Writing to Flash... done

=>

Commande de U-Boot : tftpboot
tfypboot : boote l’image par le réseau suivant les variables définies par setenv. Elle va chercher l’image
sur $serverip

=> help tftpboot
tftpboot [loadAddress] [bootfilename]

                                                   36
3.2     La carte d’entrée-sortie : VMOD
Spécifications générales
   • On a une carte porteuse VMOD_IO : proposant 4 emplacements en mezzanine pour des cartes
     filles ;

   • Cette carte porteuse réalise l’interface avec le Bus VME ;

3.2.1    VMOD_IO
Sur les 4 emplacements on a :

  1. deux cartes VMOD_TTL ;

  2. une carte VMOD_12E816 : carte d’entrée Convertisseur analogique-numérique ;

  3. une carte VMOD_12a4 : carte de sortie Convertisseur numérique-analogique ;

3.2.2    Les ports d’Entrées-sorties
Les Ports A, B et C
VMOD_TTL
Les 3 ports A, B et C :
   Cette carte sur un bus V M E via une interface de type M ODU Lbus+ propose 2 ports 8 bits et un
port 4 bits.

   • 20 entreées-sorties T T L optocouplées ;

   • Les 3 ports sont configurables en entrée ou en sortie.

   • Chaque bit du port peut fournir un courant max de 48 mA il est de type collecteur ouvert ;

   • A chaque port doit être alimenté.

   • Fonction secondaire timer (Zilog Z8536) sur les ports B et C.

                                                 37
VMOD_TTL            VMOD_12E8/16               VMOD12A4
           2O ES TTL        12 Entrees Analogiques   4 sorties Analogiques
                                    16 bits

VMOD_TTL

                            PORT C

                       PORT B
      PORT A
                            Vcc/Gnd

                                38
3.3     Drivers
Definition 3.3.1 Driver Un Driver (module) est un programme écrit généralement en Assembleur
permettant de lire et d’écrire sur un périphérique ou de réaliser des actions appellées "services". Un
module fournit des services ou utilise des services d’autres modules.
Le cas des drivers linux :
   • Statique : Les modules sont rajoutés dans la partie "File System" et compilé avec le noyau. Il
     sera présent même si le périphérique n’est plus utilisable
   • Dynamique : On alors un "module chargeable", les modules/drivers ne sont chargés QUE lorsque
     un programme en a besoin.
   Il existe différents types de pilotes suivant le périphérique à contrôler:
   • les pilotes en mode caractère
     Ex : ports séries et parallèles
   • les pilotes en mode bloc
     Ex : Disque dur.
   • les pilotes réseaux

3.3.1    Driver caractère
Avec ce matériel de TP, on n’utilisera que des pilotes en mode caractère. Ces pilotes sont accessibles
à travers des fichiers spéciaux appelés également noeuds (nodes). Ces fichiers sont localisés sur le
répertoire /dev et sont caractérisés par deux valeurs numériques :
   • Le MAJEUR (MAJOR) qui identifie le pilote
   • Le MINEUR (MINOR) qui représente une sous-adresse en cas de présence de plusieurs pé-
     riphériques identiques, contrôlés par un même pilote.

3.3.2    Installation de Drivers
Le fichier /etc/rc.sysinit permet de réaliser des installations des drivers/modules spécifiques.
   • La commande depmod a :
     Elle établit la liste des dépendances de modules en lisant pour tous les modules les services
     exportés ou importés.
   • La commande insmod programme simple permettant d’insérer un module dans le noyau sans
     s’occuper de dépendances éventuellement non satisfaites.
   • La commande modprobe programme simple permettant d’insérer un module dans le noyau.
     modprobe charge un module et les modules qui en dépendent.
   • rmmod décharge un module

                                                   39
3.3.3    Drivers de nos cartes d’ES
#depmod    a
#insmod copy_universe
#modprobe universe #modprobe vme_mod log = 4 level = 3
#modprobe modvme
#modprobe    v modat0

3.3.4    Installation du driver de la MTTL
                        #modprobe mttl.o io = 62, 0, 0, 0x3000a800, 0xa0, 0xd

   • 62 : major number : celui de la carte M T T L

   • 0 : num. carte V M ODIO sur bus V M E 2 [0, 15]

   • 0 : minor number emplacement de M T T L sur V M ODIO 2 [0, 3]

   • 0x3000a800 adr physique carte V M ODIO sur bus V M E

   • 0xa0 : adresse du vecteur d’IT

   • 0x0d : 0000 1101

1101 : 1: Opto, 1: C en sortie, 0: B en entrée, 1: A en sortie

Drivers de nos cartes d’ES
Installation des deux cartes T T L :
                        #insmod mttl   v io = 62, 0, 0, 0x3000a800, 0xa0, 0xd 62, 0, 0, 0x3000a800, 0xa0, 0xd

Exemple simple de Driver Linux
Ecriture du driver hello.c:

#include 
#include 

int init_module(void)
{
  printk("Driver chargé n");
  return 0;
}

                                                              40
void cleanup_module(void)
{
  printk("Driver déchargé \n");
}

Compilation et utilisation de Driver Linux
Ce code constitue la base d’un module chargeable. Si on le compile par:

$gcc -Wall -c hello.c -o hello.o -D__KERNEL__
          -I /usr/include/linux/ -O2

on pourra insérer dynamiquement le module par la commande insmod:

$insmod   hello.o

Ce qui provoque le chargement du module (voir lsmod) et l’apparition du message dans les traces du
noyau.
   Chargement du module :

[exemple]# lsmod
Module                  Size       Used by
hello                    184        0 (unused)
3c509                   5972        1 (autoclean)
vfat                    9116        0 (unused)
fat                    30048        0 [vfat]
[exemple]# dmesg | tail -1
Module chargé

De même si on décharge le module par rmmod on obtient:

[exemple]# rmmod hello   S
[exemple]# dmesg | tail -1
Module déchargé

                                                41
42
Chapter 4

ANNEXES

4.1     Connectivité IP
Definition 4.1.1 Connectivité IP La connectivité IP permet de raccorder tout système électronique
au réseau internet. Elle met en oeuvre une suite de protocole que l’on doit embarquer sur le système.

Avantages :

   • Contrôler à distance les SETR ;

   • usage d’interfaces graphiques modernes et banalisées : navigateur web ;

   • Evolution du télécontrôle : RS232 et terminal V T 100.

4.1.1    Le protocole IP
Definition 4.1.2 Protocole IP Protocole basé sur le modèle OSI à 7 couches.

Definition 4.1.3 Modèles OSI Ensemble de couches. Une couche crée un niveau d’abstraction en
raffinant un service de base pour donner des services plus élaborés au niveau supérieur.

4.1.2    Les 7 couches du modèle OSI
  1. Couche physique : transmettre des bits ;

  2. Couche liaison : transmettre des trames, détection et correction d’erreurs ;

  3. Couche réseau : routage et acheminement des données, constitutions de paquets de trames,
     gestion de la congestion du réseau ;

  4. Couche Transport : gestion du dialogue entre 2 noeuds (sockets, pipe, ....), mode connecté (TCP)
     ou non (UDP).

  5. Couche session : structuration du dialogue (client-serveur) ;

                                                 43
6. Couche représentation : représentation des données format, compression, cryptage,...
  7. Couche Application : Interface shell, webmail, firefox, ...

4.1.3   Le réseau Internet : 4 couches
  1. Couche médium : transmettre des trames de bits (couche 1 et 2) : Ethernet, GSM, Courant
     porteur,...
  2. Couche IP : routage et Acheminement des données (couche 3)
  3. Couche TCP (ou UDP) : gestion du dialogue entre 2 noeuds mode connecté (TCP) ou non (UDP)
     (couche 4);
  4. Couche Application : de structuration du dialogue jusqu’a l’interface (couche 5,6,7).

Architecture Internet

                                 Client FTP     Protocole ftp            Serveur FTP

                                   TCP         Protocole TCP                TCP

                                    IP                                       IP
                                                Protocole IP

                                  Médium                                   Médium

                                              trames propres au médium

                                     Figure 4.1: Réseaux 4 couches

Adressage
  1. Chaque ordinateur ou système embarqué est repéré par une adresse IP unique sur 32 bist.
  2. Notation décimale : 172.22.64.173 : 4 octets (255 < x < 0)
  3. ADRESSE IP : id réseau + id machine
  4. 1 octet : id Réseau
  5. dernier octet : 255 broadcast, 1 : Gateway

                                                     44
Protocole IP
  1. version IPv4 : 4 bits d’entête

  2. 8 bits : priorité, préférences sur la qualité

  3. 2 octets : Longueur totale

  4. 4 octets : identification, drapeaux,..

  5. 1 octet durée de vie : nombre de routeurs traversés

  6. 1 octet de protocole : 6 -> TCP, 17 UDP,...

  7. header checksum

  8. 20 octets maximum pour le message

  9. adresse IP source et destination

 10. options

Protocole TCP et UDP
  1. Utilise IP comme service réseau

  2. TCP procure un service de transport en mode connecté sécurisé (demande de ré-emission si
     echec)

        • Connexion par handshake ;
        • Transfert de données ;
        • acquitement ;
        • fermeture des connexions;
        • exemple : chat, telnet, ftp

  3. U DP procure un service de transport en mode non connecté et non sécurisé.

        • Adresse materielle de la machine appellée
        • adresse IP
        • numéro du port
        • exemple : mail

                                                     45
L’API Socket
LES SOCKETS IMPLEMENTENT LES PROTOCOLES TCP ET UDP
  1. Elles permettent d’échanger des octets entre une application cliente et une application serveur.
  2. Les données passent en clair dans le réseau.
  3. SSL : est une nouvelle API basée sur les sockets pour échanger des données sécurisées.

Applications telnet et rlogin
Elles utilisent TCP
  1. telnet est une appli client/serveur en mode connecté.
  2. rlogin ne fonctionne qu’entre 2 machine UNIX. telnet est faisable sous windows
  3. Un daemon serveur doit tourner sur la machine appellée.

4.1.4    Applications NFS
  1. Permet de rendre transparente l’utilisation de fichiers répartis sur différentes machines.
  2. NFS utilise UDP, les nouvelles versions utilisent TCP.
  3. Est particulièrement utile pour les SETR diskless

Montage NFS
NFS
   • NFS (Network File System) permet de partager des fichiers entre ordinateurs sous un environ-
     nement Linux et/ou Unix (des implémentations existent pour Macintosh et MS Windows).
   • Il existe plusieurs version de NFS : NSF 1 et 2 son obsolètes et NFS 3 : Non sécurisé et NFS 4.
   • Usage : Partage d’un répertoire (projet).
   • Basée sur la notion de point de montage

Point de Montage
En linux tout est fichier ou répertoire (Noeud).
Definition 4.1.4 Point de montage Sous linux : Un disque dur, un lecteur de CDROM ou une clef
USB correspondent à un répertoire. Ces éléments physiques doivent être montés et démontés après
usage. Le montage correspond à la création d’un lien entre l’élément physique et le répertoire.
   • mount      t iso9660 /dev/cdrom/media/cdrom
   • umount /media/cdrom

                                                    46
Montage NFS
C’est un système client       serveur.
   • Le client importe des fichiers.
   • Le serveur exporte ses fichiers.
Principe
   • Installation sur le serveur : Dans /etc/exports
     /public ⇤ (rw, no_root_squash, sync)
     #exportf s     a
     #/etc/init.d/nf s_kernel_server restart

   • Le Client :

   • mount          t nf s 172.22.64.175 : /public /mnt   o nolock
   • umount/mnt

4.1.5      Applications ftp
  1. Permet de faire des transfert de fichiers ;
  2. nécessite une connexion par login et mot de passe.
  3. il existe des serveurs anonymous, le mot de passe est alors son email.
           •   ftp 172.22.64.173
           •   login passwd
           •   put file
           •   mget file.*
           •   bye

4.1.6      Applications http
  1. Protocole de communicatoin et d’échange de documents sur le web
  2. Est écrit en utilisant l’API SOCKET
  3. Tous les navigateurs sont des applications client/serveur basé sur l’API Socket.
  1. Protocole de communicatoin et d’échange de documents sur le web
  2. Est écrit en utilisant l’API SOCKET
  3. Tous les navigateurs sont des applications client/serveur basé sur l’API Socket.

                                                     47
Vous pouvez aussi lire