Outils de développement ARM


Sommaire :

1.
2.
2.1.
2.1.1.
2.1.1.1.
2.1.1.2.
2.1.1.3.
2.1.2.
2.1.2.1.
2.1.2.2.
2.1.3.
2.1.3.1.
2.1.3.2.
2.1.3.3.
2.1.3.4.
3.
3.1.
3.2.
3.3.
3.4.
3.5.
3.6.
3.7.
3.8.
4.
5.
Introduction :
Présentation :
Description :
Les Utilitaires :
arm-linux-gcc :
arm-linux-as :
arm-linux-ld :
Le débogueur :
arm-linux-gdb :
ddd :
Exemple d'utilisation :
Fichier source :
Compilation :
Simulation :
Simulation avec l'interface graphique :
Installation :
Packages nécessaires :
Le noyau :
Les utilitaires :
Le compilateur (1ère phase) :
La librairie :
Le compilateur (2ème phase) :
Le débogueur et simulateur :
L'interface :
Références :
Download :

1. Introduction :

Cette documentation a pour but de faciliter l'installation de l'ensemble des outils GNU nécessaires au développement de systèmes à base de processeurs ARM. Une présentation de l'environnement de développement est suivi d'une brève description de chacun ses outils (ou plus suivant l'évolution de ce document) . J'ai essayé de regrouper des informations prises ici et là sur différents
sites. Si comme moi vous n'êtes pas habitué aux maniements de la compilation, la mise en place des outils de développement vous semblera longue et fastidieuse. Je tiens de ce fait à remercier Christophe LEROY ingénieur diplomé ENSEA qui m'a été d'un grand secours. La station de travail qui recevra l'environnement de développement est un pc-586-linux ; on parlera alors de "cross-compilation" des outils GNU. Bien sûr, j'attends vos commentaires et surtout vos critiques. Il manque sûrement des choses intéressantes et n'étant pas encore un spécialiste des outils de développement ni du processeur ARM, certains points me paraissent obscures (souligné dans le texte).

2. Présentation :

Méthode de communication entre le débogueur et les périphériques

Caractéristiques :

2.1. Description :

2.1.1. Les Utilitaires :

2.1.1.1. arm-linux-gcc :

Compilateur C et C++. Il traite plusieurs fichiers d'entrée suivant une ou plusieurs étapes parmi quatre qui sont le prétraitement, la compilation, l'assemblage et la liaison. L'extension du fichier source dépend du langage utilisé et d'étermine le comportement du compilateur.

2.1.1.2. arm-linux-as :

Assembleur GNU pour le processeur ARM. Il assemble la sortie du compilateur C, le résultat étant utilisé par le linker.

2.1.1.3. arm-linux-ld :

Combine un certain nombre de fichiers "objet" et "archive", en réorganisant leurs données et liant leurs références symbole. C'est généralement la dernière étape dans la compilation d'un programme.

2.1.2. Le débogueur :

2.1.2.1. arm-linux-gdb :

Permet de voir se qui se passe lors de l'exécution d'un programme ou lorsqu'il s'interrompe inopinément. Les erreurs peuvent être décelées : Supporte plusieurs "langage de travail" : C, C++, Asm, Chill, Fortran, Java, Modula-2, Scheme.

2.1.2.2. ddd :

Interface graphique s'utilisant avec les débogueurs UNIX classiques tel que le débogueur GNU GDB, arm-linux-gdb étant invoqué par l'option --debugger.

2.1.3. Exemple d'utilisation :

2.1.3.1. Fichier source :

	.file   "example.s"
	.text				@ ENTRY
	.global	_start			@ mark first instruction
	.type	_start,%function	@ to execute

_start:
	MOV	r0, #15			@ Set up parameters
	MOV	r1, #20
	BL	firstfunc		@ Call subroutine
	SWI	0x11			@ terminate

firstfunc:				@ Subroutine firstfunc
	ADD	r0, r0, r1		@ r0 = r0 + r1
	MOV	pc, lr			@ Return from subroutine
					@ with result in r0
					@ END
_end:					@ mark end of file

2.1.3.2. Compilation :

Génération du fichier "objet" : arm-linux-as -o example.o example.s

Génération de l'exécutable : arm-linux-ld -o example example.o

2.1.3.3. Simulation :

Remarque :

On visualise ici des registres APCS.

2.1.3.4. Simulation avec l'interface graphique :

3. Installation :

3.1. Packages nécessaires :

Voici pour finir la liste des fichiers et leur version qui m'ont permis de constituer mon environnemnt de développement à la date d'écriture de ce document :

3.2. Le noyau :

On peut l'installer à l'endroit habituel /usr/src ou ailleurs puisqu'on n'a pas besoin de le compiler ni de l'installer pour les outils de développement . C'est simplement pour fixer des options d'optimisations et des librairies pour le compilateur C. Cependant pour faire croire à une architecture ARM il faut modifier le fichier Makefile :
[...]
# ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/
arm/ -e s/sa110/arm/)

