Laboratoire 1 : Introduction au Raspberry Pi et à la compilation croisée

Systèmes embarqués temps réel (GIF-3004)

Objectifs

Ce travail pratique vise les objectifs suivants :

  1. Mettre en place un environnement de développement complet
  2. Comprendre les mécanismes derrière la compilation croisée
  3. Maîtriser les rudiments du débogage et du profilage à distance
  4. Analyser et déboguer un code C simple
  5. Se familiariser avec l'utilisation du Raspberry Pi 3

Préparation et outils nécessaires

La carte MicroSD du kit qui vous a été fourni contient déjà l'image système nécessaire au cours. Toutefois, dans le cas où vous voudriez revenir à l'état initial de l'image, ou simplement créer une copie, vous pouvez télécharger le fichier .img contenant l'image du cours.

La première des tâches à réaliser est de démarrer le Raspberry Pi 3, de mettre en place sa configuration initiale et de vous assurer de son bon fonctionnement. Par la suite, vous devrez installer sur votre ordinateur l'environnement de développement qui vous servira tout au long de la session.

Important : le Raspberry Pi 3 étant un ordinateur à part entière, il est techniquement possible de n'utiliser que ce dernier et y travailler localement en se passant de l'environnement de développement à distance. Cela n'est toutefois pas représentatif du développement des systèmes embarqués en pratique, où il est souvent impossible de travailler directement sur le matériel cible, que ce soit par manque de puissance ou par d'autres problèmes pratiques (pensons par exemple à un Raspberry Pi embarqué dans un dispositif lourd et encombrant). Pour cette raison, dans le cadre du cours, il vous est interdit d'utiliser le Raspberry Pi de cette manière, sauf lorsque qu'expressément mentionné autrement dans un énoncé ou autorisé par le professeur.

Premier démarrage

Insérez la carte MicroSD avec l'image du cours dans la fente prévue à cet effet sur le Raspberry Pi. Branchez un écran (une sortie HDMI est disponible) ainsi qu'un clavier. Vous devrez d'abord vous authentifier avec le compte par défaut :

  • Nom d'utilisateur : pi
  • Mot de passe : setrh2017

Si tout s'est bien passé, vous devriez vous retrouver face à un écran vous demandant de changer votre mot de passe. Le mot de passe par défaut de l'image est "setrh2017", nous vous recommandons fortement de le remplacer par un mot de passe plus sécuritaire (et personnel).

Lors du premier démarrage, connectez le Raspberry Pi au réseau eduroam en éditant le fichier /etc/wpa_supplicant/wpa_supplicant.conf :

  • Dans le champ identity, écrivez votre IDUL
  • Dans le champ password, écrivez votre NIP

Par la suite, redémarrez le Raspberry Pi et vérifiez que vous pouvez vous connecter à distance via SSH. Sous Windows, utilisez le client PuTTY.

Installation de l'environnement de développement

Afin d'utiliser le Raspberry Pi, vous devez installer un environnement de développement et de compilation croisée sur votre ordinateur. Les ordinateurs du 0105 sont également munis de cet environnement.

En utilisant Ubuntu

Note : cette procédure est prévue pour Ubuntu 16.04. Toutefois, toute distribution Linux peut être utilisée, en modifiant les commandes pour qu'elles correspondent aux outils de la distribution (par exemple remplacer "apt-get" par "yum" si vous utilisez un système Fedora). Il n'y a pas de contre indication à utiliser une autre plateforme; notez toutefois que seul Ubuntu 16.04 sera officiellement supporté par l'équipe de dépannage.

Assurez-vous tout d'abord que votre système hôte est à jour, avec les commandes :

$ apt-get update
$ apt-get upgrade

Important : ces commandes doivent être exécutées sur la machine hôte, celle qui compilera les programmes, et non le Raspberry Pi lui même!

Installez par la suite les paquets suivants :

$ sudo apt-get install build-essential g++-arm-linux-gnueabihf gdb-multiarch eclipse-cdt eclipse-rse

Une fois ces paquets installés, ouvrez Eclipse et installez le plugin Remote system de la manière suivante :

  1. Dans le menu Help, cliquez sur Install new software
  2. Dans le premier champ en haut (intitulé Work with), sélectionnez Indigo Update Site
  3. Dans la liste mise à jour en dessous, allez dans la catégorie Mobile and device development et cochez Remote system explorer end-user runtime
  4. Procédez à l'installation en cliquant sur Next et en acceptant la licence
