167 | | * Il faut écrire dans le registre `TIMER_RESETIRQ` |
168 | | '' |
169 | | }}} |
170 | | 1. Est-ce que le registre `TIMER_VALUE` peut activer (on dit aussi lever) un signal d'interruption ? |
171 | | 1. À quel moment doit-on initialiser le vecteur d'interruption ? |
172 | | 1. En quoi consiste la liaison des interruptions (''interrupt binding'' en anglais) ? |
173 | | 1. Expliquer le rôle des bits `UM`, `EXL` et `IE` du registre `C0_SR`. |
174 | | 1. Comment le noyau sait-il que la cause de son invocation est une interruption ? |
175 | | 1. Quelle instruction permet de sortir du noyau pour revenir dans le code interrompu ? et que fait-elle précisément ? |
176 | | 1. Rappeler la différence entre un registre temporaire et un registre persistant. |
177 | | 1. Pour qu'une IRQ soit effectivement prise en compte, il faut que le périphérique la lève et qu'elle ne soit pas masquée. Il y a plusieurs endroits où on peut masquer une IRQ, lesquels ? |
| 167 | * Il faut écrire n'importe quelle valeur dans le registre `TIMER_RESETIRQ` |
| 168 | '' |
| 169 | }}} |
| 170 | 1. Est-ce que le registre `TIMER_VALUE` peut activer (on dit aussi lever) un signal d'interruption ?{{{#!protected ------------------------------------------------------------------------------------ |
| 171 | '' |
| 172 | * Non, c'est seulement un compteur de cycles. |
| 173 | '' |
| 174 | }}} |
| 263 | '' |
| 264 | }}} |
| 265 | 1. À quel moment doit-on initialiser le vecteur d'interruption ? |
| 266 | {{{#!protected ------------------------------------------------------------------------------------ |
| 267 | '' |
| 268 | * Ici, c'est demandé par la fonction `kinit()`. |
| 269 | '' |
| 270 | }}} |
| 271 | 1. En quoi consiste la liaison des interruptions (''interrupt binding'' en anglais) ? |
| 272 | {{{#!protected ------------------------------------------------------------------------------------ |
| 273 | '' |
| 274 | * C'est le fait de lier une IRQ de périphérique et une ISR, c'est fait par le vecteur d'interruption. |
| 275 | '' |
| 276 | }}} |
| 277 | 1. Comment le noyau sait-il que la cause de son invocation est une interruption ? |
| 278 | {{{#!protected ------------------------------------------------------------------------------------ |
| 279 | '' |
| 280 | * Dans kentry, c'est en analysant le champ `XCODE` du registre `c0_cause`. |
| 281 | '' |
| 282 | }}} |
| 283 | 1. Quelle instruction permet de sortir du noyau pour revenir dans le code interrompu ? et que fait-elle précisément ? |
| 284 | {{{#!protected ------------------------------------------------------------------------------------ |
| 285 | '' |
| 286 | * c'est l'instruction `eret` qui fait : `c0_sr.EXL` ← `0` et `PC` ← `EPC` |
| 287 | '' |
| 288 | }}} |
| 289 | 1. Rappeler la différence entre un registre temporaire et un registre persistant. |
| 290 | {{{#!protected ------------------------------------------------------------------------------------ |
| 291 | '' |
| 292 | * C'est lors d'un appel de fonction, les registres temporaires peuvent perdre leur valeur parce que la fonction appelée peut les utiliser sans être obligée de restaurer leur valeur. |
| 293 | * A contrario, les registres persistants conservent leur valeur. C'est-à-dire que si une fonction appelée veut utiliser un registre persistant, elle doit sauver sa valeur à l'entrée de la fonction, pour la restaurer avant de revenir à la fonction appelante. |
| 294 | '' |
| 295 | }}} |
| 296 | 1. Pour qu'une IRQ soit effectivement prise en compte, il faut que le périphérique la lève et qu'elle ne soit pas masquée. Il y a plusieurs endroits où on peut masquer une IRQ, lesquels ? |
| 297 | {{{#!protected ------------------------------------------------------------------------------------ |
| 298 | '' |
| 299 | * On peut parfois demander au composant qui produit l'IRQ de ne pas la produire, puis il y a l'ICU (en configurant le registre `ICU_MASK`) et le processeur lui-même (en configurant le registre `c0_sr`. |