Changes between Version 123 and Version 124 of Archi-1-TP9
- Timestamp:
- Oct 25, 2021, 4:30:26 PM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v123 v124 96 96 ''''''''''''''' 97 97 }}} 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` ?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` ? 99 99 {{{#!protected ------------------------------------------------------------------------------------ 100 100 ''''''''''''''' … … 125 125 ori $4, $4, 0x0000 // cette instruction ne sert a rien puisqu on ajoute 0, mais je la mets pour le cas general 126 126 ori $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 mettre127 sb $5, 0($4) // Notez que l immediat 0 devant ($4) n est pas obligatoire mais on s obligera als le mettre 128 128 }}} 129 129 ''''''''''''''' … … 275 275 ''''''''''''''' 276 276 }}} 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`. 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`. `NTTYS` est un `#define` définit dans le Makefile de compilation avec le nombre de terminaux du SoC. 278 278 {{{#!c 279 279 struct tty_s { … … 586 586 587 587 - 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 604 K 12: <boot>:-------------------------------------------------------------------------------- 605 K 12: 0xbfc00000 0x3c04bfc0 lui a0,0xbfc0 606 K 13: 0xbfc00004 0x24840028 addiu a0,a0,40 607 K 14: 0xbfc00008 0x3c05d020 lui a1,0xd020 608 K 15: 0xbfc0000c 0x24a50000 addiu a1,a1,0 609 K 26: <print>:------------------------------------------------------------------------------- 610 K 26: 0xbfc00010 0x80880000 lb t0,0(a0) 611 K 27: 0xbfc00014 0xa0a80000 sb t0,0(a1) 612 K 37: --> READ MEMORY @ 0xbfc00028 BE=---1 --> 0x6c6c6548 613 K 39: <-- WRITE MEMORY @ 0xd0200000 BE=---1 <-- 0x48 614 }}} 615 ''''''''''''''''' 616 }}} 590 617 - Modifiez le code de `hcpu.S` afin d'afficher le message "Au revoir\n" (''Hommage VGE'') après le message "Hello".\\ 591 618 Vous devez avoir deux messages, et pas seulement étendre le premier. 592 619 {{{#!protected ------------------------------------------------------------------------------------ 593 620 ''''''''''''''' 594 * Il s 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. 596 623 ''''''''''''''' 597 624 }}} … … 667 694 {{{#!protected ------------------------------------------------------------------------------------ 668 695 ''''''''''''''' 669 * C'est très semblable, voire identique, à l'étape 1, l'idée est qu'ils ouvrentle code...696 * C'est très semblable, voire identique, à l'étape 1, l'idée est d'ouvrir le code... 670 697 ''''''''''''''' 671 698 }}} … … 734 761 {{{#!protected ------------------------------------------------------------------------------------ 735 762 ''''''''''''''' 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 ouvrentle code763 * 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 737 764 ''''''''''''''' 738 765 }}}