Cours Les Instructions Dans Le Processeurs TMS320C6713
Cours Les Instructions Dans Le Processeurs TMS320C6713
Cours Les Instructions Dans Le Processeurs TMS320C6713
Département Electronique
Master Electronique des Systèmes Embarqués ESE
B.P. 32 El-Alia, Bab-Ezzouar, Alger 16111 Tél : 213 (0) 21 24 79 12 Poste 805
Fax : 213 (0) 21 24 71 87http://www.usthb.dz/
1. FORMAT DU CODE ASSEMBLEUR ........................................................................................... 1
1.1. Types d'instructions ....................................................................................................... 1
1.1.1 Add/Subtract/Multiply ................................................................................................. 1
1.1.2 Charger / stocker (Load/Store) ...................................................................................... 2
branche / déplacer (Branch/Move) : ...................................................................................... 2
2. DIRECTIVES D'ASSEMBLEUR (ASSEMBLER DIRECTIVES) ........................................................... 3
3. ASSEMBLEUR LINEAIRE (LINEAR ASSEMBLY) .......................................................................... 3
4. DECLARATION ASM EN C ....................................................................................................... 5
5. FONCTION D'ASSEMBLEUR C-CALLABLE ................................................................................. 5
6. CHEMINS CROISEES (Cross-Paths) .......................................................................................... 5
7. CONTRAINTES........................................................................................................................... 6
7.1 Contraintes de mémoire ...................................................................................................... 6
7.2 Contraintes de chemins croisés............................................................................................ 6
7.3 Contraintes de chargement / stockage (Load/Store)............................................................. 6
ENSEMBLE D'INSTRUCTIONS TMS320C6713 DSP
b) L’Instruction
SUB .S1 A1, 1, A1 ;subtract 1 from A1
Soustrait 1 de A1 pour le décrémenter à l'aide de l'unité .S.
c) Les instructions parallèles
MPY .M2 A7, B7, B6 ;multiply 16 LSBs of A7, B7 B6
|| MPYH .M1 A7, B7, A6 ;multiply 16MSBs of A7, B7 A6
Multiplie les 16 bits les plus faibles ou les moins significatifs (LSB) de A7 et B7 et place le
produit dans B6, en parallèle (simultanément dans le même paquet d'exécution) avec une
seconde instruction multipliant les 16 bits les plus significatifs (MSB) de A7 et B7 et place le
résultat dans A6. De cette manière, deux opérations MAC peuvent être exécutées au cours d’un
seul cycle d’instruction. Ceci peut être utilisé pour décomposer une somme de produits en deux
ensembles de somme de produits : un ensemble utilisant les 16 bits inférieurs pour fonctionner
sur le premier, le troisième, le cinquième,. . . numéro. et un autre ensemble utilisant les 16 bits
les plus élevés pour agir sur les deuxième, quatrième, sixième,. . . nombre. Notez que le symbole
parallèle ne figure pas dans la colonne 1.
1.1.2 Charger / stocker (Load/Store)
a) L'instruction
LDH .D2 *B2++,B7 ;load (B2) B7, increment B2
|| LDH .D1 *A2++,A7 ;load (A2) A7, increment A2
Charge (loads) dans B7 le demi-mot (half-word) (16 bits) dont l'adresse en mémoire est
spécifiée / indiquée par B2.Le registre B2 est alors incrémenté (postincrémenté) pour pointer
vers l'adresse de mémoire immédiatement supérieure. En parallèle, une autre instruction de
mode d'adressage indirect permet de charger dans A7 le contenu en mémoire dont l'adresse est
spécifiée par A2. Ensuite, A2 est incrémenté pour pointer vers l'adresse mémoire la plus haute
suivante.
L'instruction LDW charge un mot de 32 bits. Deux chemins utilisant .D1 et .D2 permettent le
chargement de données de la mémoire dans les registres A et B à l’aide de l’instruction LDW.
L’instruction à virgule flottante à double mot LDDW sur le C6713 peut charger simultanément
deux registres 32 bits dans la face A et deux registres 32 bits dans le côté B.
b) L'instruction
STW .D2 A1,*+A4[20] ;store A1 (A4) offset by 20
Stocke le mot A1 de 32 bits en mémoire dont l'adresse est spécifiée par A4 décalée de 20 mots
(32 bits) ou 80 octets. Le registre d’adresse A4 est pré-incrémenté avec offset, mais il n’est pas
modifié (deux signes plus sont utilisés si A4 doit être modifié).
branche / déplacer (Branch/Move) :
Le segment de code suivant illustre la création de branches et le transfert de données :
Loop MVKL .S1 x,A4 ;move 16 LSBs of x address A4
MVKH .S1 x,A4 ;move 16 MSBs of x address A4
.
.
.
ou d’un programme source en assembleur linéaire doit être assemblé pour produire un code
objet.
La programmation de code d’assembleur linéaire offre un compromis entre l’effort de codage
et l’efficacité du codage. L’optimiseur d’assembleur attribue l’unité fonctionnelle et le registre
à utiliser (facultatif à spécifier par l’utilisateur), recherche les instructions pouvant être
exécutées en parallèle et exécute le traitement en pipeline de logiciels à des fins d’optimisation.
Les instructions parallèles ne sont pas valides dans un programme d'assembleur linéaire. La
spécification de l'unité fonctionnelle est facultative dans un programme d'assembleur linéaire
ainsi que dans un programme d'assembleur.
Au cours des dernières années, l'optimiseur du compilateur C est devenu de plus en plus
efficace. Bien que le code C soit moins efficace (performances de rapidité) que le code
assembleur, il implique généralement moins d’effort de codage que le code assembleur, qui
peut être optimisé manuellement pour atteindre une efficacité de 100% mais avec un effort de
codage beaucoup plus important.
Il est intéressant de noter que la syntaxe du code d'assembleur C6x n'est pas aussi complexe
que celle des processeurs C2x / C5x ou C3x. Il est en réalité plus simple de "programmer" le
C6x en langage assembleur.
DBNZD AR4,LOOP
Décrémente (en raison du premier D) un compteur de boucle AR4 et branche (B) de manière
conditionnelle (si AR4 est différent de zéro) à l'adresse spécifiée par LOOP, avec un retard (en
raison du deuxième D). L'instruction de branchement avec retard permet effectivement à
l'instruction de branchement de s'exécuter en un seul cycle (en raison du traitement en pipeline).
Ces instructions multitâches ne sont pas disponibles sur les processeurs C62x et C67x, bien
qu'elles aient été récemment introduites sur le processeur C64x. En fait, les types d'instructions
C6x sont plus simples. Par exemple, des instructions séparées sont disponibles pour
décrémenter un compteur (avec une instruction SUB) et créer des branches. Les types
d'instructions plus simples se prêtent mieux à un compilateur C plus efficace.
Cependant, bien qu'il soit plus simple de programmer en code assembleur pour exécuter une
tâche souhaitée, cela ne signifie ni ne se traduit en un programme efficace codé en assembleur.
Il peut être relativement difficile d'optimiser manuellement un programme pour obtenir un
programme codé par un assembleur totalement efficace (et significatif).
Le code d'assembleur linéaire est un croisement entre assemblage et C. Il utilise la syntaxe des
instructions de code d'assembleur telles que ADD, SUB et MPY, mais avec des opérandes /
registres utilisés en C. Dans certains cas, cela constitue un bon compromis entre C et
l’assembleur.
Les directives d'assembleur linéaire incluent
.cproc
.endproc
Pour spécifier une procédure C-appelable (C-callable) ou une section de code à optimiser par
l’optimiseur d’assembleur. Une autre directive, .reg, est utilisée pour déclarer des variables et
utiliser des noms descriptifs pour les valeurs qui seront stockées dans des registres.
4. DECLARATION ASM EN C
Les instructions d'assembleur et les directives peuvent être incorporées dans un programme C
à l'aide de l'instruction asm. L'instruction asm peut fournir un accès à des fonctionnalités
matérielles qui ne peuvent pas être obtenues à l'aide du code C uniquement. La syntaxe est
asm (“assembly code”);
La ligne d'assembleur de code dans l'ensemble de guillemets a le même format qu'une
instruction d'assembleur valide. Notez que si l'instruction a une étiquette, le premier caractère
de l'étiquette doit commencer après le premier guillemet pour qu'il soit dans la colonne 1.
L'instruction assembleur doit être valide, car le compilateur ne recherche pas l'erreur de syntaxe
mais la copie directement. Dans le fichier de sortie compilé. Si l'instruction d'assembleur a une
erreur de syntaxe, l'assembleur le détectera.
Évitez d’utiliser des instructions asm dans un programme C, en particulier dans un programme
d’assembleur linéaire. En effet, l'optimiseur d'assembleur pourrait réorganiser des lignes de
code proches des instructions asm susceptibles de générer des résultats indésirables.
7. CONTRAINTES
7.1 Contraintes de mémoire
La mémoire interne est organisée selon différentes banques de mémoire afin que des
chargements et des stockages puissent avoir lieu simultanément. Étant donné que chaque
banque de mémoire est à port unique, un seul accès à chaque banque est effectué par cycle.
Deux accès à la mémoire par cycle peuvent être effectués s’ils n’accèdent pas à la même banque
de mémoire. Si plusieurs accès sont effectués sur la même banque de mémoire (dans le même
espace), le pipeline est bloqué. Cela entraîne l'exécution de cycles supplémentaires.
7.2 Contraintes de chemins croisés
Comme il y a un chemin croisé de part et d'autre des deux chemins de données, il peut y avoir
au plus deux instructions par cycle utilisant des chemins croisés. Le segment de code suivant
est valide car les deux chemins transversaux disponibles sont utilisés :
ADD .L1x A1,B1,A0
|| MPY .M2x A2,B2,B3
Alors que ce qui suit n'est pas valide, car un chemin croisé est utilisé pour les deux instructions :
ADD .L1x A1,B1,A0
|| MPY .M1x A2,B2,A3
Le x associé à l'unité fonctionnelle désigne un chemin croisé.
7.3 Contraintes de chargement / stockage (Load/Store)
Le registre d’adresses à utiliser doit se trouver du même côté que l’unité .D. Le segment de
code suivant est valide :
LDW .D1 *A1,A2
|| LDW .D2 *B1,B2
Alors que ce qui suit n'est pas valide :
LDW .D1 *A1,A2
|| LDW .D2 *A3,B2
De plus, le chargement et le stockage ne peuvent pas provenir du même fichier de registre. Un
chargement (ou stockage) utilisant un fichier de registre en parallèle avec un autre chargement
(ou stockage) doit utiliser un fichier de registre différent. Par exemple, le segment de code
suivant est valide :
LDW .D1 *A0,B1
|| STW .D2 A1,*B2
Ce qui suit est également valide :
LDW .D1 *A0,B1
|| LDW .D2 *B2,A1
Toutefois, les éléments suivants ne sont pas valides :
LDW .D1 *A0,A1
|| STW .D2 A2,*B2