Changes between Version 69 and Version 70 of AS6-TME-B5


Ignore:
Timestamp:
Feb 4, 2023, 7:59:39 PM (2 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B5

    v69 v70  
    211211'''
    212212}}}
    213 1. Après qu'un thread a été élu et que son contexte a été chargé dans le processeur, donnez le nom de la fonction responsable du chargement et dites où elle retourne ? (attention, il y a deux cas)
     2131. Après qu'un thread a été élu et que son contexte a été chargé dans le processeur, donnez le nom de la fonction responsable du chargement et dites où elle retourne ? Attention, il y a deux cas. Vous avez une partie de la réponse dans le cours à partir du slide 23, et vous avez des commentaires dans le code de `kernel/kthread.c`. L'idée n'est pas de répondre de manière précise, mais de comprendre pourquoi il y a deux cas.
    214214{{{#!protected ------------------------------------------------------------------
    215215'''
     
    423423
    424424
    425 Pour la suite de la séance, récupérez l'archive du tp3 et placez là à côté des tp1 et tp2. Le code est fonctionnel, vous pouvez le tester. Je ne vous fais pas modifier, ou pire écrire, la gestion des threads, mais je vous invite à lire le code, c'est très commenté. Les principaux fichiers modifiés sont `kernel/hcpua.S` pour les fonctions `thread_load()`,  `thread_save()` et `thread_launch()` (`app_launch()` a disparu, elle n'est plus utile). Des fichiers sont nouveaux  : `kernel/kthread.h` qui contient le code de `thread_create_kernel()`, `thread_yield()`, `thread_exit()`, `sched_switch()` et quelques autres. `common/thread.h' qui contient les prototypes de fonctions communes au noyau et à l'utilisateur et 'ulib/thread.c' qui contient aussi les fonctions `thread_create()`, `thread_yield(), `thread_exit()` mais avec des appels système. Je vous invite vraiment à lire le code, c'est un bon exercice de lire le code des autres, croyez-moi.
     425Pour la suite de la séance, récupérez l'archive du tp3 et placez là à côté des tp1 et tp2. Le code est fonctionnel, vous pouvez le tester. Je ne vous fais pas modifier, ou pire écrire, la gestion des threads, mais je vous invite à lire le code, c'est très commenté. Les principaux fichiers modifiés sont `kernel/hcpua.S` pour les fonctions `thread_load()`,  `thread_save()` et `thread_launch()` (`app_launch()` a disparu, elle n'est plus utile). Des fichiers sont nouveaux  : `kernel/kthread.h` qui contient le code de `thread_create_kernel()`, `thread_yield()`, `thread_exit()`, `sched_switch()` et quelques autres. `common/thread.h' qui contient les prototypes de fonctions communes au noyau et à l'utilisateur et 'ulib/thread.c' qui contient aussi les fonctions `thread_create()`, `thread_yield(), `thread_exit()` mais avec des appels système. Je vous invite vraiment à lire le code, c'est un bon exercice de lire le code des autres, croyez-moi. Pour lire le code, vous devez suivre les appels lors de l'entrée dans l'application ou les interruptions d'horloge, ce n'est pas une lecture linéaire du fichier (même si ce n'est pas inutile pour voir une vue d'ensemble).
    426426
    427427Vous pouvez voir la différence entre les fichiers du TME B2 et du TME B3
     
    475475
    476476 * Le code ci-dessous contient l'application donnée pour ce TP. Nous avons 3 threads : `main`, `TO` et `T1`.
    477  * `main` et `T1` se contente d'afficher des messages sur le TTY0 et d'attendre (une attente active pour ralentir l'affichage des messages).
     477 * `main` et `T1` se contente d'afficher des messages sur le TTY0 et d'attendre (l'attente active (DELAY) est là pour ralentir l'affichage des messages).
    478478 * `T0` lit le clavier de TTY1
    479479
     
    660660};
    661661/**
     662 * \brief   read from the FIFO
     663 * \param   fifo    structure of fifo to store data
     664 * \param   c       pointer on char to put the read char
     665 * \return  1 on success, 0 on failure
     666 */
     667static int tty_fifo_pull (struct tty_fifo_s *fifo, int *c)
     668{
     669    if (fifo->pt_read != fifo->pt_write) {
     670        *c = fifo->data [fifo->pt_read];
     671        fifo->pt_read = (fifo->pt_read + 1)% sizeof(fifo->data);
     672        return 1;
     673    }
     674    return 0;
     675}
     676/**
    662677 * \brief   write to the FIFO
    663678 * \param   fifo    structure of fifo to store data
     
    667682static int tty_fifo_push (struct tty_fifo_s *fifo, int c)
    668683{
    669   // écrire le code de push
    670 }
    671 /**
    672  * \brief   read from the FIFO
    673  * \param   fifo    structure of fifo to store data
    674  * \param   c       pointer on char to put the read char
    675  * \return  1 on success, 0 on failure
    676  */
    677 static int tty_fifo_pull (struct tty_fifo_s *fifo, int *c)
    678 {
    679     if (fifo->pt_read != fifo->pt_write) {
    680         *c = fifo->data [fifo->pt_read];
    681         fifo->pt_read = (fifo->pt_read + 1)% sizeof(fifo->data);
    682         return 1;
    683     }
    684     return 0;
     684  // écrire le code de push en vous inspirant de pull
    685685}
    686686}}}