Changes between Version 12 and Version 13 of IOC20_T01


Ignore:
Timestamp:
Jan 30, 2020, 6:43:02 AM (5 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • IOC20_T01

    v12 v13  
    1010* Connexion à un système distant par ssh / scp.
    1111* Manipulation directe des GPIO d'une !RaspberryPi en mode utilisateur.
    12 * Écriture d’une librairie C pour la manipulation des GPIO.
    13 * Ecriture d'une application multi-threadées simple.
     12* Ecriture d'application multi-threadées simples.
    1413
    1514Vous écrirez un **compte-rendu au format markdown** (CR), dans lequel vous répondrez aux quelques questions du TME, vous mettrez les étapes de réalisation du TP, ainsi vous conserverez une trace et vous ajouterez tout ou partie de vos codes commentés (succinctement mais proprement). Les compte-rendus de TP doivent être suffisamment explicites pour que vous puissiez les réutiliser plus tard. Par exemple, vous allez devoir lire des documents externes et vous devrez référencer ces documents (mettre les liens) pour les retrouver. En fonction de vos connaissances de départ, vous pourrez être plus ou moins explicite sur tel ou tel point.
     
    2322
    2423
    25 = 2. Hello World! !RaspberryPi 1
    26 
    27 
    28 
    29 == 2.1. Accès aux cartes !RaspberryPi
     24= 2. Hello World! !RaspberryPi
     25
    3026
    3127
     
    5854
    5955
    60 == 2.2. Configuration des clés ssh
     56= 3. Configuration des clés ssh
     57
    6158
    6259
     
    7572
    7673
    77 == 2.3. Prise en mains des outils de développement: Hello World!
     74
     75= 4. Prise en mains des outils de développement: Hello World!
     76
    7877
    7978
     
    139138* Exécuter le programme.
    140139
    141 == 2.3. Contrôle de GPIO en sortie ==
     140
     141
     142= 5. Contrôle de GPIO en sortie ==
     143
     144
    142145
    143146[[Image(htdocs:png/Raspberry-Pi-GPIO-Layout-Revision-2.png,500px,nolink)]]
     
    164167 1. Que fait la fonction `delay()` ?
    165168
    166 == 2.4. Contrôle de plusieurs GPIO en mode "sortie" ==
     169
     170
     171= 6. Contrôle de plusieurs GPIO en mode "sortie" ==
     172
     173
    167174
    168175Vous allez maintenant faire clignoter deux leds à des fréquences différentes et paramétrables sur la ligne de commande. Pour tous les exercices ci-après, vous devez changer votre Makefile en ajoutant les programmes à compiler.
     
    172179
    173180
    174 == 2.5. Lecture de la valeur d'une entrée GPIO ==
     181
     182= 7. Lecture de la valeur d'une entrée GPIO ==
     183
     184
    175185
    176186Maintenant que vous maîtrisez le contrôle d'un GPIO en sortie, passons au mode "entrée".
    177187
    178188* Écrivez un programme `read_bp.c` qui configure la GPIO 18 en entrée (là où est connecté le bouton poussoir) et qui affiche la valeur de ce GPIO dans une boucle infinie.
    179 * On veut maintenant détecter l'appui sur le bouton poussoir. Pour cela reprenez le programme `blink01_pt.c` et faite une copie en `blink01_bp_pt.c`. Dans un pthread, vous allez lire la valeur du bouton périodiquement toutes les 20ms. L'appui ou le relâchement est présent quand deux valeurs lues successivement sont différentes. Quand le bouton n'est pas enfoncé, la valeur de la pin est à 1. La structure du programme suggéré.
     189* On veut maintenant détecter l'appui sur le bouton poussoir. Pour cela reprenez le programme `blink01_pt.c` et faite une copie en `blink01_bp_pt.c`. Dans un pthread, vous allez lire la valeur du bouton périodiquement toutes les 20ms. L'appui ou le relâchement est présent quand deux valeurs lues successivement sont différentes. Quand le bouton n'est pas enfoncé, la valeur de la pin est à 1. La structure du programme suggéré. Commencer par tester que vous savez détecter l'appui sans gérer les LEDs.
    180190{{{#!c
    181191val_prec = 1
     
    195205      comportement quand un relachement est detecte
    196206}}}
    197  Commencer par tester que vous savez détecter l'appui sans gérer les LEDs.
    198 
    199 Ensuite, faite un programme qui fait clignoter deux fois plus vite les LEDs lorsqu'on appuit sur le bouton une fois, et qui refait clignoter les LEDs normalement au nouvel appui.
    200 
    201 == 2.5. Réalisation d'une petite librairie ==
    202 
    203 Écrire les fonctions suivantes et fabriquer une fonction libgpio.a.
    204 Vous devez vous même, définir les prototypes des fonctions et écrire le Makefile pour fabriquer une library et linker votre programme avec. Si vous avez des difficultés, Google existe :-)) !
    205 
    206 Indications : Une bibliothèque de fonction est en principe une archive de fichiers objet (.o). Dans notre cas, c'est un peu particulier, nous n'auront qu'un seul fichier objet à l'intérieur.
    207 Cette bibliothèque reçoit l'adresse de base physique des registres GPIO.
    208 Elle utilise des variables globale statique (local au fichier) pour stocker des états (file descriptor par exemple).
    209 
    210 * `int gpio_init(void)`
    211    - Ouverture et mapping
    212    - L'adresse de base des registres GPIO dans l'espace d'adressage physique est supposée connue, mais nous verrons que l'on peut savoir où se trouve les GPIO en lisant des variables exposées par le noyau.
    213    - Rend 0 si pas d'erreur; -1 en cas d'erreur.
    214 
    215 * `int gpio_setup (int gpio, int direction)`
    216    - Setup des broches en INPUT ou OUTPUT
    217    - `gpio` : un numéro de broche légal
    218    - `direction` : 0 = INPUT, 1 = OUTPUT
    219    - Rend 0 si pas d'erreur; -1 en cas d'erreur.
    220 
    221 * `int gpio_read (int gpio, int * val)`
    222    - Lecture d'une broche
    223    - `gpio` : un numéro de broche légal
    224    - `* val` : pointeur vers un buffer qui contiendra la valeur lue
    225    - Rend 0 si pas d'erreur; -1 en cas d'erreur
    226 
    227 * `int gpio_write (int gpio, int val)` : écriture d'une broche
    228    - Ecriture d'une broche
    229    - `gpio` : un numéro de broche légal
    230    - `val` : valeur à écrire
    231    - Rend 0 si pas d'erreur; -1 en cas d'erreur
    232 
    233 
     207* Ensuite, modifier le programme pour faire fonctionner la led0 en télérupteur (un appui changer l'état de la led) alors que la led1 continue de clignoter périodiquement.
     208
     209