98 | | = 3 Travail à réaliser = |
| 98 | = 3 Communications par interruption == |
| 99 | |
| 100 | La plate-forme matérielle du TP3 utilisait une technique de scrutation (polling) pour lire des caractères en provenance du terminal TTY. |
| 101 | Cette technique n'est pas très efficace, et on souhaite remplacer ce mécanisme de scrutation par un mécanisme d'interruption, |
| 102 | en utilisantla capacité du contrôleur TTY à générer une interruption lorsque qu'un caractère est frappé sur le clavier. |
| 103 | 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 |
| 104 | [https://www.soclib.fr/trac/dev/wiki/Component/VciIcu ici]. |
| 105 | |
| 106 | On en profite pour introduire un autre périphérique : Le composant '''vci_multi_timer''' est également une cible VCI |
| 107 | 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 |
| 108 | [https://www.soclib.fr/trac/dev/wiki/Component/VciMultiTimer ici]. |
| 109 | |
| 110 | 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. |
| 111 | |
| 112 | [[Image(soclib_tp4_cluster.png)]] |
| 113 | |
| 114 | On associe à chaque ligne d'interruption une routine de traitement spécifique, |
| 115 | appelée ISR (Interrupt Service Routine), qui est exécutée par le processeur lorsque la ligne d'interruption |
| 116 | est activée par le périphérique, et que les interruptions ne sont pas masquées. |
| 117 | Il s'agit donc pour le périphérique de "voler" quelques cycles du processeur pour lui permettre d'exécuter |
| 118 | un peu de code. L'ISR permet généralement au périphérique de signaler un événement |
| 119 | en allant écrire à certains emplacements prédéfinis en mémoire. |
| 120 | |
| 121 | Pour communiquer avec un périphérique, un programme utilisateur peut donc utiliser |
| 122 | un tampon mémoire partagé DATA, protégé par une variable de synchronisation SYNC. |
| 123 | Supposons qu'un programme utilisateur souhaite lire un caractère sur un terminal TTY. |
| 124 | Plutôt que d'effectuer un appel système bloquant (qui effectue une scrutation directement sur le registre STATUS |
| 125 | du TTY), le programme utilisateur va appeler une fonction de communication qui s'exécute en mode ''user'', et qui |
| 126 | effectue une scrutation sur la variable SYNC. Le tampon est partagé entre le périphérique TTY et le programme |
| 127 | utilisateur : |
| 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 | |
| 131 | Il 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 |
| 134 | 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'''. 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 = |
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''' |
| 175 | Modifiez le fichier '''tp3_top.cpp''' pour instancier et connecter les deux nouveaux composants ICU et TIMER. |
| 176 | On instanciera un seul terminal TTY et un seul TIMER. Renommez '''tp4_top.cpp''' le fichier ainsi modifié. |
| 177 | Complètez également le fichier '''tp3_desc''' et renommez le '''tp4_desc''' |
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 |
| 181 | Le logiciel doit également être modifié pour supporter la communication par interruption entre un programme |