ARCH := arm
[...]
Il faut ensuite configurer le noyau au niveau système et processeur de la façon suivante (make xconfig) :

3.3. Les utilitaires :

Pas de problème particulier pour l'installation du package "binutil", INST_DT_DIR étant le répertoire d'installation des outils de développement :
./configure --target=arm-linux --prefix=< INST_DT_DIR >
make
make install

3.4. Le compilateur (1ère phase) :

./configure \
--target=arm-linux \
--with-include-dir=< INST_DT_DIR >/arm-linux/include \
--prefix=< INST_DT_DIR >
Lors de la première compilation, il faut ajouter l'option LANGUAGES=c pour qu'il ne construise pas le C++ et l'objective C.

make LANGUAGES=c

Il se peut qu'une erreur soit générée au bout d'un certain temps dû à la tentative d'exécution d'un programme pour une architecture ARM sur une architecture I586 :

[...]
iofprintf.c             ..linked
iofputs.c               ..linked
iofread.c               ..linked
iofscanf.c              ..linked
iofsetpos.c             ..linked
ioftell.c               ..linked
[...]
checking whether the C compiler (/usr/local/src/ARM_dev/egcs-1.1.1/gcc/xgcc 
-B/usr/local/src/ARM_dev/egcs-1.1.1/gcc/ -g -O2 ) works... no
configure: error: installation or configuration problem: C compiler cannot 
create executables.
make: *** [configure-target-libiberty] Error 1
Mais généralement le compilateur a été généré. Pour s'en convaincre il faut essayer de l'installer par la commande :

make -i LANGUAGES=C install

Et voir si on obtient bien un exécutable arm-linux-gcc dans < INST_DT_DIR >/bin. Si tel est le cas essayons maintenant de compiler un programme qui ne fait rien :

int rien(int a,int b)
{
return a+b;
}
Génération du code assembleur ARM rien.s par la commande arm-linus-gcc -S rien.c :
        .file   "rien.c"
rfp     .req    r9
sl      .req    r10
fp      .req    r11
ip      .req    r12
sp      .req    r13
lr      .req    r14
pc      .req    r15
gcc2_compiled.:
__gnu_compiled_c:
.text
        .align  2
        .global rien
        .type   rien,%function
