SSV DNP5370 (Blackfin)

From Electrolab
Revision as of 22:24, 11 March 2014 by Mael (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Blackfin DNP5370

µCLinux et cross compilation

Le code du Blackfin est développé en C sous linux. La portabilité entre Linux et µCLinux permet de développer et tester son code sur hôte dans un premier temps (PC) puis ensuite sur cible une fois que les principales fonctions sont opérationnelles. Il n’y a pas de modification majeurs entre un code hôte et un code cible, tout se joue essentiellement au niveau des interfaces et du Makefile. Il est nécessaire de « bouchonner » les interfaces et d’utiliser un Makefile spécifique à la machine exécutant le code.
La fonction d’un Makefile est de compiler le(s) fichier(s) source au format machine afin de pouvoir les exécuter. Un Makefile est associé à un exécutable, ainsi qu’à un type de machine.
Un fichier Makefile en C sous Linux se nomme Makefile.nom, nom étant l’identifiant du Makefile.
Les fichiers Makefile peuvent être édités sous Kate aisément, leur typologie étant cependant différentes d’un fichier C standard (Un Makefile n’est pas dédié à un code C). Aujourd’hui, ce type de compilation est en règle générale intégrée à l’environnement de développement.
Un fichier Makefile définit les variables suivantes :

  • CROSS : Chemin du compilateur ainsi que des dépendances associées, par exemple les fichiers headers utilisés à la compilation,
  • CC : nom de l’exécutable du compilateur,
  • EXEC : Nom de l’exécutable produit à l’issue de la compilation,
  • OBJS : définit les fichiers objets à créer pour pouvoir générer l’exécutable. Les fichiers objets sont définis par le nom du fichier source avec le suffixe « *.o »,
  • CFLAGS : paramètre du compilateur, utilisé pour définir certaines caractéristiques à appliquer au code lors de la compilation (par exemple pour assurer la reproductibilité de la compilation, qui peut varier en fonction des machines ou des recompilations, etc.).
  • LFLAGS : Idem.

Les fichiers sont ensuite compilés un par un, en utilisant la structure :

$(CC) $(CFLAGS) -c nom_de_la_source.c

Puis une compilation globale est lancée pour créer les exécutables :

$(CC) $(LFLAGS) -o $(EXEC) $(OBJS) -lm

Un Makefile s’exécute par la commande make –f Makefile.nom. Il est possible de lancer plusieurs Makefile à la suite en utilisant un script shell.
Un exemple de Makefile est présenté ci-dessous :

/***********************************************************************************/

CROSS	  = /opt/opt/uClinux/bfin-uclinux/bin/bfin-uclinux-
CC	  = $(CROSS)gcc
EXEC	  = SCH_PROC
OBJS      = SCH_main.o SCH_calcul.o SCH_process.o SCH_time.o GEN_IPC.o SCH_RS232.o ITF_calcul.o COM_calcul.o
CFLAGS	  = -O2
LFLAGS    = -Wl,-elf2flt

all: 
	$(CC) $(CFLAGS) -c SCH_main.c
	$(CC) $(CFLAGS) -c SCH_calcul.c
	$(CC) $(CFLAGS) -c GEN_IPC.c
	$(CC) $(CFLAGS) -c SCH_process.c
	$(CC) $(CFLAGS) -c SCH_time.c
	$(CC) $(CFLAGS) -c SCH_RS232.c
	$(CC) $(CFLAGS) -c ITF_calcul.c
	$(CC) $(CFLAGS) -c COM_calcul.c
	$(CC) $(LFLAGS) -o $(EXEC) $(OBJS) -lm
#-----------------------------------------------
clean: 
	rm -f *.o *.gdb *.elf $(EXEC)

/***********************************************************************************/ Ce Makefile permet la compilation d’un code C pour une exécution directement sur une cible de type Blackfin en µClinux. L’exemple ci-dessous est utilisable pour une exécution sur PC x86 : /***********************************************************************************/ PATH  := $(PATH):/usr/bin:/usr/local/bin CC = gcc EXEC = SCH_PROC OBJS = SCH_main.o SCH_calcul.o SCH_process.o SCH_time.o GEN_IPC.o SCH_RS232.o CFLAGS = -Wall

all: $(EXEC)

$(EXEC): $(OBJS) $(CC) $(CFLAGS) -O3 -o $@ $(OBJS) -lc -lm chmod 777 $@

  1. -----------------------------------------------

clean: rm -f $(EXEC) *.elf *.gdb *.o /***********************************************************************************/ A noter, il n’est pas nécessaire de compiler les fichiers source pour en faire des fichiers objets dans ce cas, la compilation est automatique. Ce type de compilation sera utilisé par exemple pour le débogage de l’application et des fonctionnements internes du système avant son déploiement sur cible.