En utilisant Windows

Vous devez tout d'abord installer la toolchain pour le Raspberry Pi 3. Celle-ci est disponible ici, avec les instructions d'installation, en n'oubliant pas, à la fin de l'installation, de mettre à jour le sysroot avec les librairies du Raspberry Pi.

Vous pouvez par la suite installer Eclipse, à partir des installateurs officiels disponibles ici, et passer à la section suivante.

À propos du sysroot : lorsque vous effectuez une compilation dite croisée, vous créez un exécutable dans un format qui n'est pas directement utilisable par votre ordinateur (mais le sera par le Raspberry Pi). Les librairies liées à cet exécutable doivent également être dans le format cible. Par conséquent, l'environnement de développement comporte un répertoire contenant toutes ces librairies (par exemple C:\SysGCC\Raspberry\arm-linux-gnueabuhf\sysroot sur Windows). Au fil des laboratoires, de nouvelles librairies s'ajouteront : il est important de les synchroniser avec votre station de développement, sous peine d'erreurs de l'éditeur de liens!

Énoncé

Note : les captures d'écran suivantes ont été prises sous Ubuntu 16.04. Néanmoins, la majorité de celles-ci s'appliquent également aux installations Windows, les quelques différences étant mentionnées dans le texte.

1) Création d'un nouveau projet

Une fois l'environnement de développement installé, vous devez créer un nouveau projet. Pour cela, allez dans le menu File/New et sélectionnez C++ Project :

La fenêtre suivante apparaîtra. Choisissez un nom de projet et sélectionnez Cross GCC comme Toolchain. Sélectionnez également Empty project dans la catégorie Executable :

Cliquez sur Next. Dans la fenêtre qui suit, laissez cochées les deux configurations (Debug et Release) :

Dans le dialogue suivant, écrivez arm-linux-gnueabihf- dans le champ Cross compiler prefix. Vous devez également informer Eclipse de l'endroit où sont stockées les librairies ARM. Ce chemin peut varier selon votre installation et votre système d'exploitation. Sous Ubuntu 16.04, ce sera /usr/arm-linux-gnueabihf, comme dans l'image plus bas. Sous Windows, ce sera généralement C:\SysGCC\Raspberry\bin. Si vous éprouvez des problèmes, vérifiez que ce chemin existe bel et bien.

2) Mise en place d'une connexion à distance

Ceci étant fait, vous devez maintenant configurer l'exécution à distance. Pour cela, vous devez d'abord ouvrir la perspective Remote System Explorer. Cliquez sur le menu Windows et, dans le sous-menu Open Perspective, sélectionnez Other :

Dans la fenêtre qui s'affichera, choisissez Remote System Explorer :

Une fois cette perspective ouverte, créez une nouvelle connexion en cliquant sur l'icône identifiée ci-dessous :

Dans la fenêtre qui s'affiche, sélectionnez Linux :

Éditez le champ Host name pour y écrire l'adresse IP (ou le nom de domaine) de votre Raspberry Pi.

Dans les trois fenêtres qui suivent, modifiez les choix par défaut pour choisir respectivement ssh.files, processes.shell.linux et ssh.shells :

Cliquez sur Finish pour terminer l'ajout de la connexion. Il vous reste maintenant à configurer le nom d'utilisateur à utiliser pour se connecter au Raspberry Pi. Pour ce faire, cliquez avec le bouton de droite sur la nouvelle connexion et accédez à ses propriétés. Dans cette fenêtre, indiquez le nom d'utilisateur (pi par défaut, mais vous pouvez le modifier) :

3) Lancement d'une session de débogage

Une fois le projet et la connexion créés, ajoutez le fichier setr_labo1.cpp comme fichier source. Ce fichier contient quelques fonctions et dépend uniquement de la librairie standard. Assurez-vous que vous êtes en mesure de le compiler.

Nous devons maintenant mettre en place une configuration de débogage indiquant à Eclipse que cet exécutable ne doit pas être exécuté localement, mais à distance. Pour cela, cliquez avec le bouton de droite sur votre projet, et sélectionnez Debug configurations dans le sous-menu Debug As :

Dans la fenêtre qui s'affiche alors, choisissez C/C++ Remote Application et cliquez sur l'icône New launch configuration, en haut à gauche :

