Changes between Version 8 and Version 9 of SujetTD0


Ignore:
Timestamp:
Jan 27, 2017, 6:58:45 AM (8 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SujetTD0

    v8 v9  
    6262}}}
    6363
    64 L'appel système mmap permet de récupérer un pointeur vers une zone mémoire donnée en paramètres. À l'inverse, munmap permet de libérer l'association entre le pointeur fourni par mmap et la zone mémoire associée lors de l'appel à mmap.
     64L'appel système [[http://manpagesfr.free.fr/man/man2/mmap.2.html|mmap]] permet de récupérer un pointeur vers une zone mémoire donnée en paramètres. À l'inverse, munmap permet de libérer l'association entre le pointeur fourni par mmap et la zone mémoire associée lors de l'appel à mmap.
    6565
    6666* Quel est l'intérêt ou le besoin de protéger les zones mémoires liées aux contrôleurs d'entrées/sorties ?
    6767{{{#!protected
    68 réponse
     68- Sureté et sécurité
     69  - sureté pour ne pas faire un mauvais usage du matériel
     70  - sécurité pour ne pas utiliser les droits pour volontairement casser le matériel
    6971}}}
    7072
     
    7375* Qu'est-ce que le fichier /dev/mem ? Est-ce un vrai fichier ?
    7476{{{#!protected
    75 réponse
     77- C'est un pseudo-fichier qui permet d'accéder à la mémoire physique au travers de l'abstraction des fichiers.
     78- Il faut avoir les droits du root pour ouvrir ce fichier.
     79- ce n'est évidemment pas un fichier, ce n'est qu'une abstraction.
    7680}}}
    7781
    7882* Comment utilise-t-on le fichier /dev/mem ?
    7983{{{#!protected
    80 réponse
    81 }}}
    82 
    83 * Comment faire fonctionner ensemble les informations contenues dans le fichier /dev/mem avec l'appel système mmap ?
    84 {{{#!protected
    85 réponse
     84- il faut l'ouvrir avec open()
     85- on peut ensuite utiliser read() et write() mais il est plus propre d'utiliser mmap() qui permet d'accéder à la mémoire comme de la mémoire (comme un tableau d'octets).
    8686}}}
    8787
    8888* Sachant que l'adresse de base du contrôleur de GPIO est 0x20200000, quel serait le code C qui permettrait d'accéder au registre GPFSEL0 du contrôleur de GPIO ?
    8989{{{#!protected
    90 réponse
     90{{{#!c
     91    mmap_result = mmap (
     92        NULL                       // adresse virtuelle souhaitée, laissée NULL quand on laisse choisir l'OS
     93      , RPI_BLOCK_SIZE             // nombre d'octets demandés qui doit être un multiple de la taille d'une page
     94      , PROT_READ | PROT_WRITE     // type d'accès autorisé par le programme
     95      , MAP_SHARED                 // si plusieurs processus map le même zone, ils verront la même copie (!=MAP_PRIVATE)
     96      , mmap_fd                    // file descriptor : identifiant de /dev/mem donné par open
     97      , BCM2835_GPIO_BASE );       // décalage par rapport au premier octet de la mémoire
     98
     99   (unsigned volatile int *) GPSEL0 = mmap_result; // volatile pour ne pas avoir une mise en cache dans les registres
     100   *GPSELO = value;
     101}}}
    91102}}}
    92103
     
    95106* Avec tout ce que vous avez appris jusqu'à présent, quelles seraient les grandes étapes pour réaliser un programme qui fasse clignoter une LED à une fréquence donnée ?
    96107{{{#!protected
    97 réponse
     108- ouvrir /dev/mem
     109- mapper la zone où se trouve les registres de contrôle des GPIO
     110- configurer la broche GPIO choisie en sortie.
     111- faire une boucle
     112  - broche <- 0
     113  - attendre
     114  - broche <- 1
     115  - attendre
    98116}}}
    99117
    100118* Quelles sont les fonctions C associées ?
    101119{{{#!protected
     120- open
     121- mmap
     122- sleep (ou un équivalent)
    102123}}}