Implémentation
sous DSP de la
technique de
transfert DMA
avec la logique
Ping Pong
Réalisé par :
Imen NASR
W i n C o m 2 0 1 0 - 2 0 1 1
2
Sommaire
1. Objectif 3
2. Spécification du transfert DMA 3
2.1. La notion DMA 3
2.2. Mise en place du transfert DMA 4
2.3. La logique « Ping Pong » 4
3. Implémentation de la solution 5
3.1. Mise en oeuvre du transfert DMA 5
3.1.1. La fonction SetUpDMA 5
3.1.2. La fonction DoDMA 6
3.1.3. La fonction WaitForDMADone 6
3.2. L'implémentation de la logique Ping Pong 7
Conclusion 9
1.
Objectif
On se propose d'implémenter sous Visual DSP la technique
de transfert DMA et ce en utilisant traitement en parallèle des
données. Ce transfert sera également basé sur la logique
Ping Pong.
2. Spécification du transfert DMA
Ce paragraphe à pour but de décortique le
problème et de spécifier les besoins techniques de la solution
à implémenter.
2.1. La notion DMA
DMA est l'acronyme anglais de Direct Memory Access ce qui veut
dire un accès direct à la mémoire. Il s'agit d'un
transfert direct et bidirectionnel de données via un contrôleur
adapté entre un périphérique et la mémoire
principale de la machine. Ce procédé ne fait pas intervenir le
processeur que pour initier et conclure le transfert à travers des
interruptions.
Ainsi le transfert DMA offre un moyen plus rapide pour
l'échange de blocs de données, entre la mémoire et le
périphérique en question ou entre deux blocs de mémoire,
que la méthode classique. En effet, cette dernière fait
intervenir le processeur dans le transfert de chaque octet ;
c'est-à-dire par la lecture, l'écriture, la vérification
de la fin de l'échange et l'incrémentation d'adresses en plus du
traitement des données transférées.
En ce qui concerne la technique DMA, un autre
périphérique spécialisé se charge du transfert,
à savoir le contrôleur DMA ou le DMAC, et le processeur n'a
qu'à s'occuper du traitement de données. Le processeur donne au
DMAC les informations concernant l'échange, c'est à dire
l'adresse de début du bloc en mémoire, la taille du bloc et le
sens de l'échange et autorise l'échange.
Il y a également une introduction de la notion de
priorité vu que la mémoire n'autorise qu'un seul accès par
cycle. En fait, n'ayant pas le pouvoir d'attendre aussi longtemps que le
processeur, le DMAC est plus prioritaire en accédant à la
mémoire que le processeur. Cette technique s'appelle le vol de cycle.
4
2.2. Mise en place du transfert DMA
On se propose de transférer des données à
partir d'un périphérique de stockage externe vers la
mémoire interne du DSP.
Trois fonctions interviennent dans le transfert DMA :
· La fonction SetUpDMA pour initier le transfert de
données.
· La fonction DoDMA pour exécuter ce transfert.
· La fonction WaitForDMADone pour synchroniser le transfert
de données par le DMAC et leur traitement par le DSP.
2.3. La logique « Ping Pong »
La technique Ping Pong ou la technique de double buffer
s'applique lorsqu'on dispose de données à traiter par bloc. On
peut citer par exemple le cas de la DCT ou la FFT appliquée à un
ensemble de N échantillons d'un signal donné. La figure suivante
illustre bien cette technique :
Ce schéma traite le cas de la FFT appliquée
à des blocs d'échantillons d'un signal. Les avantages d'une telle
technique sont la réduction des pertes de données, la cadence des
données est identique à l'entrée et à la sortie et
elle est efficace pour le traitement de données en temps réel.
3. Implémentation de la solution
Dans cette partie on se propose de mettre en place, sur un
processeur Blackfin 533, la technique de transfert DMA en se basant sur la
logique Ping Pong.
3.1. 0 isereQ r uvIerISurtIDQW-ItrD0 $
Comme l'on a expliqué précédemment, cette
technique de transfert est mise en place en utilisant les trois fonctions
SetUpDMA, DoDMA et WaitForDMADone.
3.1.1. La fonction SetUpDMA Ci-dessous le code source
de cette fonction :
Cette fonction prend comme paramétres adresse de la
mémoire source, l'adresse de la mémoire de destination et la
taille des données à transférer. Cette fonction permet
d'initier le transfert. Pour ce faire elle fait appel á des registres
particuliers :
· MDMAD0STARTADDR : un registre de 32 bits qui contient
l'adresse de destination.
· MDMAS0STARTADDR : un registre de 32 bits qui contient
l'adresse de la
source.
· MDMAD0XCOUNT : contient le nombre de colonne de la
mémoire de destination
· MDMAS0XCOUNT : contient le nombre de colonnes à
lire de l'espace mémoire source.
Une valeur de 0 dans XCOUNT correspond á 65.536
éléments.
· MDAMD0YCOUNT : contient le nombre de lignes la
mémoire de destination. Dans ce cas, chaque élément est
codé sur 4 cases mémoires consécutives (4 octets).
6
· MDMA_S0_Y_COUNT : contient le nombre de lignes de la
mémoire source.
· MDMA_D0_X_MODIFY : contient le pas d'augmentation dans
l'adresse de destination chaque fois que le chargement d'un
élément est effectué. Dans notre, le pas est égale
à 4 puisque chaque éléments est codé sur 4 octets.
Sa valeur est le décalage entre le dernier mot d'une « ligne »
et le premier mot de la prochaine «rangée»
· MDMA_S0_X_MODIFY : contient le pas
d'incrémentation dans l'adresse de la source.
3.1.2. La fonction DoDMA
Ci-dessous est le code source de cette fonction :
Cette fonction exécute l'échange de
données via le DMAC. Elle utilise deux registres à 16 bits,
MDMA_S0_CONFIG et MDMA_D0_CONFIG, pour configurer les paramètres DMA et
les modes d'opérations.
· MDMA_S0_CONFIG : Pour lancer la lecture à
partir de la source. Ce registre prend la valeur décimale 0x0009. En
effet, le premier bit est fixé à 1 pour activer le DMA. Le
deuxième bit est fixé à 0 pour charger le mode lecture.
Quant aux deux bits qui suivent, ils indiquent la longueur de la donnée
à transférer, dans ce cas égaux à 10, qui signifie
une longueur de 32 bits. On obtient alors 1001 ? 0x0009 en hexadécimal.
Le mode 1D est activé alors le cinquième bit est fixé
à 0.
· MDMA_DO_CONFIG : Pour lancer le mode écriture
dans la mémoire de destination. D'une manière analogue à
ce qui a été expliqué ci-dessus ce registre prend la
valeur 1011 pour activer et exécuter l'écriture dans la
destination ce qui donne une valeur de 0x000b en hexadécimal.
3.1.3. La fonction WaitForDMADone
Cette fonction a pour objectif de synchroniser le transfert DMA
et le traitement au niveau du processeur.
Extern_Buff
Intern_Buff1
Intern_Buff2
Output_Buf
Traitement
Ci-dessous est le code source de cette fonction :
Il arrive parfois que le processeur termine le traitement avec
que la procédure d'échange DMA n'arrive à sa fin. Dans ce
cas il faut occuper le processeur à vérifier si le transfert est
terminé et ce en examinant le troisième bit du registre
MDMA_D0_IRQ_STATUS. Il est mis à 0 si le canal DMA est en repos et
à 1 sinon.
3.2. L'implémentation de la logique Ping Pong
Le but est de mettre en place un traitement de test qui emploie
la technique Ping Pong.
8
Selon le schéma précédent, le transfert
DMA se fait à partir d'une source externe « Extern_Buf » vers
deux buffers internes « Intern_Buf1 » et « Intern_Buf2 ». A
chaque fois que l'un des buffers est rempli, le processeur utilise les
données qui y sont stockées pour effectuer son traitement et
envoyer la sortie vers autre buffer externe. En appliquant la logique Ping
Pong, le canal DMA transfère une partie des données vers le
premier buffer, ces dernières sont traitées ensuite par le
processeur. Parallèlement à ce traitement, le canal DMA effectue
un deuxième transfert de données vers le deuxième buffer
qui seront exploitées par le processeur. Cette procédure se
répète jusqu'à ce que le transfert total soit
terminé.
Afin de ne pas tomber dans le cas où le processeur ait
terminé sont traitement de l'un des buffers et demande l'accès
vers l'autre avant que le transfert vers celui-ci ne soit achevé on
utilise la fonction WaitForDMADone pour assurer la synchronisation.
Ci-dessous le code source complet de l'implémentation du
transfert DMA avec la technique Ping Pong.
Conclusion
Le transfert DMA combiné avec la logique Ping Pong
demeure une solution efficace pour le traitement en parallèle de
données. Cette technique est employée en traitement de signal
comme dans le cas de calcul de la FFT et la DCT. Elle a certains avantages dont
on peut citer la réduction des pertes de données,
l'équilibrage de la cadence des données en entrée et en
sortie et l'efficacité en matière de traitement en temps
réel.
|