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 ? |
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. |