Changes between Version 19 and Version 20 of Archi-1-TP11


Ignore:
Timestamp:
Dec 10, 2021, 6:55:35 AM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP11

    v19 v20  
    261261}
    262262
     263static void icu_set_mask (int icu, int irq) {
     264    __icu_regs_map[icu].set = 1 << irq;
     265}
     266
    263267void irq_handler (void) {
    264268    int irq = icu_get_highest (cpuid());       
     
    266270}
    267271
    268 static void icu_set_mask (int icu, int irq) {
    269     __icu_regs_map[icu].set = 1 << irq;
    270 }
    271 }}}
    272  `extern volatile struct icu_s __icu_regs_map[NCPUS];` informe le compilateur que le symbole `__icu_regs_map` est défini ailleurs et que c'est un tableau de structures de type `struct icu_s`. Ainsi, `gcc` sait comment utiliser cette variable `__icu_regs_map`.
    273 1. Dans quel fichier est défini `__icu_regs_map` ?
     272}}}
     273 La déclaration `extern volatile struct icu_s __icu_regs_map[NCPUS];` informe le compilateur que le symbole `__icu_regs_map` est défini ailleurs et que c'est un tableau de structures de type `struct icu_s`. Ainsi, `gcc` sait comment utiliser cette variable `__icu_regs_map`.\\\\
     274 Rappelez dans quel fichier est défini `__icu_regs_map` ?\\
     275 Que font les fonctions `icu_get_highest()`, `icu_set_mask()` et `irq_handler()`?\\
     276 Comment s'appelle le couple de tableaux `irq_vector_isr[irq]` et `irq_vector_dev[irq]` ?\\
     277 Combien ont-il de cases ?
    274278{{{#!protected ------------------------------------------------------------------------------------
    275279''
    276280  * Ce symbole est défini dans le fichier ldscript du kernel `kernel/kernel.ld`
    277 ''
    278 }}}
    279 1. Que fait la fonction `icu_get_highest` ?
    280 {{{#!protected ------------------------------------------------------------------------------------
    281 ''
    282   * Elle lit le registre `ICU_HIGHEST` de l'ICU et rend donc le numéro de l'IRQ la plus prioritaire.
     281  * `icu_get_highest()` lit le registre `ICU_HIGHEST` de l'ICU et rend donc le numéro de l'IRQ la plus prioritaire.
     282  * `icu_set_mask()` met 1 dans le bit n°`irq` du registre `ICU_SET` de l'ICU n°`icu` (ici `icu` est à 0 parce qu'il faut une ICU par MIPS et qu'il n"y a qu'un seul MIPS). Cela a pour effet de mettre à `1` dans le bit n*`irq` du registre `ICU_MASK`.
     283  * `irq_handler()` va chercher dans l'ICU le numéro de l'IRQ la plus prioritaire et la copie dans la variable `irq` (cette notion de priorité n'a de sens que dans le cas où au moins deux IRQ sont actives en même temps). `irq_handler()` appelle la fonction ISR qui est dans la case n°`irq` du tableau `irq_vector_isr[]` et lui donne en argument le numéro d'instance qui est dans la case n°`irq` du tableau `irq_vector_dev[]`.
     284  * Les deux tableaux constituent le vecteur d'interruption et ils ont autant de cases que l'ICU prend d'IRQ, c.-à-d. 32.
    283285''
    284286}}}