Changes between Initial Version and Version 1 of SujetTP1-2016


Ignore:
Timestamp:
Jan 20, 2016, 10:45:46 AM (8 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SujetTP1-2016

    v1 v1  
     1= TP1 : Outils de développement et GPIO =
     2
     3La carte Raspberry Pi offre de nombreuses possibilités pour développer des applications embarquées. Notamment, elle dispose de ports d'entrées/sorties génériques (GPIO) qui permettent de s'interfacer avec un grand nombre de périphériques plus ou moins exotiques.
     4
     5Dans ce TP il vous est demandé de développer une application "user-land" qui fasse clignoter deux LEDs selon un motif que vous choisirez et également de récupérer les informations d'un bouton poussoir.
     6
     7À la fin de ce TP, vous devriez avoir acquis les compétences suivantes:
     8* Compilation croisée via un compilateur déporté
     9* Contrôle distant de système embarqué par liaison réseau (SSH)
     10* Manipulation d'un périphérique GPIO et de ses registres "memory mappés"
     11* Interface numérique/analogique via des ports GPIO
     12* Programmation d'automates de contrôle en C
     13
     14== 0. Plateforme de développement ==
     15
     16[[Image(htdocs:png/plateforme-peri-raspberry.png, width=700px, nolink)]]
     17
     18Pour exécuter votre programme sur une carte Raspberry Pi, vous devez vous connecter en SSH sur une carte Raspberry Pi en passant par le routeur peri. Le routeur a deux adresses: `132.227.102.36` du coté laboratoire et `192.168.1.1` de l'autre coté.  Le routeur crée un sous-réseau (`192.168.1.x`) où sont connectées les cartes. Les cartes sont numérotées de `20` à `26` plus des cartes étudiants (ici n°30), le routeur a été programmé de telle sorte que l'adresse internet de la carte n°`X` est comme adresse 192.168.1.`X` (par exemple la carte n°`20` a comme adresse sur ce réseau `192.168.1.20`).
     19Pour faire ça, le firmware du routeur a été remplacé par '''[[http://www.dd-wrt.com/site/index | dd-wrt]]''' qui permet ce type de mode.  Le routeur a été également été programmé pour que tous les paquets entrants sur le port `5000`+`X` de l'adresse `132.227.102.36` soient routés vers l'adresse `192.168.1.X`.
     20
     21Il n'y a qu'un seul compte utilisateur sur une carte Raspberry Pi. Le nom de login est `pi` et le mot de passe est `raspberry`.
     22
     23Ainsi, pour se connecter en ssh sur la carte n°`22` avec le login `pi`, il faut taper (remarquez que c'est un `p` minuscule):
     24{{{
     25$ ssh -p 5022 pi@132.227.102.36
     26pi@132.227.102.36's password: raspberry
     27}}}
     28
     29Pour copier un fichier `file.x` depuis votre compte enseignement sur le carte ,°`22` il faut taper (remarquez que c'est un `P` majuscule):
     30{{{
     31$ scp -P 5022 file.x pi@132.227.102.36
     32pi@132.227.102.36's password: raspberry
     33}}}
     34
     35Comme, il n'y a qu'un compte par carte et que vous allez devoir vous les partager, vous devez créer un répertoire à la racine avec le nom de votre login sur le réseau enseignement accolé avec un tiret avec le nom de votre binôme si vous en avez un. Par exemple, deux personnes en binôme se nommant respectivement `almada` et `fomentin` vont créer un répertoire `almada-fomentin` (en minuscule). '''Je vous demande de respecter cette convention afin que je puisse vous identifier facilement.'''
     36
     37= 1. Prise en mains des outils de développement: Hello World! =
     38
     39La première étape consiste à vous familiariser avec les outils de
     40développement. Pour cela, vous allez développer un petit programme
     41de type "Hello World!" qui affiche une phrase sur la sortie standard
     42grâce à un printf.
     43
     44Pour compiler votre programme, suivez les instructions suivantes.
     45
     46* Tout d'abord, configurez votre terminal pour utiliser le compilateur croisé (vous pourrez ajouter cette commande dans le fichier $HOME/.bashrc):
     47  {{{
     48  $ source /users/enseig/franck/peri/export_rpi_toolchain.sh
     49  }}}
     50
     51* Une fois le terminal configuré, vérifiez que le compilateur est accessible:
     52  {{{
     53  $ which bcm2708hardfp-gcc
     54  }}}
     55  Si cette commande ne retourne rien, la configuration n'a pas fonctionné. Appelez le chargé de TP pour vous aider.
     56
     57Votre suite d'outils (toolchain) contient tous les outils nécessaires pour la compilation, l'édition des liens et la manipulation de binaires pour la carte Raspberry Pi. Et tous ces outils sont préfixés par la même chaîne de caractères: `bcm2708hardfp-`. Il s'agit donc d'un compilateur pour un SoC BCM2708 avec l'option hardfp activée (calcul flottant matériel). Il s'agitbien du SoC de la carte Raspberry Pi.
     58
     59Maintenant, pour compiler un programme C vers un binaire qui puisse s'exécuter sur la carte Raspberry Pi, il vous faut écrire un Makefile pour plus de facilité. Pour cela, suivez la syntaxe de base des Makefile:
     60{{{
     61cible: dépendances
     62    commande
     63}}}
     64Notez bien que l'indentation de la seconde ligne doit OBLIGATOIREMENT être une tabulation et non une suite d'espaces.
     65
     66Vous pourrez donc par exemple, écrire la règle de Makefile suivante:
     67{{{
     68helloworld.x: helloworld.c
     69    bcm2708hardfp-gcc -o $@ $< -O2 -static
     70}}}
     71
     72L'option "-static" est importante ici, car la librairie C du compilateur croisé n'est pas tout à fait identique à la librairie C sur la carte Raspberry Pi. Ajouter "-static" à la ligne de compilation permet de créer un binaire qui
     73contient en plus les fonctions de la librairie C utilisée par votre programme. Ceci permettra à celui-ci de ne pas essayer d'utiliser des fonctions de la librairie C installée sur la carte qui, sinon, aurait été chargée dynamiquement.
     74
     75== 2. Contrôle de GPIO en sortie ==
     76
     77Dans cet exercice, on vous propose de manipuler une pin du GPIO en mode "sortie" pour contrôler le clignotement d'une LED à une fréquence donnée.
     78
     79Avant de commencer à écrire du code, déterminez quelles sont les différentes étapes nécessaires depuis l'initialisation jusqu'à l'envoi des valeurs 0 ou 1 sur le GPIO.
     80
     81Dans un premier temps, on vous ne demande pas d'écrire le code spécifique à la manipulation des registres du contrôleur GPIO. Pour vous aider, vous avez à disposition une petite librairie "libgpio".
     82
     83Pour récupérer cette librairie, exécuter la commande suivante dans un terminal et dans le dossier que vous souhaitez pour contenir votre code pour ce premier TP.
     84{{{
     85cp -r /users/enseig/jpeeters/m1.peri/lab1 .
     86}}}
     87
     88Éditez le fichier lab1.c et ajoutez le code que vous pensez nécessaire à la réalisation de cet exercice.
     89
     90ATTENTION: ne changez pas les valeurs de GPIO_LED0, car vous risqueriez d'endommager la carte Raspberry Pi.
     91
     92Ensuite, compilez-le grâce au Makefile qui vous est fourni.
     93
     94Qu'observez-vous ? Essayez de changer la fréquence de clignotement.
     95
     96== 3. Contrôle de plusieurs GPIO en mode "sortie" ==
     97
     98Refaites le même exercice que précédemment, mais cette fois-ci configurez plusieurs GPIO en sorties.
     99
     100En plus du GPIO 4 de l'exercice précédent, rajoutez 3 définitions pour les LED1, LED2 et LED3 qui sont respectivement connectées aux GPIO 17, 22 et 27.
     101
     102Avant d'exécuter votre programme, validez votre code avec le chargé de TP !
     103
     104== 4. Lecture de la valeur d'une entrée GPIO ==
     105
     106Maintenant que vous maîtrisez le contrôle d'un GPIO en sortie, passons au mode "entrée".
     107
     108Toujours à l'aide de la librairie libgpio fournie avec ce TP, écrivez un programme qui configure la GPIO <à définir> en entrée. Et affichez la valeur de ces GPIO dans une boucle infinie (boucle d'échantillonnage).
     109
     110Une fois réalisé, compilez votre programme comme précédemment à l'aide du Makefile fourni. Et validez votre code avec le chargé de TP !
     111
     112Ensuite, copiez votre programme sur la carte comme indiqué dans l'exercice précédent.
     113
     114Les cartes Raspberry Pi sont équipées d'un petit circuit analogique dans lequel des boutons poussoir sont connectés aux certains GPIO. Ces GPIO sont connectés avec une résistance de Pull-Up, ce qui signifie que lorsque que vous
     115n'appuyez pas, la valeur du GPIO vaut 1 et lorsque vous appuyez, le courant
     116passe par à la masse et la valeur du GPIO passe à 1.
     117
     118Qu'observez-vous ?
     119
     120Quelle est la fréquence d'échantillonnage (approximative) en sachant que le
     121processeur de la carte fonctionne à une fréquence de 700MHz ?
     122
     123À supposer que vous êtes capable d'appuyer sur le bouton à une fréquence de
     12410Hz (c.-à-d. 10 fois par seconde) et sachant que le théorème de Shannon dit
     125qu'il faut au moins échantillonner au double de la fréquence du signal
     126d'entrée pour ne pas perdre de cycle, quelle est la plus petite fréquence d'échantillonnage possible ?
     127
     128Pour plus de fiabilité, on utilisera une fréquence d'échantillonnage de 100Hz.
     129Comment pouvez-vous écrire un programme qui échantillonne à cette fréquence ?
     130
     131== 5. Manipulation de registres bas-niveau ==
     132
     133Pour mieux comprendre les implications à bas niveau de l'utilisation d'un
     134contrôleur de GPIO, on vous demande de réécrire les fonctions gpio_setup,
     135gpio_config, gpio_value et gpio_update.
     136
     137Vous réaliserez cela étape par étape. Aidez-vous des fichiers objet
     138précompilés dans le répertoire lab1.
     139
     140Par exemple, si vous souhaitez écrire votre propre gpio_setup, créez un
     141fichier gpio_setup.c dans lequel vous écrirez votre code. Pour recompiler
     142la librairie libgpio, il vous suffit de réutiliser le Makefile fourni.
     143
     144ATTENTION: pour fonctionner avec le reste de la librairie libgpio, il vous
     145faut déclarer dans gpio_setup.c une variable globale gpio_base_p de type
     146uint32_t volatile *. Cette variable qui est un pointeur vers un entier
     147non signé de 32 bits doit contenir l'adresse de début de la région de mémoire
     148virtuelle associée après un appel à la fonction mmap.
     149
     150== 6. Amusez-vous ! ==
     151
     152Maintenant que vous maîtrisez tous les aspects liés à la configuration et
     153à la programmation des GPIO sur Raspberry Pi, laisser aller votre imagination
     154et proposer d'autres programmes à exécuter sur la carte Raspberry Pi qui
     155vous est fournie.