Linux embarqué
Transcription
Linux embarqué
TP5 MASTER2LSE SEE –INSTALLATION DES OUTILS DE DEVELOPPEMENT LINUX EMBARQUE POUR CARTE ARMADEUS Dans le cadre du l’UE SEE, nous utiliserons une carte Armadeus APF27 (http://www.armadeus.com/ wiki/index.php?title=APF27). Le nom Armadeus vient du fait que la carte soit basée sur un processeur ARM et selon les constructeurs de la carte, ARM est aux processeurs embarqués ce qu’Amadeus (Mozart) étaient aux compositeurs. La carte APF27 est munie d’un processeur ARM 9 (400MHz) dans sa version Freescale i.MX27, d’un FPGA Spartan 3 directement lié au processeur (http://www.armadeus.com/wiki/index.php?title= APF27_FPGAIMX_interface_description), d’une mémoire RAM de 128MO (2*64MO) et d’une mémoire flash de 256MO. La carte est insérée sur une carte de développement APF9328DevFull (http://www.armadeus.com/wiki/index.php?title=APF9328DevFull). La carte est fournie avec un système Linux opérationnel et un bootloader UBoot. Nous allons, à travers ce TP, installer l’ensemble des outils nous permettant d’utiliser et de développer sur la carte. L’installation des outils spécifiques au FPGA n’est pas comprise dans ce TP. La plupart des instructions de ce TP ont été prises du site web www.armadeus.org CREATION DE LA MACHINE VIRTUELLE Nous allons travailler sur des machines virtuelles dont les disques durs virtuels sont installés en local sur les machines de la salle de TP, il est donc important de travailler sur la même machine d'une séance à l'autre si possible (exception faite de cette séance) Lancer Virtual Box de la manière décrite ci-dessus. Nous avons préparé un export de machine virtuel qui sera à utiliser. Le fichier se trouve dans /home/commun_depinfo/vm/ et se nomme boukhobza-j.tp6_avant.ova, ce fichier représente l'export à utiliser uniquement lors de la première séance. Le fichier doit être copié sur le lecteur D ou E seon les salles. Allez sur l'import de machine virtuelle : File import appliance. Allez sur "Open Appliance" et choisissez l'import de machine virtuelle que l'on a mis à votre disposition et que vous avez copié sur le lecteur D ou E. Une fois le fichier choisi, cliquez sur "next". Modifiez le volume de RAM utilisée à au moins 1 GO de RAM (1024 MO) et plusieurs cœurs à utiliser. Modifiez aussi le répertoire hébergeant la machine virtuelle (Virtual Disk image), à mettre dans le lecteur D ou E. Cliquer sur "import". Une fois l'import réalisé, nous allons configurer certains éléments: Cliquez droit sur la machine virtuelle nouvellement créée, puis cliquer sur settings. Dans l'onglet "Network", choisissez le mode d'accès "Bridged Adapter/accès par pont". La machine virtuelle partagera la même interface réseau que la machine hôte (le pc) mais aura sa propre adresse ip Avant l'étape suivante, s'assurer que l'adaptateur série-USB est branché sur un port USB de la machine hôte Dans l'onglet "USB", cliquez sur "Ajouter un filtre depuis un périphérique", sélectionner l'entrée qui correspond à l'adaptateur série-USB (FTDI …). Cliquer sur Ok. Avant de lancer la machine virtuelle, s'assurer que la carte est sous tension. S'assurer également que la carte et la machine hôte sont reliées à un switch qui est lui-même reliée à une prise réseau murale. Lancer la machine virtuelle. Le nom d'utilisateur du système Ubuntu est "armadeus" et le mot de passe est "armadeus". Cet utilisateur est capable de lancer la commande sudo pour effectuer des tâches d'administration. Une fois authentifié sur la MV (Ubuntu), cliquez bouton droit sur l'icône réseau en haut à droite, et choisir "modification des connexions". Double cliquer sur la connexion filaire et se rendre au niveau de l'onglet "paramètres ipv4". Choisir la méthode "manuel". Ajouter l'entrée suivante : Adresse: 172.18.3.2x ; /* la valeur de x sera communiquée pour chacun des groupes */ Masque: 255.255.255.0 ; Passerelle: 172.18.3.18. Pour le DNS entrer 195.83.247.29. La connexion internet devrait maintenant être active. Il faut configurer Firefox (dans la machine invitée) pour utiliser le proxy du système : dans Firefox, Edit -> Preferences -> Advanced -> Network -> Settings -> Use system proxy settings. DEMARRER LA CARTE INSTALLATION DES OUTILS DE COMMUNICATION Avant de commencer l'installation, nous allons mettre à jour les dépôts: $sudo apt-get update NB: Ne Lancez pas la mise à jour automatique du gestionnaire de mise à jour, cela augmenterait dangereusement la taille de l'image. Installation de l’outil de communication sur l’interface série (gtkterm et/ou minicom) pour le contrôle de la carte. C’est, en effet, à travers le port série que l’on enverra l’ensemble des commandes à exécuter sur la carte. Le port série sera, en quelque sorte notre shell : Lancer l’installation des deux programmes : $sudo apt-get install minicom gtkterm Vous utiliserez l’un ou l’autre (minicom ou gkterm) en fonction de vos préférences. Installation de « Tftp server » pour charger les fichiers sur la carte : Lancez : $sudo apt-get install tftp tftpd xinetd Tftp (Trivial ftp) est un protocole de transfert de fichiers (ftp) simplifié, il nous permettra de transférer nos programmes compilés sur la machine hôte vers la carte Armadeus via l’Ethernet (pour aller plus vite). Xinetd est un démon qui permet de gérer les connexions. Nous créons ensuite le répertoire de dépôt de fichiers à transmettre vers la carte, on l’appellera tftpboot. Ça sera aussi à: travers ce répertoire que l’on transmettra les images du noyau. $sudo mkdir /tftpboot suivi d’un $sudo chmod 777 /tftpboot Il faut aussi créer un fichier de configuration du serveur tftp (hôte) : créez le fichier de configuration /etc/xinetd.d/tftp et mettez-y : # default: off # description: The tftp server serves files using the trivial file # transfer protocol. The tftp protocol is often used to boot # diskless workstations, download configuration files to network# aware printers,and to start the installation process for some # operating systems. service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot # disable = yes } Une fois la configuration terminée, nous avons besoin de redémarrer le service xinetd (démon) : $ sudo killall -HUP xinetd Pour redémarrer le service il suffit d’un : $ sudo service xinetd start Ou : $ sudo service xinetd restart Lancer (toujours avec sudo) un terminal série (gtkterm ou minicom). Pour gtkterm, cliquez sur « Configuration » puis « Port », assurez-vous que le port est bien "/dev/ttyUSB0", mettez la débit à 115200 bauds, et ne touchez pas au reste (sauf si vous souhaitez changer l'affichage). Connectez à présent l’alimentation de la carte, et les ports séries entre la carte et le PC à travers le cable série Null/Modem + convertisseur USB. Linux devrait démarrer. Vous pouvez utiliser le login « root », il ne nécessite pas de mot de passe. Vous pouvez parcourir la hiérarchie de fichier et remarquer que c’est le même standard avec Linux que vous connaissez (voir TP1). Vous pouvez, par exemple, voir les différentes partitions du système de fichiers avec un #df –h et voir un peu ce qui se passe en scrutant le répertoire /proc. Maintenant, pour pouvoir lancer notre première application sur la carte, il va falloir installer tout l’environnement de développement. OUTILS DE DEVELOPPEMENT Si vous avez des difficultés sur la partie précédente, n’hésitez pas à me consulter. INSTALLATION DE L’ENVIRONNEMENT DE DEVELOPPEMENT PREREQUIS (Voir http://www.armadeus.com/wiki/index.php?title=Ubuntu/Debian_installation_prerequisites) Il faut commencer par installer, d’abord, un certain nombre d’outils/programmes/librairies permettant d’utiliser les outils de développement. L’ensemble des commandes données ne sont pas nécessaires car certains programmes sont déjà préinstallés sur votre PC. Je les mets, néanmoins, dans l’énoncé de TP de telle sorte à ce que vous puissiez installer l’ensemble des outils sur une autre machine. Au pire, vous aurez un message vous notifiant que les outils existent déjà. Installation des outils de compilation (respectivement : les paquets nécessaires à la compilation de paquets Debian, le compilateur gcc, compilateur gcc-c++, un outil pour produire les scripts de configuration du source, des outils de génération automatique de Makefile, des outils de création de librairies, un outil d’analyse syntaxique, un outil d’analyse lexicale et des outils de traduction de texte et de standardisation de messages) : $sudo apt-get install -y build-essential gcc g++ autoconf automake libtool bison flex gettext Installation des outils de développement en ligne (un outil de patch, un logiciel de versionning de code pour le travail collaboratif, un outil de format de documentation, un gestionnaire de téléchargement, et un outil de gestion de version décentralisé) : $sudo apt-get install -y patch subversion texinfo wget git-core Installation de divers librairies: librairie d'affichage de menu texte, librairies de compression en mémoire : $sudo apt-get install -y libncurses5 libncurses5-dev sudo apt-get install -y zlib1g-dev liblzo2-2 liblzo2-dev librairie pour la gestion des listes de contrôle d'accès, outil de gestion de texte, outil de contrôle de version, outil de transfert de données, outil de compression, librairie pour la génération d'id de 128 bits uniques et un autre outil de gestion de version simple. sudo apt-get install -y libacl1 libacl1-dev gawk cvs curl lzma sudo apt-get install -y uuid-dev mercurial Modification du shell par défaut: $ ls -al /bin/sh lrwxrwxrwx 1 root root 4 2007-12-08 18:33 /bin/sh -> dash $ sudo dpkg-reconfigure dash and select no Il faut aussi installer en_US.UTF-8 (car votre installation est en français): $ sudo dpkg-reconfigure locales Quelques paquets optionnels: une librairie contenant des routines de gestion d'arbres, tables de hachages, etc.,librairie pour la gestion de quelques formats graphiques, etc. : $ sudo apt-get -y install libglib2.0-dev $ sudo apt-get -y install libnetpbm10-dev (for fbtest) $ sudo apt-get -y install python-xcbgen (for Matchbox) et enfin, pour compiler ajva, jamvm et gnu-classpath: $ sudo apt-get -y install gcj-jdk TELECHARGEMENT DES OUTILS ARMADEUS Cette partie a déjà été réalisée sur votre machine virtuelle, mais je la mets afin que vous sachiez reproduire l'installation sur une autre machine . Allez sur le site : http://sourceforge.net/projects/armadeus/files/ et téléchargez la dernière version de l’outil. Mettez cela sur la racine du compte root par exemple. Décompressez votre archive : $ tar xjvf armadeus-5.2.tar.bz2 CONFIGURATION MINIMALISTE DE LA SDK ARMADEUS Allez dans le répertoire contenant les outils Armadeus (normalement ./armadeus-5.2). Pour configurer la compilation des outils pour la carte Armadeus apf27, lancez: $ make apf27_defconfig Allez dans l’option « System configuration » puis « Armadeus Device support », nous allons modifier la taille de la RAM (128MO dans notre cas): Choisissez l’option « Armadeus Device Support » Allez ensuite sur l’option « Number of RAM chips on your board » et choisissez l’option 2 (ATTENTION : nous avons 2 composants de 64MO et non pas un seul de 128MO). On peut augmenter la vitesse de compilation en permettant le lancement de plusieurs "jobs" en parallèle: Allez dans le menu "Build Options" et modifiez la valeur du "Number of jobs to run simultaneously" à 4 par exemple. Sortez du menu en enregistrant. Copiez le contenu du repertoire "./buildtools" dans le repertoire "./armadeus-5.2/buildroot/downloads" (créez le répertoire downloads si toute fois ce dernier n'existe pas. Tapez la commande : $sudo make Votre environnement de développement croisé est en cours de construction. Cela peut prendre beaucoup de temps (peut être un peu moins d’une heure). Entre temps (ça prend du temps), vous pouvez aller vous documenter sur www.armadeus.org. Si votre shell vous affiche le message suivant, c’est gagné ! Your Armadeus BSP (version 5.2 for APF27) was successfully built ! PREMIER PROGRAMME Maintenant que l’environnement de programmation est crée, nous allons procéder à la création de notre premier programme. Dans un environnement avec chaîne de développement croisée comme le notre, l’écriture du code source ainsi que la compilation se fait à partir de l’hôte et non pas directement sur la carte. Saisissez le code suivant et nommez le fichier hello.c (tradition oblige, on n’y coupe pas !): #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf( "APF says: Hello M2LSE ! ;-)\n”); //très original! exit(0); } COMPILATION CROISEE Une fois le fichier sauvegardé, il faut le compiler pour l’exécuter sur le processeur de la carte (ARM9) et non pas sur le processeur du PC avec un gcc classique. En faisant un « $ make apf27_defconfig » puis un « $ make » dans la partie précédente, nous avons configuré puis construit l’environnement de développement croisé qui inclut plusieurs outils/fichiers, dont : le noyau Linux (choix entre quelques versions récentes lors de la configuration) pour l’architecture de la carte, Buildroot (ensemble de makefile générant la chaîne de compilation/développement), http://buildroot.uclibc.org UBoot (un système de démarrage tel que Grub ou Lilo mais pour l’embarqué), http://www.denx.de/wiki/U-Boot Busybox (un exécutable regroupant plusieurs commandes linux « dégraissées »), http://www.busybox.net/ Binutils (plusieurs utilitaires GNU), http://www.gnu.org/software/binutils/ GCC (compilateur pour l’architecture cible), GDB (débogueur), l’image du système de fichiers. Le compilateur croisé dont on a besoin pour notre petit programme est installé, normalement, dans armadeus5.2/buildroot/output/host/usr/bin/ et se nomme arm-linux-gcc. On pourra y accéder directement via la variable d’environnement $ARMADEUS_TOOLCHAIN_PATH, on fait donc : $ sudo make shell_env $ . ./armadeus_env.sh //notez l’espace entre les 2 points $ echo $ARMADEUS_TOOLCHAIN_PATH (vérification) Ensuite, il n’y a plus qu’à se mettre dans le répertoire contenant notre fichier hello.c (monrep dans mon cas) et : [monrep]$ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH Pour utiliser directement l’exécutable, ensuite: [monrep]$ arm-linux-gcc -o hello hello.c Votre fichier exécutable doit avoir été généré (si vous n’avez pas fait d’erreur de retranscription). Il ne reste plus qu’à le transférer sur la carte et l’exécuter. Pour cela, nous utiliserons le protocole tftp. CONFIGURATION DE TFTP Copiez votre fichier exécutable dans le répertoire /tftpboot précédemment crée. On utilisera ce répertoire pour tout transfert de fichiers entre la carte et la machine hôte. Nous allons donner une identité « réseau » à la carte. Relancer Gtkterm. Rebooter la carte en tapant la commande « reboot » ou grâce au bouton poussoir du milieu (S2). Au démarrage appuyez sur un bouton pour « stopper l’autoboot ». Vous voila dans l’environnement du bootloader UBoot (avant la décompression du noyau Linux). Nous allons, à présent, paramétrer la carte réseau : BIOS> setenv netmask 255.255.255.0 BIOS> setenv ipaddr 172.18.3.4x (ça sera l’adresse de notre carte) BIOS> setenv serverip 172.18.3.2x virtuelle) (mettez l’adresse ip de votre machine BIOS> setenv rootpath /tftpboot BIOS> saveenv BIOS> boot (démarrer Linux) Une fois cela réalisé, nous pouvons récupérer notre exécutable à partir de la carte : # tftp –g –r hello –l /usr/bin/hello 172.18.3.2x (mettez l’adresse ip de la MV) Vous pouvez aller dans le répertoire /usr/bin de la carte et exécuter votre programme (après un $chmod 755 hello). Félicitations, vous venez de développer et de porter votre première application sur l’APF27. METTRE DE L’ORDRE DANS L ’EXECUTION On va utiliser un makefile pour rendre les choses plus claires (sur l’hôte). Vous pouvez utiliser le makefile suivant ou le modifier. CC=arm-linux-gcc CFLAGS=-W -Wall LDFLAGS= EXEC=hello SRC=$(wildcard *.c) OBJ=$(SRC:.c=.o) all: $(EXEC) $(EXEC): $(OBJ) $(CC) -o $@ $^ $(LDFLAGS) %.o: %.c $(CC) -o $@ -c $< $(CFLAGS) .PHONY: clean install clean: rm -rf *.o rm -f $(EXEC) install: all cp -f $(EXEC) /tftpboot/