Changes between Version 153 and Version 154 of Archi-1-TP9


Ignore:
Timestamp:
Nov 21, 2021, 11:41:55 AM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v153 v154  
    285285{{{#!protected ------------------------------------------------------------------------------------
    286286''
    287 Cours 9 / slide 18 et 58
     287Cours 9 / slides 18 et 58
    288288
    289289Ce sont toujours des connaissances connues en principe, mais comme c'est utilisé dans le code, ce n'est pas inutile d'en parler rapidement.
     
    2952951. Comment définir une macro-instruction C uniquement si elle n'est pas déjà définie ? Écrivez un exemple.
    296296{{{#!protected ------------------------------------------------------------------------------------
    297 '''''''''''''''
    298 * En utilisant, une directive `#ifndef`, par exemple :
     297''
     298Cours 9 / slides 9 et 58
     299
     300Cette déclaration est présente à plusieurs endroits dans le code. Elle permet de définir des valeurs de paramètres par défaut, s'ils ne sont pas déjà définis ailleurs, soit plus haut dans le code, ou dans un fichier inclu, ou encore passé en paramètre du compilateur par l'option `-D`.
     301* En utilisant, une directive `#ifndef` :
    299302{{{#!c
    300303#ifndef MACRO
     
    302305#endif
    303306}}}
    304 '''''''''''''''
     307''
    305308}}}
    3063091. Comment être certain de ne pas inclure plusieurs fois le même fichier `.h` ?
    307310{{{#!protected ------------------------------------------------------------------------------------
    308 '''''''''''''''
     311''
     312Cours 9 / slides 9 et 58
     313
     314C'est un usage de ce qui a été vu dans la question précédente. C'est utilisé dans tous les fichiers .h (sauf oubli).
    309315* En utilisant ce que nous venons de voir dans la question précédente : on peut définir une macro instruction différente au début de chaque fichier `.h` (en utilisant le nom du fichier comme nom de macro pour éviter les collisions de nom). On peut alors tester l'existence de cette macro comme condition d'inclusion du fichier.
    310316{{{#!c
    311 ————————————————————— début du fichier filename.h
     317————————————————————— debut du fichier filename.h
    312318#ifndef _FILENAME_H_
    313319#define _FILENAME_H_
     
    318324————————————————————— fichier de fichier filename.h
    319325}}}
    320 '''''''''''''''
    321 }}}
    322 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.
     326''
     327}}}
     3281. 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).
    323329{{{#!c
    324330struct tty_s {
     
    331337}}}
    332338{{{#!protected ------------------------------------------------------------------------------------
    333 '''''''''''''''
     339''
     340Cours 9 / slide 10
     341
     342En principe, cela ne devrait pas poser de difficulté, mais cela nécessite d'avoir compris comment fonctionne le TTY et de savoir écrire une fonction en C. Pour aider, au cas où, on peut donner la description de ce qui est attendu:\\Tant que le registre `status` est à 0 alors attendre, puis lire le registre `read`.\\Notez que cela nécessite de savoir accéder aux champs d'une structure.
    334343{{{#!c
    335344int getchar(void)
     
    339348}
    340349}}}
    341 '''''''''''''''
     350''
    342351}}}
    3433521. Savez-vous à quoi sert le mot clé `volatile` ? Nous n'en avons pas parlé en cours, mais c'est nécessaire pour les adresses des registres de périphérique, une idée ... ?