Changes between Version 153 and Version 154 of Archi-1-TP9
- Timestamp:
- Nov 21, 2021, 11:41:55 AM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v153 v154 285 285 {{{#!protected ------------------------------------------------------------------------------------ 286 286 '' 287 Cours 9 / slide 18 et 58287 Cours 9 / slides 18 et 58 288 288 289 289 Ce sont toujours des connaissances connues en principe, mais comme c'est utilisé dans le code, ce n'est pas inutile d'en parler rapidement. … … 295 295 1. Comment définir une macro-instruction C uniquement si elle n'est pas déjà définie ? Écrivez un exemple. 296 296 {{{#!protected ------------------------------------------------------------------------------------ 297 ''''''''''''''' 298 * En utilisant, une directive `#ifndef`, par exemple : 297 '' 298 Cours 9 / slides 9 et 58 299 300 Cette 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` : 299 302 {{{#!c 300 303 #ifndef MACRO … … 302 305 #endif 303 306 }}} 304 '' '''''''''''''307 '' 305 308 }}} 306 309 1. Comment être certain de ne pas inclure plusieurs fois le même fichier `.h` ? 307 310 {{{#!protected ------------------------------------------------------------------------------------ 308 ''''''''''''''' 311 '' 312 Cours 9 / slides 9 et 58 313 314 C'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). 309 315 * 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. 310 316 {{{#!c 311 ————————————————————— d ébut du fichier filename.h317 ————————————————————— debut du fichier filename.h 312 318 #ifndef _FILENAME_H_ 313 319 #define _FILENAME_H_ … … 318 324 ————————————————————— fichier de fichier filename.h 319 325 }}} 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 }}} 328 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 (en utilisant l'option `-D` de gcc). 323 329 {{{#!c 324 330 struct tty_s { … … 331 337 }}} 332 338 {{{#!protected ------------------------------------------------------------------------------------ 333 ''''''''''''''' 339 '' 340 Cours 9 / slide 10 341 342 En 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. 334 343 {{{#!c 335 344 int getchar(void) … … 339 348 } 340 349 }}} 341 '' '''''''''''''350 '' 342 351 }}} 343 352 1. 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 ... ?