Changes between Version 123 and Version 124 of Archi-1-TP9


Ignore:
Timestamp:
Oct 25, 2021, 4:30:26 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v123 v124  
    9696'''''''''''''''
    9797}}}
    98 1. Le contrôleur de `TTY` peut contrôler de 1 à 4 terminaux. Chaque terminal dispose d'un ensemble de 4 registres (on appelle ça une carte de registres, ou en anglais une ``register map``). Ces ensembles de 4 registres sont placés à des adresses contiguës. S'il y a 2 terminaux (`TTY0` et `TTY1`), à quelle adresse est le registre `TTY_READ` de `TTY1` ?
     981. Le contrôleur de `TTY` peut contrôler de 1 à 4 terminaux. Chaque terminal dispose d'un ensemble de 4 registres (on appelle ça une carte de registres, ou en anglais une ''register map''). Ces ensembles de 4 registres sont placés à des adresses contiguës. S'il y a 2 terminaux (`TTY0` et `TTY1`), à quelle adresse est le registre `TTY_READ` de `TTY1` ?
    9999{{{#!protected ------------------------------------------------------------------------------------
    100100'''''''''''''''
     
    125125ori   $4, $4, 0x0000   // cette instruction ne sert a rien puisqu on ajoute 0, mais je la mets pour le cas general
    126126ori   $5, $0, 'x'
    127 sb    $5, 0($4)        // Notez que l'immédiat 0 devant ($4) n est pas obligatoire mais on s'obligera à le mettre
     127sb    $5, 0($4)        // Notez que l immediat 0 devant ($4) n est pas obligatoire mais on s obligera als le mettre
    128128}}}
    129129'''''''''''''''
     
    275275'''''''''''''''
    276276}}}
    277 1. Supposons que la structure `tty_s` et le tableau de registres de `TTY` soient définis comme suit. Écrivez une fonction C `int getchar(void)` bloquante qui attend un caractère tapé au clavier sur le `TTY0`. Nous vous rappelons qu'il faut attendre que le registre `TTY_STATUS` soit différent de 0 avant de lire `TTY_READ`.
     2771. Supposons que la structure `tty_s` et le tableau de registres de `TTY` soient définis comme suit. Écrivez une fonction C `int getchar(void)` bloquante qui attend un caractère tapé au clavier sur le `TTY0`. Nous vous rappelons qu'il faut attendre que le registre `TTY_STATUS` soit différent de 0 avant de lire `TTY_READ`. `NTTYS` est un `#define` définit dans le Makefile de compilation avec le nombre de terminaux du SoC.
    278278{{{#!c
    279279struct tty_s {
     
    586586 
    587587- Exécutez le programme en lançant le simulateur avec `make exec`, qu'observez-vous ?
    588 - Exécutez le programme en lançant le simulateur avec `make debug`.\\Cela exécute le programme pour une courte durée et cela produit un fichier `debug.log` contenant des informations par cycle.\\Ce fichier n'est pas exploitable directement par vous, il est nécessaire pour la génération de la trace d'exécution à l'étape suivante.
    589 - Exécutez alors la génération de la trace d'exécution avec `make trace`.\\Cela génère le fichier `trace.log.s` à partir du de l'exécutable désassemblé et du fichier debug.log. Que voyez-vous dans `trace.log.s` ? 
     588{{{#!protected ------------------------------------------------------------------------------------
     589'''''''''''''''
     590- On voit une fenêtre `xterm` qui affiche un message et c'est tout. Dans le terminal de lancement de `make exec`, on voit le compteur de cycles avancer.
     591'''''''''''''''
     592}}}
     593- Exécutez le programme en lançant le simulateur avec `make trace`.\\Cela exécute le programme pour une courte durée et cela produit un fichier `debug.log` contenant des informations pour chaque cycle simulé.\\Ce fichier n'est pas exploitable directement par vous, mais il est nécessaire pour la génération de la trace d'exécution avec la commande `tracelog`.\\`tracelog` (script écrit en langage `awk`) combine `debug.log` et l'exécutable désassemblé pour produire une trace exploitable `trace0.s`.\\Que voyez-vous dans `trace.0.s` ? 
     594{{{#!protected ------------------------------------------------------------------------------------
     595'''''''''''''''''
     596- On voit la séquence des instructions exécutée:
     597- La première colonne nous informe que les adresses lues sont dans l'espace Kernel
     598- La seconde colonne sont les numéros de cycles
     599- La troisième sont les adresses
     600- La quatrième le code binaire des instructions
     601- Le reste de la ligne contient l'instruction désassemblée
     602- Lorsque les adresses ont un nom, c'est à dire qu'une étiquette leur a été attribuée, celle-ci est indiquée.
     603{{{#!asm
     604K    12:     <boot>:--------------------------------------------------------------------------------
     605K    12:     0xbfc00000 0x3c04bfc0  lui a0,0xbfc0
     606K    13:     0xbfc00004 0x24840028  addiu   a0,a0,40
     607K    14:     0xbfc00008 0x3c05d020  lui a1,0xd020
     608K    15:     0xbfc0000c 0x24a50000  addiu   a1,a1,0
     609K    26:     <print>:-------------------------------------------------------------------------------
     610K    26:     0xbfc00010 0x80880000  lb  t0,0(a0)
     611K    27:     0xbfc00014 0xa0a80000  sb  t0,0(a1)
     612K    37:     --> READ  MEMORY @ 0xbfc00028 BE=---1 --> 0x6c6c6548
     613K    39:     <-- WRITE MEMORY @ 0xd0200000 BE=---1 <-- 0x48
     614}}}
     615'''''''''''''''''
     616}}}
    590617- Modifiez le code de `hcpu.S` afin d'afficher le message "Au revoir\n" (''Hommage VGE'') après le message "Hello".\\
    591618  Vous devez avoir deux messages, et pas seulement étendre le premier.
    592619{{{#!protected ------------------------------------------------------------------------------------
    593620'''''''''''''''
    594 * Ils doivent dupliquer la boucle d'affichage et le message. Il faut juste faire attention aux labels en en créant des nouveaux.
    595   Ils ne peuvent pas utiliser des fonctions parce qu'ils n'ont pas de pile.
     621* Il faut dupliquer la boucle d'affichage et le message. Il faut juste faire attention aux labels en en créant des nouveaux.
     622  On ne peut pas utiliser des fonctions parce qu'il n'y a pas encore de pile d'exécution.
    596623'''''''''''''''
    597624}}}
     
    667694{{{#!protected ------------------------------------------------------------------------------------
    668695'''''''''''''''
    669 * C'est très semblable, voire identique, à l'étape 1, l'idée est qu'ils ouvrent le code...
     696* C'est très semblable, voire identique, à l'étape 1, l'idée est d'ouvrir le code...
    670697'''''''''''''''
    671698}}}
     
    734761{{{#!protected ------------------------------------------------------------------------------------
    735762'''''''''''''''
    736 * Hormis, qu'il s'agit de code C, il n'y a pas de différence de principe, c'est toujours du copier-coller, l'important c'est qu'ils ouvrent le code
     763* Hormis, qu'il s'agit de code C, il n'y a pas de différence de principe, c'est toujours du copier-coller, l'important c'est d'ouvrir le code
    737764'''''''''''''''
    738765}}}