| 152 | '' |
| 153 | }}} |
| 154 | 1. Sur une plateforme (autre que celle des TP) sur laquelle on aurait un TTY0 sur l'entrée 5, un TIMER sur l'entrée 2, et un autre TTY1 sur l'entrée 14. Que doit-on faire pour que seuls les TTY1 et le TIMER soient démasqués et que TTY0 soit masquée ?\\Si les 3 IRQ se lèvent au même cycle, quelles seront les valeurs des registres `ICU_STATE`, `ICU_MASK` et `ICU_HIGHEST` ? |
| 155 | {{{#!protected ------------------------------------------------------------------------------------ |
| 156 | '' |
| 157 | * on doit écrire `1` dans les bits 2 et 14 du registre `ICU_SET` donc `0b00000000.00000000.01000000.00000100` = `0x00004004` |
| 158 | * on doit écrire `1` dans le bit 4 du registre `ICU_CLEAR` donc `0b00000000.00000000.00000000.00100000` = `0x00000020` pour être sûr que le bit 5 de `ICU_MASK` soit à 0. (au reset, tous les bits de `ICU_MASK` sont à 0, mais là on ne sait pas si c'est juste après le reset) |
| 159 | * Si les 3 IRQ s'activent alors `ICU_STATE` ← `0x00000000.00000000.01000000.00010100` = `0x00004014`\\ |
| 160 | on ne sait pas ce qu'il y a dans `ICU_MASK`, sauf pour les bits 2, 5 et 14 mais on sait qu'il ne change pas de valeur et `ICU_HIGHEST ← 2` (le plus petit numéro d'IRQ). |
339 | | 1. La configuration des périphériques et des interruptions est faites dans la fonction `arch_init()` appelée par `kinit()`.\\Comment configurer l'ICU pour démasquer l'IRQ connectée sur son entrée n°0 en utilisant la fonction `icu_set_mask()` définie une peu plus haut dans ce texte ? |
340 | | {{{#!protected ------------------------------------------------------------------------------------ |
341 | | '' |
342 | | * Il suffit d'appeler `icu_set_mask (0,0;` puisque `icu` = 0` et `irq = 0`. |
343 | | '' |
344 | | }}} |
345 | | |
346 | | {{{#!comment |
347 | | |
348 | | 1. Le TIMER est le composant qui produit périodiquement des IRQ, (mettre la structure) écrivez le code d'une fonction qui active une IRQ tous les 1000 cycles. |
349 | | {{{#!protected ------------------------------------------------------------------------------------ |
350 | | '' |
351 | | '' |
352 | | }}} |
353 | | 1. Comment configurer le noyau pour qu'il exécute une ISR nommée `x_isr()` pour un périphérique `x` dont l'IRQ est connectée à l'entrée 3 ? |
354 | | {{{#!protected ------------------------------------------------------------------------------------ |
355 | | '' |
356 | | '' |
357 | | }}} |
358 | | 1. Pourquoi est-ce plus simple d'exécuter le traitement des interruptions en mode in-interruptible ? |
359 | | {{{#!protected ------------------------------------------------------------------------------------ |
360 | | '' |
361 | | '' |
362 | | }}} |
363 | | 1. On a vu qu'un syscall est comme un appel de fonction, il ne garantie pas que les registres temporaires sont conservés, mais il garantit que les registres persistants le sont. Est-ce que c'est pareil pour les interruptions ? |
364 | | {{{#!protected ------------------------------------------------------------------------------------ |
365 | | '' |
366 | | '' |
367 | | }}} |
368 | | |
| 336 | 1. La configuration des périphériques et des interruptions est faites dans la fonction `arch_init()` appelée par `kinit()`.\\Ecrivez les instructions C permettant d'ajouter le TIMER dans le noyau avec un tick de 1000000 (1 milion de cycle). Il faut (1) Démasquer l'IRQ venant du timer dans l'ICU, laquelle est connectée sur son entrée n°0 ; (2) initialiser le timer, (3) initialiser le vecteur d'interruption avec la fonction `timer_isr` pour ce timer `0`. |
| 337 | {{{#!protected ------------------------------------------------------------------------------------ |
| 338 | '' |
| 339 | * Il faut une séquence de 4 instructions : |
| 340 | {{{#!c |
| 341 | timer_init (0, tick); // sets period of timer n'0 (thus for CPU n'0) and starts it |
| 342 | icu_set_mask (0, 0); // [CPU n'0].IRQ <-- ICU.PIN[0] <- Interrupt signal timer n'0 |
| 343 | irq_vector_isr [0] = timer_isr; // tell the kernel which isr to exec for ICU.PIN n'0 |
| 344 | irq_vector_dev [0] = 0; // device instance attached to ICU.PIN n'0 |
| 345 | }}} |
| 346 | '' |