Changes between Version 6 and Version 7 of Archi-1-TD9


Ignore:
Timestamp:
Jan 14, 2022, 2:56:44 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TD9

    v6 v7  
    140140{{{#!protected ------------------------------------------------------------------------------------
    141141''
    142 Cours 9 / slide 19\\\\
     142Cours 9 / slide 18\\\\
    143143Il suffit de remplacer les instructions `lui` et `ori` par `la` et `li`.
    144144{{{#!asm
     
    165165{{{#!protected ------------------------------------------------------------------------------------
    166166''
    167 Cours 9 / slide 19\\\\
     167Cours 9 / slide 18\\\\
    168168Pour répondre, il faut avoir compris l'explication donnée dans la question. L'intérêt de cette question est de revenir sur la notion de section. Une section est un segment d'adresses ayant un but spécifique. On définit des segments d'adresses pour le code, pour les données (il y a d'ailleurs plusieurs types de sections en fonction du type de données). Ces segments sont placés dans l'espace d'adressage par l'éditeur de liens (`ld`) et la manière dont ils sont placés est définie dans un fichier donné en paramètre de l'éditeur de lien, ce fichier de description de placement est le `ldscript`).
    169169{{{#!as
     
    176176{{{#!protected ------------------------------------------------------------------------------------
    177177''
    178 Cours 9 / slide 19\\\\
     178Cours 9 / slide 18\\\\
    179179Ce qu'il faut comprendre, c'est que les comportements du `C` et de l'assembleur sont inversés vis-à-vis des labels. Dans un fichier `.c`, quand on définit un label (une fonction ou variable), ce label est par défaut `extern`, c'est-à-dire qu'il est utilisable dans un autre fichier `.c`. Si on veut que le label ne soit utilisable que dans le fichier dans lequel il est défini, il faut utiliser le mot clé `static` lors de sa déclaration. En assembleur, c'est l'inverse, les labels sont par défaut `static`, c'est-à-dire utilisable uniquement dans le fichier où ils sont définis. Si on veut qu'ils soient utilisables dans les autres fichiers, il faut le dire avec la directive `.globl`.
    180180* `globl` signifie `glob`al `l`abel. Cette directive permet de dire que le `label` est visible en dehors de son fichier de définition. Ainsi il est utilisable dans les autres fichiers assembleur ou les autres fichier C du programme.
     
    255255''
    256256}}}
     257{{{#!comment
    2572581. Quelle est la différence entre `#include "file.h"` et `#include <file.h>` ? Quelle option du compilateur C permet de spécifier les répertoires lesquels se trouvent les fichiers include ?
    258259{{{#!protected ------------------------------------------------------------------------------------
     
    295296}}}
    296297''
     298}}}
    297299}}}
    2983001. 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 (en utilisant l'option `-D` de gcc).
     
    376378{{{#!protected ------------------------------------------------------------------------------------
    377379''
    378 Cours 9 / slides 23 et 24\\\\
     380Cours 9 / slides 22 et 23\\\\
    379381Pour répondre, il faut savoir interpréter le dessin représentant l'espace d'adressage. Si ça semble difficile, il faut revoir ce qu'est l'espace d'adressage.
    380382{{{#!c
     
    397399{{{#!protected ------------------------------------------------------------------------------------
    398400''
    399 Cours 9 / slides 23 et 24\\\\
     401Cours 9 / slides 22 et 23\\\\
    400402Il faut bien comprendre que `.ktext` est une section produite par l'éditeur de liens. C'est ce que l'on appelle une section de sortie. `.text` est une section que l'éditeur de liens trouve dans un fichier objet `.o`, c'est ce que l'on appelle une section d'entrée. Comme il y a plusieurs fichiers objet, on doit dire à l'éditeur de lien de prendre toutes les sections `.text` de tous les fichiers qu'on lui donne. Le `*` devant `(.text)` est une expression régulière permettant de dire à l'éditeur de liens quels fichiers sont concernés, ici avec `*` c'est tous les fichiers. Les expressions régulières sont celles qu'on utilise avec le `shell`.
    401403{{{#!c
     
    462464{{{#!protected ------------------------------------------------------------------------------------
    463465''
    464 Cours 9 / Slide 55\\\\
     466Cours 9 / Slide 8 annexe\\\\
    465467Le compilateur C peut avoir beaucoup de paramètres. Définir une variable `CFLAGS` permet de les déclarer une fois au début et d'utiliser cette variable plusieurs fois dans le `Makefile`. Si on veut changer un argument, il suffit de le faire une seule fois. Ce genre de choses est nécessaire si on veut faire des `Makefile`s facile à lire et à faire évoluer.
    466468* La variable `CFLAGS` est utilisée par `gcc`, il y a ici toutes les options indispensables pour compiler mais il en existe beaucoup, ce qui fait des tonnes de combinaison d'options !
     
    471473{{{#!protected ------------------------------------------------------------------------------------
    472474''
    473 Cours 9 / slides 28 et 29\\\\
     475Cours 9 / slides 6 annexe\\\\
    474476Mettre une règle `help` comme règle par défaut permet de documenter l'usage du `Makefile`, ce qui est plutôt une bonne pratique quand il y a beaucoup de cible et de paramètres. C'est d'autant plus vrai qu'on utilise les Makefiles comme des ensembles de `shell script`.
    475477* C'est la première cible qui est choisie, donc ici c'est équivalent à `make help`. Cela affiche l'usage pour connaître les cibles disponibles.