Changes between Version 27 and Version 28 of Archi-1-TP11


Ignore:
Timestamp:
Dec 11, 2021, 12:19:21 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP11

    v27 v28  
    7777
    7878
    79 
    80 = Questions de cours sur les interruptions
    81 
    82 
    83 
    84791. A quelles adresses dans l'espaces d'adressage sont placés les registres des 3 contrôleurs de périphériques de la plateforme et comment le kernel les connaît ?
    8580{{{#!protected ------------------------------------------------------------------------------------
     
    155150''
    156151  * Il faut écrire `1` dans le bit `0` de `ICU_SET`.
     152''
     153}}}
     1541. 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).
    157161''
    158162}}}
     
    306310{{{#!protected ------------------------------------------------------------------------------------
    307311''
    308   * Elle met à `1` le bit `irq` du registre `ICU_MASK` de l'ICU n°`icu` (ici `0`).
    309 ''
    310 }}}
    311 
    312 
    313 
    314 = Exercices
    315 
    316 
    317 
    318 1. Supposons que l'on ait défini les registres du TIMER de la façon suivante :
     312  * Elle met à `1` le bit `irq` du registre `ICU_MASK` de l'ICU n°`icu` (ici c'est nécessaire `0` puisqu'il n'y a qu'un seul MIPS donc une seule ICU).
     313''
     314}}}
     3151. Les registres du TIMER sont définis dans le code du noyau de la façon suivante :
    319316{{{#!c
    320317struct timer_s {
     
    337334}}}
    338335}}}
    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 
     3361. 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
     341timer_init (0, tick);           // sets period of timer n'0 (thus for CPU n'0) and starts it
     342icu_set_mask (0, 0);            // [CPU n'0].IRQ <-- ICU.PIN[0] <- Interrupt signal timer n'0
     343irq_vector_isr [0] = timer_isr; // tell the kernel which isr to exec for ICU.PIN n'0
     344irq_vector_dev [0] = 0;         // device instance attached to ICU.PIN n'0
     345}}}
     346''
    369347}}}
    370348
     
    373351= TME sur les interruptions.
    374352
     353
     354
     355
    375356== Ajout de l'ISR timer
    376357