Introduction à Code Composer Studio et usage avec le

Transcription

Introduction à Code Composer Studio et usage avec le
Université du Québec à Montréal
Département d’Informatique
MIC4220
Traitement numérique du signal
Laboratoire 1 : Utilisation de CCS4 et DSK’C6713
OBJECTIFS
Apprendre à utiliser Code Composer Studio (CCS4) et la carte DSK de Texas
Instrument; se familiariser avec le développement d’un système DSP et l’analyse d’un
programme et des résultats produits en temps réel.
INTRODUCTION
Code Composer Studio (CCS) fournit plusieurs outils pour faciliter la construction et
la mise au point des programmes de DSP. Il comprend un éditeur de code source, un
compilateur de langage C/C++, un assembleur de code relocalisable, un éditeur de liens,
et un environnement d’exécution qui permet de télécharger un programme exécutable sur
une carte cible, de l’exécuter et de le déboguer au besoin. CCS comprend aussi des outils
qui permettent l’analyse en temps réel d’un programme en cours d’exécution et des
résultats produits. Finalement, il fournit un environnement de gestion de fichiers qui
facilite la construction et la mise au point des programmes.
EXEMPLE D’UTILISATION
L’exemple qui suit montre comment un algorithme multifilaire simple peut être
compilé, assemblé et lié en utilisant CCS. D'abord, plusieurs valeurs de données sont
écrites en mémoire. Ensuite un pointeur est assigné au début des données de sorte qu'elles
puissent être traitées comme elles sont présentées. Finalement des fonctions simples sont
ajoutées en C et en assembleur pour illustrer la façon dont celles-ci sont exécutées.
I. Créer un répertoire de travail
Le répertoire de travail est l’endroit où vos projets seront sauvegardés. Lors de la
première utilisation de CCS4, il devra se créer un répertoire de travail sur votre espace
personnel sur le disque Z . Le changement du répertoire de travail peut s’effectuer à
partir la commande du menu «File→ Switch Workspace» puis il faut entrer le nom de
l’espace de travail dans la fenêtre.
1
L’écran «Welcome to Code Composer Studio v4» introduit à un tutoriel de départ, des
exemples et des informations sur les composants. Cliquer sur le cube à droite pour
commencer l’emploi de CCS4.
II. Créer un projet
Le processus de développement de code de CCS commence par la création d'un projet
qui facilite l’intégration des fichiers requis pour produire un fichier exécutable. Le
répertoire projet contient des références aux fichiers source (*.c, *.asm) aux fichiers
d’en-tête (*.h), au fichier de commande pour l’éditeur de liens (*.cmd), et aux fichiers de
bibliothèque (*.lib). Le projet permet aussi de spécifier les paramètres du compilateur,
de l'assembleur et de l'éditeur de liens afin de produire le fichier exécutable.
1. Après l’ouverture du logiciel, ouvrir la perspective du projet
→Open Perspective→ C/C++ » de la barre menu de CCS.
« Window
2. Pour créer un projet, vous choisissez l'élément de menu « File →New→CCS
Project » de la barre menu. Dans celle-ci, vous introduisez un nom de projet
dans le champ « Project name » (lab1, par exemple).
3. Poursuivre avec le type du projet en sélectionnant : « Project Type : C6000»
pour le TMS320C6713.
2
4. Poursuivre et sélectionner dans «Device Variant: Generic C67xx Device» pour
le TMS320C6713 et «Runtime Support Library : RTS6700.lib».
5. Poursuivre et sélectionner dans la fenêtre «Project Templates» l’item «Empty
Projects / Empty Project Device» .
3
III. Créer un fichier source
CCS fournit un éditeur intégré qui permet la création des fichiers sources. Une fenêtre
d'éditeur apparaît en choisissant l'élément de menu « File → New File ». Le nom du
fichier sera : initmem.asm pour notre exemple puis écrivons le code suivant dans cette
fenêtre d'éditeur :
.sect ".mydata"
.short 0
.short 7
.short 10
.short 7
.short 0
.short -7
.short -10
.short -7
.short 0
.short 7
Ce code déclare 10 valeurs numériques en utilisant la directive « .short ». La directive
« .sect » spécifie que les 10 valeurs doivent résider dans une section de la mémoire du
DSP appelée « .mydata »; les adresses physiques qui correspondent à cette section seront
définies plus tard dans un fichier d'édition de liens « .cmd ». Vous sauvegardez le
fichier source créé en choisissant l'élément de menu « File→Save ».
4
IV. Créer un fichier de commande pour l’éditeur de liens
En plus des fichiers sources, un fichier de commande d'éditeur de liens «Linker» doit
être créé pour générer un fichier exécutable et pour se conformer aux spécifications de
mémoire du DSP et de la cible sur laquelle le fichier exécutable va être compilé. Un
fichier de commande d'éditeur de liens «Linker» peut être créé en utilisant la même
procédure que pour le fichier précédant (en choisissant « File→New File »). Pour
l’exemple en cours, nous allons considérer le fichier de commande suivant créé sous le
nom de : lab1.cmd
MEMORY
{
}
IVECS:
IRAM:
SDRAM:
MYDATA:
FLASH:
org
org
org
org
org
=
=
=
=
=
0h,
0x00000220,
0x80000000,
0x80010000,
0x90000000,
len =
0x220
len = 0x00002FDE0
len = 0x00010000
len = 0x00100000
len = 0x00020000
/*vector section*/
/*internal memory*/
/*external memory*/
/*external memory*/
/*flash memory*/
SECTIONS
{
}
.vectors
.text
.bss
.cinit
.stack
.sysmem
.const
.switch
.far
.cio
.mydata
:> IVECS
:> IRAM
:> IRAM
:> IRAM
:> IRAM
:> SDRAM
:> IRAM
:> IRAM
:> SDRAM
:> SDRAM
:> MYDATA
Puisque notre objectif est de placer les valeurs définies dans le fichier initmem.asm
dans la mémoire, un espace qui ne sera pas recouvert par le compilateur devrait
être choisi. Les espaces de données externes SDRAM ou MYDATA peuvent être
utilisés à cette fin. Commençons par assembler les données à l'adresse de mémoire
0x80010000 (0x dénote l'hexadécimal), située en mémoire externe. Pour faire ceci,
assignez la section nommée « .mydata » à MYDATA en ajoutant « .mydata :>
MYDATA » dans la partie SECTIONS du fichier de commande, comme déjà indiqué
dans le programme ci-dessus. La fenêtre d'édition sera sauvegardée dans le fichier de
commande d'éditeur de liens «Linker» en choisissant « File→Save ».
V. Ajout de fichiers de support au projet
En plus des fichiers existants « initmem.asm » et « lab1.cmd », des fichiers
supports pour le TMS320C6713et la cible DSK6713 devront être inclus au projet sous
forme de librairie et répertoire « Include» . Ces fichiers seront implantés au projet dans
les prochains laboratoires.
5
VI. La mise au point du projet
Pour la mise au point, nous utilisons un programme interpréteur de commandes
interactif vide. Créez un fichier source en C qu’on appellera « main.c », écrivez les lignes
suivantes.
#include <stdio.h>
void main()
{
printf(“BEGIN\n”);
printf(“END\n”);
}
Après avoir ajouté tous les fichiers sources, fichier de commande et fichier de
bibliothèque au projet, vous pouvez construire le projet et créer un fichier exécutable
pour le DSP-cible. Pour cela, choisissez l'élément de menu «Project→Build Active
Project». Cette fonction permet au CCS de compiler, assembler, et joindre tous les
fichiers dans le projet.
Si le processus de construction est complété sans erreur, le fichier exécutable
«lab1.out» est produit. Il est également possible de compléter cette opération par
incréments; c'est-à-dire en recompilant ou en assemblant seulement des fichiers changés
depuis la dernière construction, en choisissant l'élément de menu « Project→Rebuild
Active Project ».
Bien que CCS fournisse des options par défaut, ces options peuvent être changées en
choisissant « Project→Properties ». Par exemple, pour changer le nom du fichier
exécutable en « test.out », choisissez « Project→Properties», et cliquez sur « C/C++
Build → C6000 Linker Basic Options » et parmi les options de construction; taper alors
« test.out » dans la zone «Specify output file name ».
6
VII. Le suivi de l’exécution (mode Debug)
Une fois que le processus de construction est complété sans aucune erreur, le
programme peut être chargé et exécuté sur la c a r t e D S P cible ou un simulateur.
Pour l’installation sur la carte cible DSK TMS320C6713 :
1. Cliquer s ur « Target→New Target Configuration… ».
2. Entrer le nom de la cible dans le champs «File name » par exemple DSK6713.ccmxl
et cocher «Use shared location» suivi de «Finish».
3. Sélectionner la cible Spectrum Digital DSK-EVM eZdsp onboard USB emulator
dans la fenêtre «Connection», cocher le DSK6713 dans la fenêtre «Device» et
terminer en sauvegardant la configuration avec «Save». La carte DSP cible
«DSK6713.ccmxl» sera sélectionnée automatiquement par défaut pour tous les
nouveaux projets.
7
8
Pour télécharger et émuler le programme sur la carte DSP cible, faire les étapes suivantes :
1. Choisissez « Target→Lauch TI Debugger ». Code composer ouvrira une page avec la
perspective du mode «Debug».
2. Choisissez « Target→Connect Target » pour le branchement de la carte cible DSK
6713.
3. Choisissez « Target→Load Program… » pour transférer le programme compilé (Ex :
Lab1.out) vers la cible.
Pour revenir en perspective d’édition C/C++, terminer la session «Debug» en
choisissant « Target→Terminate All » ou encore en cliquant sur le carré rouge du menu.
Pour exécuter le programme, choisissez l'élément « Target→Run » pour un mode
continu et les éléments« Target→Step… » pour le mode étape par étape. Ces
commandes sont aussi disponibles sous forme d’icônes sur la ligne de menu rapide. Lors
de l’exécution «Run», vous devriez voir apparaître « BEGIN » et « END » dans la
fenêtre console « Stdout » (en bas de l’écran).
9
Maintenant, allons vérifier si l’ensemble des valeurs est assemblé dans l'emplacement
de mémoire indiqué. CCS permet de visualiser le contenu de la mémoire à un
emplacement spécifique. Pour visualiser le contenu de la mémoire à l’adresse
0x80010000, choisissez « View→Memory » à partir du menu. La fenêtre de dialogue
«Memory » permet de spécifier divers attributs d’affichage de la fenêtre. Allez à la zone
« Adress Text », écrivez 0x80010000 et sélectionnez « 16bit Signed Integer » dans le
champ du format. D’autres options sont disponibles à partir de la barre menu pour
sauvegarder ou charger des données d’une plage mémoire à partir d’un fichier du PC et
remplir une plage mémoire avec une valeur prédéterminée (voir Help).
VII. L’outil d’affichage graphique
Un affichage graphique des données fournit souvent un meilleur aperçu du
comportement d'un programme. CCS fournit une interface d'analyse de signal pour
surveiller un signal ou ses données. Commençons par afficher le choix de valeurs à
l’adresse 0x80010000 comme un signal ou un graphique de temps. Pour ce faire,
choisissez « Tool→Graph→Single Time » pour visualiser la fenêtre de propriété du
graphique. Allez au «Start Address Field », cliquez dessus, puis tapez 0x80010000.
Ensuite, allez à «Acquisition Buffer Size » et «Display Data Size », cliquez dessus et
écrivez " 10".
Finalement, cliquez sur «DSP Data Type», choisissez «16-bit Signed Integer» à
partir de la liste déroulante, et cliquez sur OK. Alors, une fenêtre du graphique
apparaîtra avec les propriétés choisies comme illustré ci-dessous.
10
Vous pouvez modifier n'importe lequel de ces paramètres à partir de la fenêtre
graphique en cliquant sur le bouton à droite de la souris, ensuite choisissez
«Properties», et ajustez comme voulu. Notez que les propriétés peuvent être mises à
jour à tout moment pendant le procédé de mise au point.
VIII. L’usage d’un pointeur pour accéder aux données
Pour assigner un pointeur au début de l'espace mémoire assemblé, l'adresse de la
mémoire doit être saisie directement par ce pointeur. Le code suivant peut être employé
pour assigner un pointeur au début des valeurs et parcourir celles-ci pour imprimer
chacune d’elles sur la console « Stdout »:
#include <stdio.h>
void main()
{
int i;
short *point;
point = (short *) 0x80010000;
printf ("BEGIN\n");
for (i = 0; i < 10; i++)
printf ("[%d]%d\n",i,point[i]);
printf ("END\n");
}
Au lieu de créer un nouveau fichier source, nous pouvons modifier le fichier «main.c»
existant en double cliquant sur le fichier «main.c» dans le panneau de configuration
du projet. Cette action apportera vers le haut de l’écran le fichier source « main.c »,
et alors vous pouvez le modifier à partir de cette fenêtre et reconstruisez-le après.
Avant d'exécuter le fichier exécutable, assurez-vous d’avoir rechargé le fichier
lab1.out. En exécutant ce fichier, vous devriez pouvoir voir les valeurs dans la
fenêtre console «Stdout ».
11
IX. Les points d’arrêt
Durant le développement ou le test des programmes, on doit souvent contrôler
la valeur d'une variable pendant l'exécution du programme. Ceci peut être réalisé en
utilisant des points d'arrêt (BREAKPOINT) et des « Watch Windows ».
Pour visualiser les valeurs du pointeur dans « main.c » avant et après l'assignation de
celui-ci, il faut redémarrer le programme «Target→Restart » dans le mode «Debug» et
ouvrir « main.c ». Ensuite, mettre votre curseur au début la ligne qui indique « point =
(short *) 0x80010000 » et double cliquez pour placer un point d'arrêt. Ensuite,
choisissez « View→Watch » à partir de la barre de menu pour ouvrir un « Watch
Window ».
Pour ajouter une nouvelle expression dans cette fenêtre, cliquez par-dessus cette
fenêtre «Name» et tapez « point » (ou toute expression que vous voulez examiner).
Ensuite, choisissez « Target→Run ». Le programme s'arrête au point d'arrêt et la valeur
du pointeur apparaît sur la fenêtre « Watch ». Ceci est la valeur avant que le pointeur ne
soit placé à 0x80010000. En appuyant sur F6 «Step Over», vous faites un pas au-dessus
de la ligne, vous devriez pouvoir voir la valeur 0x80010000 dans la fenêtre «Watch ».
X. Les fonctions
Pour ajouter une simple fonction en C qui fait la somme des valeurs, nous pouvons
simplement passer le pointeur par l'alignement de valeur et avoir un retour de
nombre entier. Pour l'instant, considérant que nous n'utilisons pas l'assembleur, ce qui
nous concerne n'est pas comment les variables sont additionnées, mais plutôt
combien de temps i l f a u t pour exécuter l'opération.
La fonction simple suivante peut être employée pour additionner les valeurs et pour
renvoyer le résultat:
#include <stdio.h>
int ret_sum (const short* array, int N)
{
int count, sum;
sum = 0;
for (count = 0; count < N; count++ )
sum += array [count];
return (sum);
}
void main()
{
int i, ret;
short *point;
point = (short *) 0x80010000;
printf ("BEGIN\n");
for (i = 0; i < 10; i++)
printf ("[%d] %d\n", i , point[i]);
ret = ret_sum (point , 10);
printf ("Sum = %d\n", ret );
printf ("END\n");
}
12
XI. La mesure de performance (évaluation du temps d’exécution)
En tant qu'élément du procédé de mise au point, il est normalement nécessaire de
chronométrer l'application du programme. Dans cet exemple, nous allons déterminer
combien de temps prend la fonction « ret_sum » pour s’exécuter.
La mesure de performance est plus précise lorsque le simulateur du C6713 est utilisé
comme cible. Le simulateur cible est configuré en créant un fichier de configuration
dans le projet en mode édition C/C++ comme le «DSK6713.ccxml».
1. Créer le fichier de la cible «Simul6713.ccxml» dans votre projet «
Target→New Target Configuration…»
2. Sélectionner Texas Instrument Simulator dans la fenêtre «Connection», cocher
le «C6713 Device Cycle Accurate Simulator, Little Endian» dans la fenêtre
«Device» et terminer en sauvegardant la configuration avec «Save».
3. Dans l’arborescence des fichiers à gauche de l’écran, assurez-vous que
l’expression « [Active] » apparaisse à droite du fichier cible du simulateur.
4. Télécharger le programme dans le simulateur «Target→Debug Active
Project».
5. Pour chronométrer la fonction « ret_sum » facilement, il s’agit d’activer
l’horloge «Target→Clock→Enable» et régler les paramètres «Count:
cycle.CPU» et «Reset Option: Auto» .
Une Horloge avec un compte s’affiche au bas de l’écran.
6. Insérer un point d’arrêt«BreakPoint» en double-cliquant sur la ligne du
programme « ret = ret_sum (point, 10); » et un autre point d’arrêt à la ligne
suivante «printf("Sum=%d\n",ret);».
13
7. Exécuter le programme avec «Run», le programme s’arrêtera au premier point
d’arrêt.
8. Continuer le programme avec «Run», jusqu’au second point d’arrêt.
9. Prendre en note le compte de l’horloge (ex: 307)
L’outil «Profile» est aussi disponible pour mesurer la performance du programme.
1. Désactiver les points d’arrêt en double cliquant sur le point. Recharger le
programme « Target→Debug Active Project ».
2. Choisissez « Tools→Profile→Setup Profile Data Collection ». La fenêtre
«Profile Setup» s’ouvrira, cliquer sur «Activate» si le profile n’est pas déjà
actif.
3. Cocher «Profile all Functions for Total Cycles», ouvrir «Properties» pour
cocher cycle→CPU→true et sauvegarder «Configuration 1» en cliquant sur
«Save».
14
4. Exécuter le programme avec «Run». Enfin aller à « Tools→Profile→View
Function Profile Results » pour visualiser le rapport du profil. La fenêtre
cycles du menu doit être sélectionnée à cycle.CPU pour avoir une lecture
équivalente à l’autre méthode.
15
TRAVAIL DEMANDÉ
1. Utiliser CCS pour écrire un programme qui calcule le produit scalaire de deux
vecteurs, chacun contenant trois nombres entiers, et affiche le résultat sur la sortie
« Stdout ». Les vecteurs doivent être définis dans un fichier d’entête avec les
valeurs [3,6,9] et [2,4,6].
2. Modifier votre programme de manière à ce que la fonction main et la fonction
de multiplication résident dans des fichiers séparés.
3. Écrire un programme qui génère deux périodes d’un sinus à raison de 256 points
par cycle et qui les emmagasine en mémoire.
a. Utiliser l’utilitaire d’affichage graphique pour vérifier que le signal
emmagasiné est bon.
b. Reprendre l’affichage graphique en utilisant l’option Transformée de Fourier.
c. Faire varier la taille du tampon (de 256 à 512) et expliquer la courbe obtenue
dans chaque cas.
Note : Vous devez fournir un rapport qui explique votre démarche, incluant tous les
codes et les graphiques générés et qui répond à toutes les questions. Votre rapport doit
aussi contenir une introduction et une conclusion.
16