Changes between Version 71 and Version 72 of AS6-TME-B5


Ignore:
Timestamp:
Feb 25, 2023, 7:43:57 AM (2 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B5

    v71 v72  
    214214{{{#!protected ------------------------------------------------------------------
    215215'''
    216  * C'est la fonction `thread_load()` qui se charge du chargement de la restauration du contexte du thread entrant (nouvellement élu).
     216 * C'est la fonction `thread_load()` qui se charge de la restauration du contexte du thread entrant (nouvellement élu).
    217217 * Quand on sort de la fonction `thread_load()`, il y a en effet 2 cas:
    218    * Le thread entrant n'a jamais été élu. Dans ce cas, le `jr $31` va nous faire entrer dans la fonction `thread_bootstrap()` dont le but est de lancer le thread en allant chercher les informations dans la structure `thread_s` du thread nouvellement élu, à savoir
    219      * la fonction de démarrage `_start()` ou `thread_start()`
    220      * la fonction principale du thread (uniquement pour les threads standards, c'est inutile pour le thread `main()`, on sait que c'est `main()`)
    221      * l'argument du thread (uniquement pour les threads standards, c'est inutile pour le thread `main()`, ce sont en principe des arguments de la ligne de commande (on ne voit pas ça pour le moment).
    222     * Le thread avait déjà été élu et donc il avait perdu le processeur et il avait appelé `thread_save()`.
    223       * En conséquence, on sortira de `thread_load()` par `thread_save()` et on revient dans `sched_switch()`.
    224       * Pour qu'on ne rentre pas dans une boucle sans fin, la valeur de retour de `thread_save()` après une restauration de contexte est `0` (alors que c'est `1` après une sauvegarde). On teste donc cette valeur de retour de `thread_save()` pour savoir ce qu'on doit faire ensuite.
    225       * On sort ensuite de `sched_switch()` et on revient dans `thread_yield()` (actuellement c'est le seul cas, mais nous verrons d'autres fonctions appelant `sched_switch())`.
    226       * Après, on revient dans un syscall ou dans l'ISR du timer, suivant l'événement qui avait abouti à la perte du processeur par le thread courant.
    227    
     218   * Si le thread entrant n'a jamais été élu, alors dans ce cas, le `jr $31` va nous faire entrer dans la fonction `thread_bootstrap()` dont le but est de lancer le thread en allant chercher les informations dans la structure `thread_s` du thread nouvellement élu, c'est-à-dire :
     219     * 1) l'une des fonctions de démarrage : si c'est le main `_start()`; si c'est un thread `thread_start()`
     220     * 2) la fonction principale du thread (uniquement pour les threads standards, c'est inutile pour le thread `main()`, on sait que c'est `main()`)
     221     * 3) l'argument du thread (uniquement pour les threads standards, c'est inutile pour le thread `main()`. Les arguments de mains sont, en principe, ceux de la ligne de commande, mais on ne voit pas ça pour le moment.
     222   * Si le thread entrant a déjà été élu et donc qu'il a perdu le processeur dans le passé, alors il avait appelé `thread_save()`.
     223     * En conséquence, on sortira de `thread_load()` par `thread_save()` et il revient dans `sched_switch()`.
     224     * Pour qu'on ne rentre pas dans une boucle sans fin, la valeur de retour de `thread_save()` après une restauration de contexte est `0` (alors que c'est `1` après une sauvegarde). On teste donc cette valeur de retour de `thread_save()` pour savoir ce qu'on doit faire ensuite.
     225     * On sort ensuite de `sched_switch()` et on revient dans `thread_yield()`.
     226     * Après, on revient dans un syscall ou dans l'ISR du timer, suivant l'événement qui avait abouti à la perte du processeur par le thread courant.
    228227'''
    229228}}}