TP de programmation DSP pour le traitement d`image IF4

Transcription

TP de programmation DSP pour le traitement d`image IF4
TP de programmation DSP pour le traitement d'image
IF4-ARCH 2006-2007
1
Introduction .............................................................................................................................1
1.1
Objectifs ..........................................................................................................................1
1.2
Description de la plate-forme d'expérimentation IEK6711 .......................................2
1.3
Première séance : prise en main de code composer studio .........................................4
1.4
Préparation .....................................................................................................................4
2
Traitement d'images ................................................................................................................4
2.1
Chargement du projet....................................................................................................4
2.2
Compilation, exécution : ................................................................................................6
2.3
Traitement d'images ......................................................................................................6
2.3.1
Négatif :....................................................................................................................6
2.3.2
Seuillage : .................................................................................................................6
2.3.3
Convolutions ............................................................................................................6
2.4
Mesure des performances ..............................................................................................7
2.4.1
Outils de mesures .....................................................................................................8
2.4.2
Optimisation .............................................................................................................8
2.5
3
Comparaison avec des fonctions optimisées en assembleur .......................................8
Utilisations des DMAs .............................................................................................................8
1 Introduction
1.1 Objectifs
Le TP sur carte IEKC6x11 s'étend sur 3 séances de 2 heures, 3 heures et 3 heures. Vous aurez
l'occasion durant ces séances d'expérimenter :
•
•
•
l'utilisation d'une carte DSP pour le traitement d'image basée sur le processeur Texas
Instruments TMS320C6211 ou TMS320C6711,
d'implanter sur cette plate-forme différents algorithmes de traitement d'images,
de mesurer la durée d'exécution (profiling) et optimiser l'implantation,
IF4-ARCH /T. Grandpierre
1
•
d'étudier le contrôleur DMA du DSP C6211 afin d'effectuer des opérations mémoires
simples.
ATTENTION NE JAMAIS CONNECTER OU DÉCONNECTER L'ALIMENTATION OU LE CONNECTEUR
JTAG OU FAIRE UN RESET DE LA CARTE TANT QUE CODE COMPOSER EST LANCE :
IL Y A RISQUE DE DESTRUCTION DU DSP
AVANT CES MANIPULATIONS VOUS DEVEZ TOUJOURS VERIFIER DANS LE GESTIONNAIRE DE
PROGRAMME QUE CCS_APP.EXE N'EST PAS EN COURS D'EXECUTION
(le raccourcis KILL_CCS vous permet d'ouvrir un gestionnaire de programme)
1.2 Description de la plate-forme d'expérimentation IEK6711
La carte IEKC6711 peut être connectée à 4 sources vidéo analogiques en entrées et possède une
sortie vidéo analogique. Elle repose sur un DSP Texas Instruments TMS320C6711, un FPGA
50000 cellules et plusieurs bancs mémoires RAM (Cf. figure ci-dessous).
Cette carte peut fonctionner, selon la configuration du FPGA, soit en acquisition d'images, soit en
restitution (la votre sera dans cette configuration).
En mode acquisition (qui n'est donc pas le mode de votre carte) le signal d'une des 4 entrées
analogiques est convertit en un flot numérique par le convertisseur A/N correspondant. Ce flot est
ensuite stocké dans la RAM du FPGA par le FPGA. Une fois qu'une image entière est stockée
dans la RAM FPGA il faut la transférer dans celle du DSP pour qu'il puisse y faire des
traitements (filtrage, compression, etc). Pour cela le FPGA et le DSP sont connectés ensembles
par une mémoire RAM double ports (DPRAM) de 16Ko. Cette taille étant insuffisante pour
transférer une image entière en une fois ce sont des blocs de 8 lignes qui sont échangés. Côté
DSP, on utilise plutôt le DMA pour effectuer rapidement les copies des blocs de 8 lignes vers la
RAM du DSP sans gaspiller de puissance CPU.
En mode restitution, celui de votre carte, le processus est totalement symétrique : l'image à
afficher est supposée d'abord contenue dans la RAM du DSP ou sa RAM extérieure. Il s'agit donc
de la découper en blocs de 8 lignes pour la transférer dans la RAM du FPGA par le biais de la
petite DPRAM. Quand une image entière a été transférée, le FPGA la transmet à l'unique
convertisseur numérique-analogique qui est lui même connecté au moniteur vidéo.
Comme tous les processeurs récents, le DSP est équipé d'une interface JTAG qui permet, depuis
Code Composer Studio exécuté sur un PC, de contrôler très précisément le DSP : mis en place de
points d'arrêts, lecture-écriture des registres internes, accès en lecture-écriture à tous l'espace
mémoire. Cette dernière fonctionnalité sera d'ailleurs utilisée pour charger la mémoire du DSP
avec un programme et des données.
IF4-ARCH /T. Grandpierre
2
IF4-ARCH /T. Grandpierre
3
1.3 Première séance : prise en main de code composer studio
Il s'agit pour commencer de prendre en main l'outils de développement et d'explorer ses
capacités. Pour cela vous exécuterez la partie "Developing a Simple Program " du tutorial intégré
à code composer studio (menu "Help" "Tutorial" "Code Composer Studio IDE")
1.4 Préparation
Avant de commencer il faut récuperer le fichier compressé TP_I4_DSP_2006.zip que vous
trouverez sur http://www.esiee.fr/~grandpit/ pour le copier et le décompresser dans le répertoire
c:\temp de votre machine. Vous n'oublierez pas de nettoyer ce répertoire à la fin de chaque TP
après en avoir effectué une sauvegarde sur votre compte.
Note : il n'est pas possible à code composer d'accéder directement à votre compte c'est pourquoi
il faut toujours travailler sur le répertoire local temp.
Une fois décompresser vous obtiendrez les répertoires suivants :
•
•
•
•
•
•
2
Affiche_image : ce répertoire contient le projet "display" (faire menu "Project" "open")
vous donnant le programme de base permettant d'initialiser la carte et afficher une image
(voir description en §2),
Exemple_dma : ce répertoire contient le projet "dma-transfert" vous donnant un exemple
de base de programmation de l'EDMA à l'aide de la CSL (voir description en §3),
Exemple_dma_timer : idem précédent mais avec utilisation du timer pour chronométrage,
Test : ce répertoire contient des fichiers binaires déjà compilés (fichiers "afficheimage.out", "affiche-vidéo.out") afin de tester rapidement la carte quand vous avez un
doute sur son fonctionnement. Il suffit, après avoir correctement ré-initialisé la carte si
nécessaire, de charger (menu "File" "Load Program" ) puis exécuter ces programmes
(menu " Project" "run") en ayant préalablement connecté et allumé le téléviseur qui
doit être sur le mode A/V),
MaintenanceIEK67 : ne pas exécuter les programmes contenu dans ce répertoire. Ils
servent principalement à configurer le FPGA de la carte en mode acquisition ou
restitution,
docs : documents techniques sur la programmation du DSP C6x et de l'EDMA.
Traitement d'images
2.1 Chargement du projet
1. Lancer CCS. Pour s'exécuter CCS requière des privilèges spéciaux, il s'exécute
donc sous les droits d'un utilisateur différents : login=ccs, password=ccs
2. Si le logiciel ouvre la fenêtre suivante :
IF4-ARCH /T. Grandpierre
4
il faut alors sélectionner la cible "XDS510 emulator "
3. Charger le projet "display" se trouvant dans le répertoire
``c:/temp/affiche_image/display.pjt''
Ce projet contient les fichiers suivants :
définitions de fonctions
pour la communication
avec le FPGA
initialisation du tableau avec l'image
programme principal
configuration mémoire
Dans le cadre de ce TP nous nous intéresserons uniquement au fichier maindemo.c
Le cœur de ce module est la fonction C "main( )" dont le squelette est le suivant (ouvrir le source
du fichier maindemo.c à l'aide du navigateur dans la partie de gauche de Code Composer Studio)
:
../..
#define WIDTH 352
#define HEIGHT 280
IF4-ARCH /T. Grandpierre
5
const far unsigned char ImageRef[] = { #include "image.bmp.Y.txt"}; //init image
void main( void ) {
CSL_init(); //init de la librairie CSL utilisée pour faciliter la config. de l'EDMA
board_init(); // init la carte (déclaré dans init6211.c)
image_display(ImageRef); //envoie au FPGA le tableau donné en argument afin qu'il
}
// l'affiche sur la sortie vidéo/TV (déclaré dans Init6211.c)
Remarque : pour ce TP, nous n'utiliserons qu'une sous-partie des fonctionnalités de la carte
IEKC6211 : images CIF (352x288) en niveau de gris. La carte est toutefois capable de travailler
aussi en plein format vidéo (720x576) et en couleur (YUV422).
Le fichier ``image.bmp.Y.txt'' contient la séquence de tous les pixels qui forment l'image encodée
sous forme ASCII. Ce fichier est créé avec l'utilitaire de conversion rgbbmp_to-ytxt (dans le
même répertoire) qui prend en entrée sur la ligne de commande le nom d'un fichier BMP au
format RGB 24 bits et qui crée un fichier texte comportant la composante Y correspondante.
2.2 Compilation, exécution :
1. Recompiler le programme (menu "Project" "Rebuild all")
2. Avant chaque chargement il est conseillé de faire un "reset" logiciel de la carte : menu
"GEL" reset & clear breakpoint
3. Charger le programme : menu "File" "load program"
4. Exécuter le programme: menu "Debug" "run"
Il doit s'ensuivre l'affichage des messages (printf) suivants dans CCS :
• Load FPGA
• Load FPGA done
• Affichage de l'image
2.3 Traitement d'images
2.3.1 Négatif :
Les pixels sont représentés par des entiers codés sur un octet et donc compris entre 0 et 255. Il
s'agit d'écrire une fonction negatif( image_source, &image_destination ) qui "inverse" la valeur
des pixels de l'image_source de façon à avoir une image en négatif dans image_destination.
2.3.2 Seuillage :
Il s'agit d'écrire une fonction seuillage(seuil, & image_source, &image_destination) qui compare
chaque pixel à la valeur du seuil et qui remplace la valeur du pixel par 0 si sa valeur est inférieure
au seuil ou par 255 si supérieure ou égale. Les arguments image_source et image_destination
sont les adresses des images avant et après transformations.
2.3.3 Convolutions
Il s'agit d'implanter une convolution 3x3.
IF4-ARCH /T. Grandpierre
6
Rappel : la convolution d'une image source S de taille NxN avec une matrice MxM consiste à
calculer une nouvelle image D dont la valeur de chaque pixel Dij est une fonction de la valeur des
pixels voisins du pixel Sij.
Par exemple, si les coefficients de la matrice M sont (0,1,0) (1,0,1) (0,1,0), pour chaque pixel on
effectuera le traitement suivant :
Il faut penser à recadrer la valeur calculée pour chaque pixel afin qu'elle ne
dépasse pas la valeur maximum autorisée (255 dans notre cas).
Pour simplifier et ne pas ralentir le calcul lors de la gestion des bords de l'image, vous
n'appliquerez pas la matrice de convolution sur les pixels extérieur de l'image (1ere et dernière
lignes, 1ere et dernière colonne) et vous la coderez en "dur".
La fonction à écrire aura donc le prototype suivant :
void convol( unsigned char *pImageSource, unsigned char *pImageDest)
{
// coder la fonction
}
Après avoir testé le sobel horizontal seul (-1 0 1) (-2 0 2) (-1 0 1), vous implanterez le sobel
horizontal et le sobel vertical (-1 –2 –1) (0 0 0) (1 2 1) puis le calcul du module pour affichage
des contours de l'image.
2.4 Mesure des performances
IF4-ARCH /T. Grandpierre
7
2.4.1 Outils de mesures
Pour mesurer les performances, vous pouvez utiliser l'outil de profiling intégré à
CodeComposerStudio. Pour prendre rapidement en main cet outil vous pouvez utiliser le tutorial
en ligne que vous obtiendrez dans le menu "Help" "Tutorial" "Code composer IDE"
"Profiling code exécution".
Cependant, cette méthode à l'inconvénient de ralentir beaucoup l'application. Je vous propose
donc d'utiliser le timer matériel intégré au processeur. Pour cela vous utiliserez un exemple de
code qui configure, lance et lit le timer dans le projet fournit "DMA avec timer". Attention, le
timer est incrémenté tous les 4 cycles d'horloges.
2.4.2 Optimisation
Il s'agit maintenant d'optimiser l'exécution. A l'aide des méthodes étudiées
lors du TD Optimisation, optimiser cette fonction. Analysez l'amélioration en
étudiant le source assembleur généré par CCS. Mesurez les performances et
notez les résultats (ramenez en cycles par pixel et en pourcentage d'accélération)
A chaque étape d'optimisation, vérifiez par l'affichage que le résultat obtenu est toujours celui
attendu.
2.5 Comparaison avec des fonctions optimisées en assembleur
Le document [Spru400.pdf] ``TMS320C62x Image/Video Library Programmer's décrit
l'utilisation de la bibliothèque IMGLIB de fonctions de traitement d'images optimisées en
assembleur. Étudier la liste des fonctions fournies et plus particulièrement le sobel.
• Estimez le nombre de cycles qu'elle devrait prendre pour son exécution à
partir de la documentation,
• implémentez la fonction de traitement à l'aide de la bibliothèque de Texas Instruments,
• vérifiez que cela fonctionne et confirmez les performances estimées par la mesure,
• comparez avec votre implémentation du sobel (en cycles par pixel et en pourcentage
d'accélération).
3 Utilisations des DMAs
Comme cela a été abordé dans le cours de présentation de l'IEKC6211, les DMA sur DSP sont
très utilisées car leurs possibilités sont extrêmement puissantes.
Vous allez programmer le contrôleur EDMA du DSP TMS320C6711 pour effectuer des
opérations simples en créant des fonctions que vous pourrez intercaler dans la chaîne de
chargement et de visualisation.
Vous devrez implémenter les fonctions suivantes :
• recopie simple (identique à memcpy)
IF4-ARCH /T. Grandpierre
8
•
•
•
•
retournement horizontal de l'image
retournement vertical de l'image
rotation de 180° de l'image
rotation de 90° d'une portion d'image
Pour implémentez ces fonctions, vous utiliserez la bibliothèque CSL fournie
avec CodeComposerStudio afin de programmer le DMA. Un exemple de programmation EDMA
vous est donné dans le répertoire "c:\temp\exemple-dma.
void main() {
/* Structures utilisées pour transfert DMA */
EDMA_Handle hEdma;
EDMA_Config edmaCfg;
int tcc;
/*--------------fin des déclarations--------------------------*/
memset(&ImageTmp,0,IMAGE_WIDTH*IMAGE_HEIGHT); //mise à zéro de ImageTmp
/*Initialisation pour transfert DMA :*/
CSL_init();
EDMA_resetAll();
// initialize the board and configue to the right video format
board_init();
//Préparation d'un transfer DMA
hEdma=EDMA_open(EDMA_CHA_ANY,EDMA_OPEN_RESET);
tcc=EDMA_intAlloc(-1); //Transfert complete code, -1<=>choix automatique
/*configuration des structure pour le DMA*/
edmaCfg.src = (Uint32) &ImageRef; /* source address */
edmaCfg.cnt = IMAGE_WIDTH*IMAGE_HEIGHT/4; /* count */
edmaCfg.dst = (Uint32) &ImageTmp; /* destination address */
edmaCfg.idx = 1; /*idx */
edmaCfg.rld = 0x00000000 ; /* reload */
edmaCfg.opt=EDMA_OPT_RMK(EDMA_OPT_PRI_LOW,
EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_YES,
EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_YES,
EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(tcc),
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_NO);
EDMA_config(hEdma,&edmaCfg); //Configuration du DMA
EDMA_setChannel(hEdma);
//Démarrage du transfert
while (!EDMA_intTest(tcc)) ; //attendre la fin du transfert=attendre valeur tcc)
/* Display Luminance only*/
image_display(ImageTmp); }
Pour déterminer les valeurs de configurations de l'EDMA vous pourrez utilisez les documents
suivants (accessibles depuis la rubrique Help de CCS ou dans le répertoire
c:\temp\TP_I4_DSP_2004\docs) :
• [Spru190.pdf] ``TMS320C6000 Peripherals Reference Guide'' : ce document décrit le
fonctionnement interne du DSP, notamment le contrôleur EDMA/QDMA (chap. 6 et
Annexe A),
• [Spru401.pdf] ``TMS320C6000 Chip Support Library API User's Guide''
IF4-ARCH /T. Grandpierre
9
Remarque importante : les erreurs de programmation de l'EDMA se traduisent systématiquement
par un plantage de la carte. En effet, l'EDMA étant une entité autonome du processeur, toute
perte de synchronisation entraîne la nécessité de faire un reset (n'oubliez pas de quitter CCS et de
vérifier que le processus n'existe plus avant de faire ce reset).
Question : pourquoi la valeur "cnt" du DMA est-elle égale à IMAGE_WIDTH*IMAGE_HEIGHT/4 ?
IF4-ARCH /T. Grandpierre
10