Dans le dialogue suivant, vérifiez que le nom du projet et de l'exécutable sont les bons. Modifiez le champ Connection pour y sélectionner la connexion que vous avez précédemment créée. Juste en dessous, indiquez un chemin où Eclipse pourra écrire les exécutables produits; assurez-vous que ce chemin existe sur le Raspberry Pi et que l'utilisateur y a accès en écriture. En dessous de ce chemin, ajoutez la commande chmod 700 /home/votre/chemin; ceci est nécessaire pour assurer que le binaire téléversé par Eclipse sera exécutable.

Dans l'onglet Debugger, modifiez le champ GDB debugger. Sous Ubuntu, la valeur à y mettre est gdb-multiarch. Sous Windows, il s'agit plutôt de C:\SysGCC\Raspberry\bin\arm-linux-gnueabihf-gdb-7.10.exe. Si vous avez une installation particulière, il se peut que vous ayez à utiliser un autre chemin.

Finalement, notez que c'est dans l'onglet Arguments que vous pourrez ajouter ou modifier les arguments à passer en ligne de commande à votre exécutable. Vous pouvez tester une première session de débogage en choisissant, dans le menu de débogage, le profil que vous venez de créer (dans ce cas-ci, le profil a été nommé "Remote debug"). Vous devrez indiquer le mot de passe de votre compte utilisateur à Eclipse, mais pouvez opter pour que l'application s'en souvienne.

4) Correction des bogues

À ce stade, vous devriez être en mesure de lancer une session de débogage à distance sur le Raspberry Pi. Il est maintenant temps d'utiliser tout cela à bon escient! Le fichier qui vous est fourni contient deux erreurs distinctes. Ces erreurs ne sont pas des erreurs de compilation, mais des erreurs de logique, qui empêchent le programme d'avoir le bon comportement. Vous devez les identifier et les corriger en utilisant le débogueur d'Eclipse. Vous devez également pouvoir expliquer leur cause, de même que les corrections à apporter pour que le programme fonctionne correctement.

5) Profilage

Une fois cela fait, vous devez profiler le programme. Pour ce faire, activez d'abord la sortie d'information de profilage en allant dans les options du projet :

Puis exécutez le programme. Cela devrait produire un fichier nommé gmon.out dans le répertoire $HOME du Raspberry Pi. Vous pouvez par la suite y accéder avec Eclipse (utilisez la perspective Remote Systems) et l'ouvrir afin de consulter les informations de profilage :

Au vu des résultats de profilage obtenus, pouvez-vous donner le nombre d'appels à la fonction de comparaison lorsque vous faites appel au tri par insertion (fonction maFonctionDeTri), avec les bogues corrigés?

Modifiez maintenant l'argument d'entrée, afin d'obtenir une initialisation de la liste différente, et refaites un profilage. Obtenez-vous des résultats différents? Pourquoi?

Modalités d'évaluation

Ce travail est individuel. Aucun rapport n'est à remettre, mais vous devez être en mesure de démontrer que votre environnement de développement est fonctionnel et que vous savez utiliser ses fonctions basiques. Cette évaluation sera faite lors des séances de laboratoire du 20 et 27 janvier 2017. Si vous ne pouvez pas vous y présenter, contactez l'équipe pédagogique du cours dans les plus brefs délais afin de convenir d'une date d'évaluation alternative. Ce travail compte pour 5% de la note totale du cours.

Le barême d'évaluation détaillé sera le suivant (laboratoire noté sur 20 pts) :

  • (3 pts) Raspberry Pi fonctionnel, y compris à distance (via SSH).
  • (2 pts) Eclipse C++ installé et fonctionnel, y compris le greffon d'accès à distance.
  • (3 pts) Chaîne de compilation croisée installée et configurée pour le Raspberry Pi 3, capacité à produire un binaire ARM.
  • (6 pts) Programme débogué : le programme doit s'exécuter sans erreur et produire un résultat correct. L'étudiant doit pouvoir expliquer les raisons des erreurs dans le programme initial.
  • (4 pts) Profilage : les données de profilage sont bien générées et l'étudiant est en mesure de les afficher sur son ordinateur.
  • (2 pts) Analyse : l'étudiant est en mesure d'expliquer les résultats de profilage obtenus.

Ressources et lectures connexes