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/