rien:
        @ args = 0, pretend = 0, frame = 8
        @ frame_needed = 1, current_function_anonymous_args = 0
        mov     ip, sp
        stmfd   sp!, {fp, ip, lr, pc}
        sub     fp, ip, #4
        sub     sp, sp, #8
        str     r0, [fp, #-16]
        str     r1, [fp, #-20]
        ldr     r3, [fp, #-16]
        ldr     r2, [fp, #-20]
        add     r3, r3, r2
        mov     r0, r3
        b       .L1
.L1:
        ldmea   fp, {fp, sp, pc}
.Lfe1:
        .size   rien, .Lfe1 - rien
        .ident  "GCC: (GNU) egcs-2.91.60 19990113/philb (egcs-1.1.1 release)"
Désassemblage du code par arm-linux-objdump -d rien.o en ayant auparavant généré le fichier objet par la commande arm-linux-gcc -c rien.c :
rien.o:     file format elf32-arm

Disassembly of section .text:

00000000 < rien >:
   0:   e1a0c00d        mov     ip, sp
   4:   e92dd800        stmdb   sp!, {fp, ip, lr, pc}
   8:   e24cb004        sub     fp, ip, #4
   c:   e24dd008        sub     sp, sp, #8
  10:   e50b0010        str     r0, [fp, -#16]
  14:   e50b1014        str     r1, [fp, -#20]
  18:   e51b3010        ldr     r3, [fp, -#16]
  1c:   e51b2014        ldr     r2, [fp, -#20]
  20:   e0833002        add     r3, r3, r2
  24:   e1a00003        mov     r0, r3
  28:   eaffffff        b       2c < rien+0x2c >
  2c:   e91ba800        ldmdb   fp, {fp, sp, pc}
C'est tout bon ! Passons maintenant à la compilation de la librairie.

Remarque :

Dans le répertoire < INST_DT_DIR >/arm-linux/include vous aurez créé les liens symboliques suivants :
asm -> < INST_KERNEL_DIR >/include/asm
linux -> < INST_KERNEL_DIR >/include/linux
< INST_KERNEL_DIR > étant le répertoire d'installation du noyau.

3.5. La librairie :

./configure \
--prefix=< INST_DT_DIR > \
--with-headers=< INST_DT_DIR >/arm-linux/include \
--enable-add-ons -host=arm-linux -build=i386-linux
make
make install

Remarque :

Vérifier auparavant que les liens dans le répertoire < INST_DT_DIR >/arm-linux/include/asm
sont correctes :
arch -> arch-ebsa285
proc -> proc-armv

3.6. Le compilateur (2ème phase) :

Il faut maintenant compiler le package "egcs" entièrement et prendre en compte les nouvelles librairie . Ne pas oublier de faire un make distclean avant de relancer la configuration :

.configure \
--target=arm-linux \
--with-headers=< INST_DT_DIR >/include \
--with-libs=< INST_DT_DIR >/lib \
--prefix=< INST_DT_DIR >
make
make install

Remarque :

Les librairies vont être recopiées dans < INST_DT_DIR >/arm-linux/lib puis
< INST_DT_DIR >/arm-linux/sys-include.
Personnellement pour éviter de gacher de la place, j'ai créé les liens suivants dans
< INST_DT_DIR >/arm-linux :
lib -> ../lib
sys-include -> ../include

3.7. Le débogueur et simulateur :

Pas de problème particulier si ce n'est qu'il faut indiquer un répertoire d'installation autre que celui des outils de développement :
.configure --target=arm-linux --prefix=< INST_GDB_DIR >
make
make install

3.8. L'interface :

Pour les raisons invoquées dans la section
"Packages nécessaires", j'ai choisi un package RPM :

rpm -ivh ddd-static-*.i386.rpm

4. Références :

http://www.arm.com
http://www.arm.uk.linux.org
http://www.tazenda.demon.co.uk/phil/armlinux
http://www.tazenda.demon.co.uk/phil/arm-tools.html
http://sourceware.cygnus.com/gdb
http://www.cs.tu-bs.de/softech/ddd
http://developer.intel.com/design/strong/applnots/sa1100lx/sa1100lx.htm

5. Download :

Cet environnement de développement a été compilé sur une plateforme i586-linux avec une distribution RedHat-5.2 et un noyau 2.2.6. Il commence à dater et il faudrait faire la même chose avec un "gcc" d'actualité :
ARM_dev-base-19990504.tbz (6.2M)
ARM_dev-doc-19990504.tbz (3.7M)
ARM_dev-lib-19990504.tbz (16.1M)
arm_linux_gdb-4.18.tbz (3.9M)
ddd-static-2.0-1.i386.rpm (1.3M)
Pour extraire : tar xIvf < fichier >.tbz


© ENSTA - 32 boulevard Victor - 75739 PARIS CEDEX 15