Changes between Version 45 and Version 46 of SoclibCourseTp4


Ignore:
Timestamp:
Oct 21, 2009, 6:25:49 PM (15 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SoclibCourseTp4

    v45 v46  
    11{{{
    22#!html
    3 <h1>TP4 : Chaîne de compilation soclib-cc</h1>
     3<h1>TP4 : Outil soclib-cc & communications par interruption</h1>
    44}}}
    55[[PageOutline]]
     
    9696}}}
    9797
    98 = 3 Travail à réaliser =
     98= 3 Communications par interruption ==
     99
     100La plate-forme matérielle du TP3 utilisait une technique de scrutation (polling) pour lire des caractères en provenance du terminal TTY.
     101Cette technique n'est pas très efficace, et on souhaite remplacer ce mécanisme de scrutation par un mécanisme d'interruption,
     102en utilisantla capacité du contrôleur TTY à générer une interruption lorsque qu'un caractère est frappé sur le clavier.
     103Ceci nécessite d'introduire un nouveau composant matériel dans l'architecture : Le composant '''vci_icu''' est  contrôleur d'interruptions vectorisé. C'est une cible VCI dont vous trouverez  la spécification fonctionnelle
     104[https://www.soclib.fr/trac/dev/wiki/Component/VciIcu ici].
     105
     106On en profite pour introduire un autre périphérique : Le composant '''vci_multi_timer''' est également une cible VCI
     107contenant un nombre queconque de timers programmables capables de générer des interruptions périodiques à destination du processeur. Vous trouverez la spécification fonctionnelle de ce composant
     108[https://www.soclib.fr/trac/dev/wiki/Component/VciMultiTimer ici].
     109
     110On obtient ainsi une architecture possédant un initiateur VCI et 6 cibles VCI, conformément au schéma ci-dessous. La line d'interruption en provenance du composant TIMER sera connectée au port '''p_irq_in[0]''' du composant ICU et la ligne d'interruption en provenance du contrôleur TTY sera connectée au port '''p_irq_in[1]''' du composant ICU.
     111
     112[[Image(soclib_tp4_cluster.png)]]
     113
     114On associe à chaque ligne d'interruption une routine de traitement spécifique,
     115appelée ISR (Interrupt Service Routine), qui est exécutée par le processeur lorsque la ligne d'interruption
     116est activée par le périphérique, et que les interruptions ne sont pas masquées.
     117Il s'agit donc pour le périphérique de "voler" quelques cycles du processeur pour lui permettre d'exécuter
     118un peu de code. L'ISR permet généralement au périphérique de signaler un événement 
     119en allant écrire à certains emplacements prédéfinis en mémoire.
     120
     121Pour communiquer avec un périphérique, un programme utilisateur peut donc utiliser
     122un tampon mémoire partagé DATA, protégé par une variable de synchronisation SYNC.
     123Supposons qu'un programme utilisateur souhaite lire un caractère sur un terminal TTY.
     124Plutôt que d'effectuer un appel système bloquant (qui effectue une scrutation directement sur le registre STATUS
     125du TTY), le programme utilisateur va appeler une fonction de communication qui s'exécute en mode ''user'', et qui
     126effectue une scrutation sur la variable SYNC. Le tampon est partagé entre le périphérique TTY et le programme
     127utilisateur :
     128 * Le périphérique TTY écrit dans le tampon  DATA et active la variable SYNC (en déclenchant l'exécution de la routine d'interruption).
     129 * Le programme utilisateur  lit dans le tampon DATA et désactive la variable SYNC.
     130
     131Il existe évidemment un mécanisme symétrique pour l'écriture d'un caractère vers le contrôleur TTY.
     132
     133'''Question:''' Que fait la routine d'interruption déclenchée par le périphérique TTY lors de la frappe d'un caractère lorsque la variable SYNC est déjà activée ? (ceci signifie
     134que le précédent caractère écrit dans le tampon DATA n'a pas été lu par le programme utilisateur). La réponse se trouve dans le fichier '''isr.c'''. Expliquez ce comportement. 
     135
     136'''Question:''' Quel est l'avantage de ce type de communication par interruption, comparé au mécanisme de scrutation utilisé dans le TP3 ?
     137
     138= 4 Travail à réaliser =
    99139
    100140L'archive [attachment:soclib_tp4.tgz soclib_tp4.tgz] contient différents fichiers dont vous aurez besoin pour ce TP.
     
    109149== 4.1 Utilisation de soclib-cc ==
    110150
    111 On va pour commencer regénérer le simulateur utilisé dans le TP3, en utilisant '''soclib-cc'''.
     151On va commencer par regénérer le simulateur utilisé dans le TP3, en utilisant '''soclib-cc'''.
    112152
    113153Comme vous pouvez le constater, le répertoire principal de l'archive ne contient
     
    131171}}}
    132172 
    133 == 4.2 Contrôleur d'interruptions et timer ==
     173== 4.2 Communication par interruptions ==
    134174
    135 La plate-forme matérielle du TP3 utilisait une technique de scrutation (polling) pour lire des caractères en provenance du terminal TTY. On souhaite donc remplacer ce mécanisme de scrutation par un mécanisme d'interruption, en utilisant
    136 la capacité du contrôleur TTY à générer une interruption lorsque qu'un caractère est frappé sur le clavier.
    137 Ceci nécessite d'introduire un nouveau composant matériel dans l'architecture : Le composant '''vci_icu''' est  contrôleur d'interruptions vectorisé. C'est une cible VCI dont vous trouverez  la spécification fonctionnelle
    138 [https://www.soclib.fr/trac/dev/wiki/Component/VciIcu ici].
    139 
    140 On en profite pour introduire un autre périphérique : Le composant '''vci_multi_timer''' est également une cible VCI
    141 contenant un nombre queconque de timers programmables capables de générer des interruptions périodiques à destination du processeur. Vous trouverez la spécification fonctionnelle de ce composant
    142 [https://www.soclib.fr/trac/dev/wiki/Component/VciMultiTimer ici].
    143 
    144 On obtient ainsi une architecture possédant un initiateur VCI et 6 cibles VCI, conformément au schéma ci-dessous. La line d'interruption en provenance du composant TIMER sera connectée au port '''p_irq_in[0]''' du composant ICU et la ligne d'interruption en provenance du contrôleur TTY sera connectée au port '''p_irq_in[1]''' du composant ICU.
    145 
    146 [[Image(soclib_tp4_cluster.png)]]
    147 
    148 Modifiez le fichier '''tp3_top.cpp''' pour instancier et connecter ces deux nouveaux composants (avec un seul terminal TTY et un seul TIMER), et renommez
    149 '''tp4_top.cpp''' le fichier ainsi modifié. Complètez également le fichier '''tp3_desc''' et renommez le '''tp4_desc'''
     175Modifiez le fichier '''tp3_top.cpp''' pour instancier et connecter les deux nouveaux composants ICU et TIMER.
     176On instanciera un seul terminal TTY et un seul TIMER. Renommez '''tp4_top.cpp''' le fichier ainsi modifié.
     177Complètez également le fichier '''tp3_desc''' et renommez le '''tp4_desc'''
    150178
    151179Utilisez '''soclib-cc''' pour générer le simulateur '''tp4_simulator.x'''.
    152180
    153 == 4.3 Communication par interruptions ==
    154 
    155 On associe à chaque ligne d'interruption une routine de traitement spécifique,
    156 appelée ISR (Interrupt Service Routine), qui est donc exécutée par le processeur lorsque la ligne d'interruption
    157 est activée par le périphérique, et que les interruptions ne sont pas masquées.
    158 Il s'agit donc pour le périphérique de "voler" quelques cycles du processeur pour lui permettre d'exécuter
    159 un peu de code. L'ISR permet généralement au périphérique de signaler un événement au systèmes d'exploitation
    160 en allant écrire à certains emplacements prédéfinis en mémoire.
    161 
    162 Pour communiquer avec un périphérique, un programme utilisateur peut donc utiliser
    163 un tampon mémoire partagé DATA, protégé par une variable de synchronisation SYNC.
    164 Supposons qu'un programme utilisateur souhaite lire un caractère sur un terminal TTY.
    165 Plutôt que d'effectuer un appel système bloquant (qui effectue une scrutation directement sur le registre STATUS
    166 du TTY), le programme utilisateur va appeler une fonction de communication qui s'exécute en mode ''user'', et qui
    167 effectue une scrutation sur la variable SYNC. Le tampon est partagé entre le périphérique TTY et le programme
    168 utilisateur :
    169  * Le périphérique TTY écrit dans le tampon  DATA et active la variable SYNC (en déclenchant l'exécution de la routine d'interruption).
    170  * Le programme utilisateur  lit dans le tampon DATA et désactive la variable SYNC.
    171 
    172 Il existe évidemment un mécanisme symétrique pour l'écriture d'un caractère vers le contrôleur TTY.
    173 
    174 Le logiciel doit  être modifié pour supporter la communication par interruption entre un programme
     181Le logiciel doit  également être modifié pour supporter la communication par interruption entre un programme
    175182utilisateur et un périphérique:
    176183 * le fichier '''isr.s''' contient le codes des routines d'interruption associées aux différentes requêtes d'interruption générées par les périphériques. Il y a une routine par ligne d'interruption. Ce code est écrit en assembleur, et s'exécute en mode ''kernel''.
     
    179186(c'est à dire le tableau indexé par le numéro d'interruption, et contenant les adresses des différentes ISR).
    180187
    181 '''Question:''' Que fait la routine d'interruption déclenchée par le périphérique TTY lors de la frappe d'un caractère lorsque la variable SYNC est déjà activée ? (ceci signifie
    182 que le précédent caractère écrit dans le tampon DATA n'a pas été lu par le programme utilisateur). La réponse se trouve dans le fichier '''isr.c'''  Pourquoi ce comportement ? 
    183 
    184 '''Question:''' Quel est l'avantage de ce type de communication par interruption, comparé au mécanisme de scrutation utilisé dans le TP3 ?
    185 
    186188Modifiez le fichier reset.s pour initialiser les routines d'interruption correspondant au à la ligne IRQ[0] du composant '''vci_timer''', et à la ligne IRQ[0] du contrôleur TTY (lecture d'un caractère).
    187189
    188 Modifiez le fichier '''main.c''' du TP3 (fourni dans l'annexe) pour qu'il utilise la fonction utilisateur  ''user_getc()'' au lieu de l'appel système ''tty_getc()''.
    189 Vous n'oublierez pas d'introduire au début du programme main() l'appel système qui permet d'activer les
     190Modifiez le fichier '''main.c''' du TP3 (fourni dans l'annexe) pour qu'il utilise la fonction utilisateur  ''user_getc()'' au lieu de l'appel système ''tty_getc()''. N''oubliez pas d'introduire au début du programme main() l'appel système qui permet d'activer les
    190191entrées d'interruption IRQ_IN[0] et IRQ_IN[1] du concentrateur d'interruption ICU.
    191192