Séquenceur de programme
Transcription
Séquenceur de programme
Haute Ecole d’Ingénierie et de Gestion du Canton du Vaud DSP architecture et applications _________ Chapitre 5 SÉQUENCEUR DE PROGRAMME Sauts Boucles Appel de sous programmes Interruptions (cœur du DSP et périphériques) Mémoire cache DAG1 4 X 4 X 16 DAG2 4 X 4 X 16 PROGRAM SEQUENCER BLOCK3 CACHE 64X24-BIT BLOCK0 BLOCK1 DATA ADDRESS 24 BIT DATA ADDRESS 24 BIT ADDRESS 16 BIT DATA DATA ADDRESS 16 BIT ADSP-219X DSP CORE BLOCK2 INTERNAL MEMORY FOUR INDEPENDENT BLOCKS JTAG TEST AND EMULATION 6 EXTERNAL PORT PM ADDRESSBUS I/O ADDRESS 24 DM ADDRESSBUS DMA CONNECT DMA ADDRESS PM DATA BUS DM DATA BUS DATA REGISTER FILE I/O DATA INPUT REGISTERS RESULT REGISTERS 16 X 16-BIT DATA BUS MUX 24 16 16 16 I/O PROCESSOR I/O REGISTERS (MEMORY-MAPPED) BARREL SHIFTER 22 24 DMA DATA 24 PX MULT ADDRBUS MUX 18 24 ALU CONTROL STATUS BUFFERS EMBEDDED CONTROL PERIPHERALS AND COMMUNICATIONS PORTS DMA CONTROLLER SYSTEM INTERRUPT CONTROLLER CD\DDA\Cours\Chap5.doc PROGRAMMABLE FLAGS(16) TIMERS (3) 3 M. Correvon T A B L E D E S M A T I E R E S PAGE 5. SÉQUENCEUR DE PROGRAMME...........................................................................................................................1 5.1 INTRODUCTION ...........................................................................................................................................................1 5.2 PIPELINE DES INSTRUCTIONS......................................................................................................................................5 5.3 MÉMOIRE CACHE D’INSTRUCTIONS ...........................................................................................................................6 5.3.1 Configuration de la mémoire cache....................................................................................................... 7 5.4 LES MULTI-INSTRUCTIONS .........................................................................................................................................9 5.4.1 Généralités ............................................................................................................................................ 9 5.4.2 Opération dans l’unité de calcul et double accès en mémoire............................................................... 9 5.4.3 Double accès en mémoire ..................................................................................................................... 9 5.4.4 Opération dans l’unité de calcul et lecture en mémoire ........................................................................ 9 5.4.5 Opération dans l’unité de calcul et écriture en mémoire ..................................................................... 10 5.4.6 Opération dans l’unité de calcul et transfert registre à registre ........................................................... 10 5.5 BRANCHEMENTS ......................................................................................................................................................11 5.5.1 Branchements de type saut (JUMP) et appel de sous routines (CALL) .............................................. 11 5.5.1.1 Branchements immédiats................................................................................................................. 11 5.5.1.2 Branchements retardés.................................................................................................................... 12 5.5.2 Branchements de type boucle DO/UNTIL .......................................................................................... 13 5.5.3 Branchements conditionnels ............................................................................................................... 15 5.5.4 Branchements de type interruption...................................................................................................... 15 5.6 GESTION DES PILES (STACK)....................................................................................................................................16 5.6.1 Utilisation implicite des piles .............................................................................................................. 16 5.6.1.1 Pile PC (PC Stack).......................................................................................................................... 16 5.6.1.2 Piles de boucle (LOOP BEGIN Stack, LOOP END Stack, COUNT Stack) .................................... 16 5.6.1.3 Pile d’état (Status stack) : 16 words × 32 bits ................................................................................ 16 5.6.2 Opérations explicites sur les piles ....................................................................................................... 17 5.6.2.1 Pile PC (PC Stack).......................................................................................................................... 17 5.6.2.2 Piles de boucle (LOOP BEGIN Stack, LOOP END Stack, COUNT Stack) .................................... 18 5.6.2.3 Pile d’état (Status stack) : 16 words × 32 bits ................................................................................ 18 5.6.3 Etat des piles ....................................................................................................................................... 18 5.7 RÉSUMÉ DES INSTRUCTIONS PROPRES AU SÉQUENCEUR DE PROGRAMME .............................................................20 5.8 CONTRÔLEUR D’INTERRUPTIONS .............................................................................................................................21 5.8.1 Généralités .......................................................................................................................................... 21 5.8.2 Registres dédiés à la gestion des lignes d’interruption........................................................................ 23 5.8.2.1 Flag de masquage global des interruptions .................................................................................... 23 5.8.2.2 Registre de masquage des interruptions IMASK............................................................................. 23 5.8.2.3 Registre de mémorisation des interruptions IRPTL ........................................................................ 23 5.8.2.4 Registre d’attribution des priorités des interruptions des périphériques........................................ 24 5.8.2.5 Registres de masquage individuel des interruptions des périphériques.......................................... 24 5.8.2.6 Registres d’identification des sources d’interruptions .................................................................... 24 5.8.3 Sources d’interruption pour les périphériques..................................................................................... 25 5.8.4 Table des vecteurs d’interruptions ...................................................................................................... 26 5.8.5 Exemple : Contenu de la mémoire de programme (PM, block 0) ....................................................... 27 Bibliographie SEQUENCEUR DE PROGRAMME Page 1 5. SÉQUENCEUR DE PROGRAMME 5.1 INTRODUCTION Le séquenceur de programme contrôle le déroulement du programme en cours en déterminant l’adresse de la prochaine instruction à exécuter. Le déroulement d’un programme est principalement linéaire grâce à une exécution séquentielle des instructions. Ce déroulement peut être modifié par l’utilisation d’une structure non séquentielle c'est-àdire que le programme ne suit pas la suite des instructions placées en mémoire de programme (PM). Les structures non séquentielles se présentent sous la forme de cinq cas particuliers : LINEAR FLOW AD DRESS: LOOP JUMP N I NSTRUCTION D O UN TIL N+1 I NSTRUCTION I NSTRUCTION I NSTRUCTION N+2 I NSTRUCTION I NSTRUCTION I NSTRUCTION N+3 I NSTRUCTION I NSTRUCTION N+4 I NSTRUCTION I NSTRUCTION I NSTRUCTION N+5 I NSTRUCTION I NSTRUCTION I NSTRUCTION SUBROUTINE JUM P N TI M ES INTERRUPT I NSTRUCTION IDLE IRQ CAL L I NSTRUCTION ID LE I NSTRUCTION I NSTRUCTION I NSTRUCTION I NSTRUCTION I NSTRUCTION WAI TIN G FOR IRQ I NSTRUCTION VECTOR I NSTRUCTION … … I NSTRUCTION I NSTRUCTION I NSTRUCTION I NSTRUCTION I NSTRUCTION I NSTRUCTION I NSTRUCTION I NSTRUCTION I NSTRUCTION RTS RTI I NSTRUCTION Figure 5-1 : Déroulement général d’un programme Boucle : (Loop). Une séquence d’instructions est exécutée plusieurs fois avec un minimum de cycles additionnels (low overhead) dû à une gestion optimisée de la boucle. Sous-Routine : (Subroutine). Interruption de l’exécution séquentielle du programme pour exécuter une partie spécifique de programme dans une zone mémoire non contigüe suivie d’un retour à l’instruction suivant l’interruption. Saut : (Jump). Interruption de l’exécution séquentielle du programme pour une autre exécution séquentielle dont le départ se trouve à un autre endroit de la mémoire, sans retour. Interruption : (Interruption). Interruption du déroulement séquentielle du programme par un événement dont l’apparition n’est pas prédictible. La suite du déroulement du programme est propre à l’événement déclencheur. Une CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME Page 2 fois la routine exécutée, le déroulement initial du programme est repris là où il a été interrompu. Veille : (Idle). Instruction particulière provoquant la mise en veille du processeur notamment en limitant sa consommation. Le processeur sort de son état de veille lorsqu’une interruption apparaît. La Figure 5-1 illustre les cinq cas de rupture d’exécution séquentielle du programme. Pour pouvoir réaliser les fonctions qui lui sont attribuées, c'est-à-dire déterminer l’ordre d’exécution des instructions du programme, le séquenceur de programme doit être capable d’exécuter les tâches listées ci-dessous. − − − − − − − Incrémenter l’adresse de recherche des instructions (fetch address). Gérer les piles (PC, compteur, registres d’état, …). Evaluer les conditions subordonnées aux instructions [IF COND]. Décrémenter le compteur de boucle. Calculer les nouvelles adresses. Gérer les instructions en cache. Gérer les interruptions. Pour accomplir toutes ces tâches, le séquenceur de programme a la structure donnée par la Figure 5-2 ADSP-2199X DSP SPECIFIC ADSP-2199X DSP CORE (COMMON TO ADSP-219X FAMILY) PM DATA BUS PROGRAMMABLE FLAGS COUNTER EXPIRED (CE) ST ATUS & CO NDITI ON ADDRESS FROM DAGS ARITHMETIC STATUS LOOP STAT US INSTR CACHE PC STATUS I NSTRLATCH LOOP & BRANCH CONTROL + INTERRUPTS INTERRUPT CONTROLLER VECTOR ADDR LOOP STACK IND DIR PC- REL BRAN BRAN BRAN LOOP ADDR PC STACK RT ADDR +1 RB INCR ADDR ADDR INSTRUCTION PIPELINE LO O K AHEAD A DDRESS (LA ) PREFETC H ADDRESS ( PA ) FETCH ADDRESS (FA ) DMA REQUESTS ADD RESS DECO DE (A D) DM A CONTROLLER INSTRUCT IO N DECO DE (ID ) EXECUTE (PC) PM ADDRESS BUS Figure 5-2 : Architecture du séquenceur de programme CD\DDA\Cours\Chap5.doc STACK ADDRESS SEQUENCEUR DE PROGRAMME Page 3 Note sur les grandeurs d’entrées du multiplexeur IND. BRAN : Branchement indirect (JUMP (Ireg)) DIR. BRAN : Branchement direct (LJUMP <adresse absolue 24 bits>) PC_REL. BRAN : Branchement relatif (JUMP <adresse relative 16 bits>) LOOP ADDR : Adresse issue des piles de boucle (LOOP BEGIN, LOOP END) RT. ADDR : Branchement de retour de sous routine (RTS, RTI) RB. ADDR : Maintien de l’adresse en cours (Idle) INCR. ADDR : Incrémentation (déroulement séquentiel PC=PC+1) Le séquenceur d’adresses contrôle le multiplexeur afin de fournir la valeur de l’adresse de la prochaine instruction à aller chercher en mémoire programme (Fetch) à partir de plusieurs sources d’adresse possible. L’adresse sélectionnée entre dans le pipeline des instructions (Look Ahead Address) pour finir sur le multiplexeur lié au bus d’adresses de la mémoire de programme (PMA : PM Address Bus). Le pipeline contient l’adresse (24 bits) de l’instruction courante à aller chercher en mémoire de programme PM puis le décodage de l’instruction en question et enfin son exécution. Toutes les adresses générées par le séquenceur de programme sont des adresses de 24 bits de la mémoire de programme PM contenant les instructions du programme. La gestion des événements susceptibles de modifier la séquence du programme est réalisée par le contrôleur d’interruption qui détermine si une source d’interruption est masquée ou non et par conséquent génère l’adresse du vecteur d’interruption appropriée. Grâce à un bloc de mémoire cache, le DSP peut accéder en un seul cycle d’horloge à : − des données dans la mémoire de programme PM et rechercher une instruction sans conflit de bus PM, − des données et rechercher une instruction dans le même bloc mémoire sans conflit de bloc. La source d’adresse pour un branchement indirect peut être un des générateurs d’adresses DAG. Le séquenceur de programme évalue la séquence des adresses du programme faisant suite à des instructions conditionnelles [IF COND] et la suite des adresses dans des boucles qui peuvent être imbriquées. Les registres du séquenceur de programme sont des registres du groupe 1 (Reg1), 2 (Reg2) et 3 (Reg3). Ces registres sont accessibles en écriture et/ou en lecture par les registres Dreg. Le compteur de programme PC est indirectement accessible en lecture et en écriture par l’intermédiaire des registres STACKA et STACKP et des instructions PUSH PC et POP PC. GROUPES DE REGISTRES Reg0 (Dreg) Reg1 (G1reg) Reg2 (G2reg) Reg3 (G3reg) AX0 AX1 MX0 MX1 AY0 AY1 MY0 MY1 MR2 SR2 I0 I1 I2 I3 M0 M1 M2 M3 L0 L1 I4 I5 I6 I7 M4 M5 M6 M7 L4 L5 ASTAT(1) (2) (9) MSTAT(1) (2) (7) SSTAT(1) (2) (8) LPSTACKP(2) (9) CCODE(1) (2) (4) SE SB PX(2) (9) DMPG1(2) (8) DMPG2(2) (8) CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME Page 4 GROUPES DE REGISTRES Reg0 (Dreg) Reg1 (G1reg) Reg2 (G2reg) Reg3 (G3reg) AR SI MR1 SR1 MR0 SR0 L2 L3 IMASK(1) IRPTL(1) ICNTL(1) STACKA L6 L7 Reservé Reservé CNTR LPSTACKA IOPG(2) (8) (2) IJPG (8) Reservé Reservé Reservé STACKP(1) (8) Tableau 5-1 : Groupes de registres Note 1 : Note 2 : registres de contrôle de l’ADSP21992 Les chiffres entre parenthèses correspondent aux nombres de bits si le registre n’a pas 16 bits Un set de registres (ASTAT, MSTAT, CCODE, IMASK, IRPL et ICNTL) permet la configuration du séquenceur de programme ou du contrôleur d’interruptions. L’écriture de valeurs dans ces registres ne modifie pas immédiatement le comportement du système. Registre Description Bits Nombre de cycles de latence CNTR IJPG IOPG DMPG1 DMPG2 Compteur de boucle Page pour les sauts relatifs (8 bits MSB) Page pour les I/0 (8 bits MSB) Page associée à DAG1 (8 bits MSB) Page associée à DAG2 (8 bits MSB) 16 8 8 8 8 11 1 1 1 1 Tableau 5-2 : Temps de latence en écriture des registres de séquenceur de programme Note 1 : 1 cycles de latence avant une condition IF NOT CE, sans cycle de latence pour les autres instructions Registre Description Bits Nombre de cycles de latence ASTAT MSTAT SSTAT CCODE IRPTL IMASK ICNTL CACTL Registre d’état arithmétique Registre de mode Registre d’état du système Registre de conditio Registre de mémorisation des interruptions Registre de masque d’interruption Registre de contrôle d’interruption Registre de contrôle de la mémoire cache 9 7 8 16 16 16 16 3 1 01 N/A 1 1 1 1 52 Tableau 5-3 : Temps de latence en écriture des registres de séquenceur de programme Note 1 : L’utilisation de l’instruction ENA MODE et DIS MODE CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME 5.2 Page 5 PIPELINE DES INSTRUCTIONS Lorsqu’une adresse est émise sur les bus de programme et de donnée, il faut deux cycles d’horloge avant que les données soient exploitables dans le cœur du DSP. C’est la raison pour laquelle l’étage LA génère l’adresse de la mémoire de programme PM permettant à l’étage FA d’aller chercher l’instruction et l’adresse (PM ou DM) permettant à l’étage AD de lire la donnée dans le cycle du compteur de programme PC. Le séquenceur de programme détermine l’adresse de la prochaine instruction en examinant le résultat de l’exécution de l’instruction courante corrélée avec l’état des divers flags du processeur. Si aucune condition ne l’impose, le DSP exécute les instructions dans un ordre séquentiel par incrémentation de l’adresse définie dans l’étage LA du pipeline. Les différents étages du pipeline est les suivants : Look-Ahead Address (LA) : le séquenceur de programme détermine la source de l’adresse de la prochaine instruction à l’aide du multiplexeur (look-ahead address multiplexer). Prefetch Address (PA), Fetch Address (FA) : le séquenceur de programme lit l’instruction à exécuter dans la mémoire cache ou dans la mémoire de programme. Address Decode (AD), Instruction Decode (ID) : Le séquenceur de programme décode l’instruction ainsi que les conditions contrôlant l’exécution de ladite instruction. Exécute PC : le DSP exécute l’instruction en un cycle d’horloge Ces cycles se superposent dans le pipeline de manière à avoir, à quelques exceptions près, un flux permettant l’exécution d’une instruction par cycle d’horloge. Cycles LA PA FA AD ID PC 1 0x08 >> 2 0x09 >> 0x08 >> 3 0x0A >> 0x09 >> 0x08 >> 4 0x0B >> 0x0A >> 0x09 >> 0x08 >> 5 0x0C >> 0x0B >> 0x0A >> 0x09 >> 0x08 >> 6 0x0D >> 0x0C >> 0x0B >> 0x0A >> 0x09 >> 0x08 7 0x0E >> 0x0D >> 0x0C >> 0x0B >> 0x0A >> 0x09 8 0x0F >> 0x0E >> 0x0D >> 0x0C >> 0x0B >> 0x0A Tableau 5-4 : Cycles d’exécution du pipeline CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME 5.3 Page 6 MÉMOIRE CACHE D’INSTRUCTIONS Dans des conditions normales, le séquenceur de programme va chercher une instruction en mémoire à chaque cycle d’horloge. Il arrive cependant que des contraintes liées à l’occupation du bus provoquent un conflit entre la recherche d’une instruction et d’une donnée, conflit qui peut généralement être réglé en utilisant de la mémoire cache. Des conflits se produisent dans les situations suivantes : − Le DSP doit exécuter une instruction qui demande un accès à une donnée dans la mémoire de programme (utilisation du bus PM). Dans ce cas il y a un conflit de bus car le séquenceur de programme utilise le bus PM pour aller chercher une instruction (fetch). − Le DSP doit exécuter une instruction qui demande un accès à une donnée dans la mémoire de donnée (utilisation du bus DM), mais dans le même bloc de mémoire que l’instruction recherchée par le séquenceur de programme. Dans ce cas il y a un conflit de bloc car les deux bus ne peuvent pas atteindre le même bloc simultanément. Pour éviter les conflits de bus et de bloc, le DSP met en cache les instructions qui créent un conflit de manière à réduire les délais. La gestion de la mémoire cache ne demande aucune intervention, excepté les commandes de son activation / désactivation. La première fois que le DSP rencontre un conflit, il doit attendre un cycle avant d’aller chercher l’instruction suivante. Dans ce cas le DSP écrit automatiquement l’instruction qui a crée le conflit dans la mémoire cache de manière à éviter que le même conflit se reproduise. Le séquenceur de programme inspecte la mémoire cache à chaque conflit de bus ou de bloc. Si l’instruction recherchée est en cache le DSP va aller la chercher à cet endroit, libérant du même coup l’accès du bus PM ou du bloc mémoire dans lequel se trouve la donnée. Dans ce cas il n’y a pas de cycle d’horloge additionnel. Si l’instruction recherchée n’est pas en cache le DSP va l’écrire pour la prochaine fois. La Figure 5-3 montre l’architecture de la mémoire cache d’instructions. La mémoire cache supporte 64 paires « instruction – adresse » placées dans 32 groupes (set 0 à 31). Les adresses de chaque groupe ont en commun leurs 5 derniers bits (4 – 0). Chaque paire « instruction – adresse » est associée à un bit (Valid Bit) indiquant si la paire en question est valide ou non. Enfin un dernier bit (LRU : Least Recently Used) indique laquelle des paires « instruction – adresse » du groupe n’a pas été utilisée lors du dernier accès au groupe en question. En d’autres mots le bit LRU indique la paire « instruction – adresse » qui pourrait être remplacée par une nouvelle paire lors d’un conflit non résolu. La paire « instruction – adresse » est placée dans la mémoire cache en fonction des 5 derniers bits de l’adresse. Lorsque le séquenceur de programme inspecte la mémoire cache suite à un conflit, il utilise ces 5 derniers bits d’adresse comme un index pour pointer le bon groupe. Dans le groupe, le séquenceur de programme vérifie l’adresse et l’état du bit « Valid Bit ». Si le groupe contient la bonne instruction, le séquenceur de programme utilise l’instruction de la paire « instruction – adresse » et met à jour le bit « LRU » pour indiquer la paire « instruction – adresse » qui ne satisfait pas la demande. Lorsque la mémoire cache ne contient pas l’instruction recherchée, le DSP charge une nouvelle paire « instruction – adresse » dans la position correspondant à la paire « instruction – adresse » qui n’a pas été utilisée précédemment et inverse le bit « LRU ». CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME Page 7 LRU BIT SET 0 VALID BIT INSTRUCTIONS ADDRESSES BITS (23-5) ENTRY 0 ADDR ESSES BITS (4-0) 00000 ENTRY 1 SET 1 ENTRY 0 00001 ENTRY 1 SET 2 ENTRY 0 00010 ENTRY 1 SET 29 ENTRY 0 11101 ENTRY 1 SET 30 ENTRY 0 11110 ENTRY 1 SET 31 ENTRY 0 11111 ENTRY 1 Figure 5-3 : Architecture de la mémoire cache 5.3.1 Configuration de la mémoire cache Après un Reset, la mémoire cache est activée et ne contient aucune paire « instruction – adresse ». Dès cet instant le registre CACTL contrôle le mode opératoire de la mémoire cache. Comme pour les autres registres de contrôle, le registre CACTL est accessible via les instructions reg(CACTL)=dreg et dreg=reg(CACTL). 7 6 5 4 3 2 1 0 1 0 1 0 0 0 0 0 Reset = b#101n nnnn Reserved CDE (Cache fetches with memory block accesses conflicting DMDAs enable) 0 = Disable 1 = Enable CFZ (Cache freeze) 0 = Thaw (allows cache to update) 1 = Freeze CPE (Cache fetches with memory block accesses conflicting with PMDAs enable) 0 = Thaw (allows cache to update) 1 = Freeze Figure 5-4 : Registre de contrôle de la mémoire cache Les bits du registre de contrôle CACTL de la mémoire cache ont les rôles suivants : Cache pour accès au bus de données DM, CACTL[5]. Si le bit CACTL[5] (CDE) vaut « 1 » la mémoire cache est utilisée pour gérer les conflits sur le bus de données DM. Si le bit CACTL[5] (CDE) vaut « 0 » les conflits sur le bus de données DM ne sont pas gérés. Gèle de la mémoire cache, CACTL[6]. Si le bit CACTL[6] (CFZ) vaut « 1 » le contenu de la mémoire cache est gelé, c'est-à-dire que le contenu ne peut plus être modifié mais les conflits de bus et de blocs sont gérés en accord avec le contenu de la mémoire cache. Si le CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME Page 8 bit CACTL[5] (CFZ) vaut « 0 » non seulement les conflits de bus et de blocs sont gérés mais la mémoire cache est mis à jour. Cache pour accès au bus de programme PM, CACTL[7]. Si le bit CACTL[7] (CPE) vaut « 1 » la mémoire cache est utilisée pour gérer les conflits sur le bus de programme PM. Si le bit CACTL[5] (CPE) vaut « 0 » les conflits sur le bus de programme PM ne sont pas gérés. Après un Reset, les bits CDE et CPE sont mis à « 1 » alors que le bit CFZ est mis à « 0 » CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME 5.4 Page 9 LES MULTI-INSTRUCTIONS 5.4.1 Généralités 5.4.2 Opération dans l’unité de calcul et double accès en mémoire Le groupe d’instruction (3) exprimé par 5.1 combine une opération arithmétique réalisée par l’ALU ou le MAC, avec une lecture de la mémoire de donnée (DM) vers un registre d’entrée (X) et une lecture de la mémoire de programme (PM) vers un registre d’entrée (Y). ⎛ I0 ⎜ ALU ⎜ I1 , = DM ⎜ + = I2 MAC MX 0 ⎜ ⎜ MX 1 ⎝ I3 AX 0 AX 1 M0 ⎞ ⎟ M1 ⎟ , M2⎟ ⎟ M 3 ⎟⎠ ⎛ I4 ⎜ ⎜ I5 = PM ⎜ + = MY 0 I6 ⎜ ⎜ MY1 ⎝ I7 AY 0 AY 1 M4⎞ ⎟ M5 ⎟ ; M6 ⎟ ⎟ M 7 ⎟⎠ 5.1 L’opération arithmétique est réalisée en début de cycle, les lectures des mémoires ayant lieu simultanément en fin de cycle. Si aucun conflit n’est détecté les trois instructions sont exécutées en un cycle d’horloge. Dans le cas contraire le nombre de cycles peut être de deux, voir trois. 5.4.3 Double accès en mémoire Le groupe d’instruction (2) exprimé par 5.2 combine deux opérations de lecture, une dans le mémoire de donnée (DM), l’autre dans la mémoire de programme (PM). Les registres de lecture de la mémoire de donnée correspondent à l’entrée (X) de l’ALU ou du MAC alors que les registres de lecture de la mémoire de programme correspondent à l’entrée (Y) de l’ALU ou du MAC. ⎛ I0 ⎜ ⎜ I1 = DM ⎜ + = MX 0 I2 ⎜ ⎜ MX 1 ⎝ I3 AX 0 AX 1 M0 ⎞ ⎟ M1 ⎟ , M2⎟ ⎟ M 3 ⎟⎠ ⎛ I4 ⎜ ⎜ I5 = PM ⎜ + = MY 0 I6 ⎜ ⎜ MY1 ⎝ I7 AY 0 AY 1 M4⎞ ⎟ M5 ⎟ ; M6 ⎟ ⎟ M 7 ⎟⎠ 5.2 Les lectures des mémoires ayant lieu simultanément en fin de cycle. Si aucun conflit n’est détecté les trois instructions sont exécutées en un cycle d’horloge. Dans le cas contraire le nombre de cycles peut être de deux, voir trois. 5.4.4 Opération dans l’unité de calcul et lecture en mémoire Le groupe d’instruction (2) exprimé par 5.3 combine une opération arithmétique réalisée par l’ALU, le MAC ou le BS avec une opération de lecture dans le mémoire de donnée (DM). Le registre de lecture de la mémoire de donnée appartient au groupe des registres de données DREG. CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME Page 10 ⎛ I0 ⎜ ⎜ I1 ⎜ I2 ⎜ ALU ⎜ I3 MAC , DREG = DM ⎜ + = ⎜ I4 SHIFT ⎜ I5 ⎜ ⎜ I6 ⎜ I7 ⎝ M0 ⎞ ⎟ M1 ⎟ M2⎟ ⎟ M3 ⎟ ⎟; M4⎟ M5 ⎟ ⎟ M6 ⎟ M 7 ⎟⎠ 5.3 L’opération arithmétique est réalisée en début de cycle, la lecture des mémoires ayant lieu en fin de cycle. Si aucun conflit n’est détecté les deux instructions sont exécutées en un cycle d’horloge. Dans le cas contraire le nombre de cycles est de deux. 5.4.5 Opération dans l’unité de calcul et écriture en mémoire Le groupe d’instruction (2) exprimé par 5.4 combine une opération d’écriture en mémoire de donnée (DM) et une opération arithmétique réalisée par l’ALU, le MAC ou le BS. Le registre d’écriture de la mémoire de donnée appartient au groupe des registres de données DREG. ⎛ I0 ⎜ ⎜ I1 ⎜ I2 ⎜ ⎜ I3 DM ⎜ + = ⎜ I4 ⎜ I5 ⎜ ⎜ I6 ⎜ I7 ⎝ M0 ⎞ ⎟ M1 ⎟ M2⎟ ⎟ ALU M3 ⎟ ⎟ = DREG, MAC ; M4⎟ SHIFT M5 ⎟ ⎟ M6 ⎟ M 7 ⎟⎠ 5.4 Les deux opérations sont réalisées en début de cycle. Si aucun conflit n’est détecté les deux instructions sont exécutées en un cycle d’horloge. Dans le cas contraire le nombre de cycles est de deux. 5.4.6 Opération dans l’unité de calcul et transfert registre à registre Le groupe d’instruction (2) exprimé par 5.5 combine une opération arithmétique réalisée par l’ALU, le MAC ou le BS et un transfert de donnée de registre à registre. Les registres utilisés pour le transfert de donnée appartiennent au groupe des registres de données DREG. ALU MAC SHIFT CD\DDA\Cours\Chap5.doc , DREG1 = DREG 2 ; 5.5 SEQUENCEUR DE PROGRAMME 5.5 5.5.1 Page 11 BRANCHEMENTS Branchements de type saut (JUMP) et appel de sous routines (CALL) Une instruction de saut JUMP ou d’appelle de sous routine CALL/RTS permet de transférer l’exécution séquentielle du programme dans une autre partie de la mémoire. La différence entre les instructions JUMP et CALL réside dans le fait que, pour une instruction CALL, le pointeur de programme (PC), après incrémentation est automatiquement sauvé dans la pile PC Stack (PUSH PC). Lors de l’instruction RTS, le pointeur de programme prend la dernière valeur sauvée dans la pile (POP PC), qui n’est rien d’autre que l’adresse de retour au programme suivant l’instruction CALL. L’instruction de retour (RTS) permet au séquenceur de programme de déterminer l’endroit où il doit aller chercher la prochaine instruction à exécuter. Le programme peut spécifier un certain nombre de paramètres lors d’un saut de type JUMP ou CALL. − Les instructions JUMP et CALL/RTS peuvent être immédiates ou retardées. En effet les instructions contenues dans le pipeline imposent un retard de 4 cycles d’horloge. Dans le cas d’un branchement retardé seuls deux cycles d’horloge sont effectifs. − Les instructions JUMP et CALL/RTS peuvent se trouver à l’intérieur d’une boucle D0/UNTIL finie (CE) or infinie (FOREVER) mais jamais en dernière position de la boucle (là où se trouve l’étiquette (label) de fin de boucle). − Les instructions JUMP et CALL/RTS peuvent être conditionnelles ([IF COND]). Le séquenceur de programme peut évaluer si la condition est remplie à l’aide des flags d’état contenus dans les registres ASTAT et MSTAT, ICNTL, CCODE. Si aucune condition n’est spécifiée, le branchement est toujours pris en compte. 5.5.1.1 Branchements immédiats Les branchements peuvent être directs ou indirects. Dans le premier cas, c’est le séquenceur de programme qui génère l’adresse (voir Figure 5-2 multiplexeur DIR BRAN), dans le second cas c’est le générateur d’adresse DAG2 (voir Figure 5-2 multiplexeur IND BRAN) qui fournit l’adresse de la prochaine instruction. Les branchements directs dont l’adresse est fixée par une valeur absolue ou une étiquette (label) font usage soit d’une adresse relative sur 16 bits (le saut s’effectue à l’intérieur d’une page de 64Kx24bits) ou d’une adresse absolue de 24 bits − Branchement direct JUMP fft1024 ; CALL 23 ; LJUMP 0x234567 ; // saut à l’adresse absolue fft1024 (16bits) // saut à l’adresse 23 décimal // saut à l’adresse absolue 0x234567 (24 bits) − Branchement indirect JUMP (I6) ; CALL (I7) ; // saut indirect à l’adresse définie dans I6 (DAG2) et IJPG // saut indirect à l’adresse définie dans I7 (DAG2) et IJPG Dans le cas d’un branchement indirect, les 16 bits de poids faibles de l’adresse sont pris dans le registre d’index Ix du générateur d’adresse DAG2 alors que les 8 bits de poids fort sont déterminés par le contenu du registre de page IJPG. Il est possible de réaliser des branchements conditionnels dont la forme des instructions est la suivante : CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME Page 12 IF [COND] JUMP (I6) ; // saut indirect conditionnel IF [COND] CALL (I7) ; // saut indirect conditionnel Le pipeline des instructions influence la manière avec laquelle les branchements sont supportés. Pour le branchement immédiat les instructions JUMP et CALL/RTS ne spécifient rien quant au délai d’exécution, il y a 4 cycles d’horloge de perdus. Ces quatre cycles correspondent au contenu du pipeline (phase de recherche (PA : Prefetch Address et FA : Fetch Address) et de décodage (AD : Address Decode et ID : Instruction Decode). Ces quatre phases sont remplacées par des instructions NOP (No OPeration). Ces quatre cycles permettent au pipeline d’aller chercher et de décoder la première instruction suivant le branchement. Cycles 1 2 3 4 5 6 LA j j+1 j+2 j+3 j+4 j+5 PA n+4→NOP j j+1 j+2 j+3 j+4 FA n+3→NOP n+4→NOP j j+1 j+2 j+3 AD n+2→NOP n+3→NOP n+4→NOP j j+1 j+2 ID n+1→NOP n+2→NOP n+3→NOP n+4→NOP j j+1 PC n NOP NOP NOP NOP j Tableau 5-5 : Séquence dans le pipeline lors d’une instruction JUMP ou CALL Cycles 1 2 3 4 5 6 LA r r+1 r+2 r+3 r+4 r+5 PA n+4→NOP r r+1 r+2 r+3 r+4 FA n+3→NOP n+4→NOP r r+1 r+2 r+3 AD n+2→NOP n+3→NOP n+4→NOP r r+1 r+2 ID n+1→NOP n+2→NOP n+3→NOP n+4→NOP r r+1 PC n NOP NOP NOP NOP r Tableau 5-6 : Séquence dans le pipeline lors d’une instruction RTS 5.5.1.2 Branchements retardés Il est possible d’éviter un retard de 4 cycles d’horloge en effectuant un branchement retardé. Dans ce cas les deux instructions suivants directement le branchement sont effectuées avant le branchement proprement dit JUMP fft1024 (DB) ; AR=AX0+AY0 ; DM(I0)=AR ; … Fft1024 : … MX0=DM(I4+=M4) ; RTS ; MY0=DM(I4+=M4) ; MR=MR+MX0*MY0 (SS) ; // saut à l’adresse absolue fft1024 (16bits) // première instruction exécutée avant le branchement // deuxième instruction exécutée avant le branchement // première instruction après le branchement // instruction de branchement (retour) // première instruction exécutée avant le branchement // deuxième instruction exécutée avant le branchement On gagne ainsi en efficacité, au détriment de la lisibilité du programme. CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME Cycles 1 2 3 4 5 6 LA j j+1 j+2 j+3 j+4 j+5 Page 13 PA n+4→NOP j j+1 j+2 j+3 j+4 FA n+3→NOP n+4→NOP j j+1 j+2 j+3 AD n+2 n+3→NOP n+4→NOP j j+1 j+2 ID n+1 n+2 n+3→NOP n+4→NOP j j+1 PC n n+1 n+2 NOP NOP j Tableau 5-7 : Séquence dans le pipeline lors d’une instruction JUMP ou CALL retardée Cycles 1 2 3 4 5 6 LA r r+1 r+2 r+3 r+4 r+5 PA n+4→NOP r r+1 r+2 r+3 r+4 FA n+3→NOP n+4→NOP r r+1 r+2 r+3 AD n+2 n+3→NOP n+4→NOP r r+1 r+2 ID n+1 n+2 n+3→NOP n+4→NOP r r+1 PC n n+1 n+2 NOP NOP r Tableau 5-8 : Séquence dans le pipeline lors d’une instruction RTS retardée Il y a un certain nombre de restrictions quant à l’utilisation des branchements retardés. En effet les instructions suivant directement l’instruction de branchement : − ne doivent pas être d’autres instructions de branchement (JUMP, CALL, RTS, …), − ne doivent pas être des instructions manipulant les piles (PUSH, POP ou écriture dans la pile du PC), − ne doivent pas être des opérations initiant des boucles (D0/UNTIL) ou d’arrêt (IDLE), − ne doivent être des instructions demandant deux cycles d’horloge à moins que ces instructions apparaissent directement après l’instruction de branchement. 5.5.2 Branchements de type boucle DO/UNTIL Les boucles DO/UNTIL représentent un type de déroulement du programme de manière non séquentielle. La boucle peut avoir un nombre d’itérations fini grâce à la condition CE (Counter Empty) du compteur de boucle ou infini (FOREVER). L’instruction DO/UNTIL utilise les propriétés du séquenceur de boucle et la condition CE. Les boucles sont efficaces du point de vue software. Il n’y a pas d’instructions additionnelles de décrémentation de compteur ou de branchement et de condition. L’exemple de code ci-dessous donne une idée de la simplicité de l’élaboration de boucle. CNTR=30 ; DO Fin_de_boucle UNTIL CE ; AX0=DM(I0+=M0), AY0=PM(I4+=M4) ; AR=AX0+AY0 ; Fin_de_boucle : DM(I1+=M0)=AR ; // compteur de boucle à 30 // condition de réalisation de la boucle // multi instructions // opération dans l’ALU // dernière ligne de la boucle Lors de l’exécution de l’instruction DO/UNITL, le séquenceur de programme envoie l’adresse de début de boucle et l’adresse de fin de boucle dans respectivement les piles de boucle LOOP BEGIN STACK et LOOP END STACK. Les instructions étant contenues dans le pipeline, dans le cas d’une boucle, le séquenceur de programme doit tester la condition de fin de boucle et décrémente le compteur à la fin de CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME Page 14 chaque boucle. Si la condition du test est fausse, le séquenceur provoque la répétition de la boucle. Si la condition est vraie, le séquenceur sort de la boucle et met à jour les piles de boucle LOOP BEGIN STACK et LOOP END STACK. Contenu du pipeline lors d’une itération (pas de sortie de boucle) Cycles 1 2 3 4 5 6 7 LA e1 b2 b+1 b+2 b+3 b+43 b+5 PA e-1 e b b+1 b+2 b+33 b+4 FA e-2 e-1 e b b+1 b+23 b+3 AD e-3 e-2 e-1 e b b+13 b+2 ID e-4 e-3 e-2 e-1 e b3 b+1 PC e-5 e-4 e-3 e-2 e-1 e3 b Tableau 5-9 : Séquence dans le pipeline lors d’une itération de boucle 1 : Test de condition de fin de boucle faux (retour en début de boucle pour le passage suivant) 2 : Adresse de début de boucle 3 : Pour des boucles de moins de 6 instructions (inférieur à la taille du pipeline), le pipeline retient les instructions de la boucle (e à b+4). Lors de la première itération d’une telle boucle, il y a introduction de 4 NOP avant que le pipeline soit dans la bonne configuration Contenu du pipeline lors d’une sortie de boucle Cycles 1 2 3 4 5 6 7 LA e1 e+1 e+2 e+3 e+4 e+5 e+6 PA e-1 e e+1 e+2 e+3 e+4 e+5 FA e-2 e-1 e e+1 e+2 e+3 e+4 AD e-3 e-2 e-1 e e+1 e+2 e+3 ID e-4 e-3 e-2 e-1 e e+1 e+2 PC e-5 e-4 e-3 e-2 e-1 e e+12 Tableau 5-10 : Séquence dans le pipeline lors d’une sortie de boucle 1 : Test de condition de fin de boucle vrai (sortie de la boucle) 2 : Fin de boucle et mise à jour des piles LOOP BEGIN STACK et LOOP END STACK Pour avoir une efficacité maximum, c'est-à-dire avoir un nombre de cycles d’horloges aussi petit que possible (low overhead), le DSP contient trois piles distinctes pour les boucles, soit les piles LOOP BEGIN STACK et LOOP END STACK et COUNTER. Le séquenceur de programme contrôle ces piles lors de l’entrée dans la boucle (DO/UNTIL CE) et lorsqu’elle se termine, c'est-à-dire lorsque le compteur arrive à « 0 », Par contre lorsque la sortie de boucle est le résultat d’un saut conditionnel (IF COND JUMP), les piles ne sont pas mises à jour. Il existe encore une restriction sur la fin de boucle. En effet la dernière instruction de boucle ne peut pas être un appel de sous routine CALL/RTS ou un saut retardé JUMP (DB). Pour les boucles imbriquées, les adresses de fin de boucles doivent être séparées les unes des autres. CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME 5.5.3 Page 15 Branchements conditionnels Le tableau ci-dessous donne un aperçu des possibilités de branchement conditionnel. Syntaxe Condition Vrai si EQ NE LT GE LE GT AC NOT AC AV NOT AV MV NOT MV =0 ≠0 <0 ≥0 ≤0 >0 Carry = 1 Carry = 0 Dépassement ALU Pas de dépassement ALU Dépassement MAC Pas de dépassement MAC Compare valeur dans le registre CCODE avec PF0 … PF13 = 1, AS, SV Compare valeur dans le registre CCODE avec PF0 … PF13 = 0, NOT AS, NOT SV Compteur de boucle = 0 Compteur de boucle ≠ 0 Toujours vrai (DO/UNTIL) Toujours vrai (IF) SWCOND NOT SWCOND CE NOT CE FOREVER TRUE DO/UNTIL IF COND AZ = 1 AZ = 0 AN XOR AV = 1 AN XOR AV = 0 (AN XOR AV) OR AZ = 1 (AN XOR AV) OR AZ = 0 AC = 1 AC = 0 AV = 1 AV = 0 MV = 1 MV = 0 - V V V V V V V V V V V V CCODE = SWCOND - V CCODE = NOT SWCOND - V LOOP COUNTER = 0 LOOP COUNTER = NOT 0 V V - V V Tableau 5-11 : Condition IF et boucle DO/UNTIL V - 5.5.4 : autorisée pour l’instruction en question : non autorisée pour l’instruction en question Branchements de type interruption Le déroulement séquentiel du programme peut être interrompu par une interruption dont la source provient du cœur du DSP ou des périphériques. Le DSP assigne un vecteur unique pour chaque interruption. Les interruptions du cœur du DSP sont au nombre de 5 (Emulator, Reset, Powerdown, Loop and PC Stack et Emulation Kernel). Les interruptions « Reset » et « Emulator » sont non masquables. L’interruption Powerdown est uniquement masquable par le flag GIE du registre ICNTL (contrôle globale des interruptions ICNTL[5]). Les sources interruptions des périphériques sont au nombre de 12. Pour plus de détails sur les interruptions, voir section 5.8 CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME 5.6 Page 16 GESTION DES PILES (STACK) Le séquenceur de programme contient 5 piles (PC Stack, LOOP BEGIN Stack, LOOP END Stack, COUNTER Stack et STATUS Stack). Ces piles préservent les informations sur le déroulement du programme lors de branchement. La Figure 5-5 montre les relations existantes entre eux et entre les registres à sauver et à restituer à l’aide des piles qui leur sont dédiées. Les différentes piles présentent les caractéristiques suivantes : − − − − − 5.6.1 pile PC (PC Stack) : 33 mots × 24 bits pile de début de boucle (LOOP BEGIN Stack) : 8 mots × 24 bits pile de fin de boucle (LOOP END Stack) : 8 mots × 24 bits pile du compteur de boucle (COUNTER stack) : 8 mots × 16 bits pile d’état (Status stack) : 16 mots × 32 bits Utilisation implicite des piles Les opérations sur les piles peuvent être implicites, c'est-à-dire automatique selon les branchements du programme. 5.6.1.1 Pile PC (PC Stack) Sauvegarde et restaure le contenu du compteur de programme PC. Seules les instructions CALL, RTI et RTS utilisent la pile PC <interrupt> ; RTI ; CALL subroutine ; RTS // PC → la pile PC Stack // PC Stack → PC // PC+1→ la pile PC Stack // PC Stack → PC 5.6.1.2 Piles de boucle (LOOP BEGIN Stack, LOOP END Stack, COUNT Stack) Sauvegarde l’adresse de la première et de la dernière instruction d’une boucle ainsi que le contenu du compteur de boucle. Seule l’instruction DO/UNTIL utilise les piles de boucle. CNTR=Nb_iteration ; DO end_loop UNTIL CE ; … … end_loop : // PC+1 → LOOP BEGIN Stack // end_loop → LOOP END Stack // CNTR → COUNT stack // LOOP BEGIN Stack → // LOOP END Stack → // CNTR → 5.6.1.3 Pile d’état (Status stack) : 16 words × 32 bits Sauvegarde la valeur courante des registres ASTAT et MSTAT. Seule l’instruction RTI utilise la pile d’état. Lorsqu’une interruption est activée, le séquenceur de programme sauvegarde automatiquement les registres ASTAT et MSTAT dans la pile d’état. <interrupt> ; RTI ; CD\DDA\Cours\Chap5.doc // ASTAT : MSTAT → STATUS Stack // STATUS Stack → ASTAT : MSTAT SEQUENCEUR DE PROGRAMME Page 17 24 BITS 24 BITS DO/ UNTIL PC LOOP-END-ADDRESS (IMPLICIT PUSH) DO/ UNTIL, CALL, 8 BI TS LOOP ITERATE OR 16 BI TS : STACKP STACKA 8 BITS LPSTACKP : 16 BI TS 16 BI TS LPSTACKA CNTR OR INTERRUPT RETURN (IMPLICIT PUSH) (IMPLICIT POP) PUSH PC POP PC OR OR LOOP LOOP (EXPLICIT PUSH) (EXPLICIT POP) PUSH LOOP POP LOOP POP LOOP (EXPLICIT POP) (EXPLICIT POP) DO UNTIL (EXPLICIT PUSH) (IMPLICIT PUSH) OR PUSH LOOP (EXPLICIT PUSH) PC STACK LOOP BEGIN STACK (33 ENTRIES) (8 ENTRIES) 9 BITS 7 BITS ASTAT MSTAT LOOP END STACK COUNTER STACK (8 ENTRIES) (8 ENTRIES) THE DSP USES THESE STACKS FOR: INTERRUPT RETURN (IMPLICIT PUSH) (IMPLICIT POP) OR • DO/ UNTIL LOOPS • CALL/ RETURN INSTRUCTIONS OR PUSH STS POP STS (EXPLICIT PUSH) (EXPLICIT POP) • INTERRUPT SERVICE ROUNTINES STATUS STACK (16 ENTRIES) Figure 5-5 : Piles contrôlées par le séquenceur de programme 5.6.2 Opérations explicites sur les piles Il est possible de faire des opérations explicites sur les piles 5.6.2.1 Pile PC (PC Stack) PUSH PC sauvegarde le contenu des registres STACKA (16 bits) et STACKP (8 bits) STACKA=0x3521 ; STACKP=0x20 ; PUSH PC ; // 16 bits des poids faibles d’adresse // 8 bits des poids forts d’adresse // sauvegarde dans la pile PC Stack POP PC restaure le contenu des registres STACKA (16 bits) et STACKP (8 bits) POP PC ; AX0=STACKA ; AY0=STACKP ; CD\DDA\Cours\Chap5.doc // restaure les registre STACKA et STACKP // 16 bits des poids faibles // 8 bits des poids forts SEQUENCEUR DE PROGRAMME Page 18 5.6.2.2 Piles de boucle (LOOP BEGIN Stack, LOOP END Stack, COUNT Stack) PUSH LOOP sauvegarde le contenu des registres STACKA (16 bits) et STACKP (8 bits) dans la pile LOOP BEGIN Stack, et le contenu du registre CNTR dans la pile COUNT Stack. Les 16 bits de LPSTACKA sont sauvegardés dans les 16 bits de poids faibles de la pile LOOP END Stack. Les 8 bits de poids faibles de LPSTACKP sont sauvegardés dans les 8 bits de poids forts de la pile LOOP END Stack. Les bits 8 à 14 de LPSTACKP doivent être forcés à « 0 ». Le 15ème bit (MSB) s’il est « 0 » défini la condition CE (boucle finie) ou s’il est « 1 » la condition FOREVER (boucle infinie) CNTR=27 ; STACKA=0x3521 ; STACKP=0x02 ; LPSTACKA=0x3521 ; LPSTACKP=0x0002 ; PUSH LOOP ; // nombre d’itérations de la boucle // 16 bits des poids faibles d’adresse de début // 8 bits des poids forts d’adresse de début // 16 bits des poids faibles d’adresse de fin // 8 bits des poids forts d’adresse de fin // sauvegarde dans les piles LOOP BEGIN Stack, // LOOP END Stack COUNT Stack POP LOOP restaure le contenu des registres STACKA (16 bits), STACKP (8 bits) LPSTACKA (16 bits), LPSTACKP (16 bits) et CNTR POP LOOP ; AX0=STACKA ; AY0=STACKP ; AX1=LPSTACKA ; AY1=LPSTACKP ; // restaure le contenu des piles LOOP BEGIN Stack, // LOOP END Stack COUNT Stack // 16 bits des poids faibles d’adresse de début // 8 bits des poids forts d’adresse de début // 16 bits des poids faibles d’adresse de fin // 8 bits des poids forts d’adresse de fin // AY1[15] contient la condition de boucle (0=CE, 1=FOREVER) 5.6.2.3 Pile d’état (Status stack) : 16 words × 32 bits PUSH STS sauvegarde le contenu des registres ASTAT (9 bits) et MSTAT (7 bits) dans la pile STATUS Stack PUSH STS ; // sauvegarde dans la pile STATUS Stack de ASTAT : MSTAT POP STS restaure le contenu des registres ASTAT (9 bits) et MSTAT (7 bits) POP STS ; 5.6.3 // restaure le contenu de la pile STATUS Stack // dans les registres ASTAT et MSTAT Etat des piles Le registre d’état SSTAT permet de connaître l’état d’occupation de l’ensemble des piles. − Pile PC vide. Le flag PCSTKEMPTY (SSTAT[0]) indique que la pile PC contient au moins une adresse sauvée − Pile PC pleine. Le Flag PCSTKFULL (SSTAT[1]) indique que la pile PC contient au moins une position non occupée − Niveau de la pile PC. Le flag PCSTKLVL (SSTAT[2]) indique que la pile PC contient entre 3 et 28 positions occupées − Pile de boucle vide. Le Flag LPSTKEMPTY (SSTAT[4]) indique que la pile de boucle contient au moins une position occupée − Pile de boucle pleine. Le Flag LPSTKFULL (SSTAT[5]) indique que la pile de boucle contient au moins une position non occupée CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME Page 19 − Pile d’état vide. Le Flag STSSTKEMPTY (SSTAT[6]) indique que la pile d’état contient au moins une position occupée − Dépassement dans une ou plusieurs piles. Le Flag STKOVERFLOW (SSTAT[7]) indique qu’une pile au moins voit son contenu dépasser le nombre de positions allouées 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 Reset = b#0000 0000 PCE(PC stack empty) 0 = PC stack has a pushed address 1 = PC stack is empty PCF (PC stack full) 0 = PC stack has an empty location 1 = PC stack is full PCL (PC stack level) 0 = PC stack has 3–28 pushed address 1 = PC stack has hit high/low watermark Reserved LSE(Loop stack empty) 0 = Loop stack has a pushed address 1 = Loop stack is empty LSF (Loop stack full) LSF (Loop stack full) 0 = Loop stack has an empty location 1 = Loop stack is full SSE (Status stack empty) SSE(Status stack empty) 0 = Status stack has a pushed status 1 = Status stack is empty SOV (Stack overflowed) SOV (Stack overflowed) 0 = No stack overflow or underflow 1 = Stack overflow (PC, loop, counter, or status or stack underflow (PC or status)) Figure 5-6 : Registre d’état des piles SSTAT CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME 5.7 Page 20 RÉSUMÉ DES INSTRUCTIONS PROPRES AU SÉQUENCEUR DE PROGRAMME Le tableau ci-dessous est un résumé des instructions propres au séquenceur de programme Instruction DO <Reladdr12> UNTIL [CE, FOREVER]; [IF COND] JUMP <Reladdr13> [(DB)]; CALL <Reladdr16> [(DB)]; JUMP <Reladdr16> [(DB)]; [IF COND] LCALL <Addr24>; [IF COND] LJUMP <Addr24>; [IF COND] CALL <Ireg> [(DB)]; [IF COND] JUMP <Ireg> [(DB)]; [IF COND] RTI [(DB)]; [IF COND] RTS [(DB)]; PUSH |PC, LOOP, STS|; POP |PC, LOOP, STS|; FLUSH CACHE; SETINT <Imm4>; CLRINT <Imm4>; NOP; IDLE; ENA | MM, AS, OL, BR, SR, SD, INT |; DIS | MM, AS, OL, BR, SR, SD, INT |; Abréviations pour les flags de SSTAT : Flag du registre d’état SSTAT LE LF PE PF * * * * * * * * * * * * * * * * * * * * * * LE = LPSTKEMPTY LF = LPSTKFULL PE = PCSTKEMPTY PF = PCSTKFULL PL = PCSTKLVL SE = STSSTKEMPTY SO = STKOVERFLOW Tableau 5-12 : Instructions propres au séquenceur CD\DDA\Cours\Chap5.doc PL * * * * * * * * - SE * * * - SO * * * * * * * * - SEQUENCEUR DE PROGRAMME 5.8 5.8.1 Page 21 CONTRÔLEUR D’INTERRUPTIONS Généralités Le cœur de l’ADSP21992 gère 16 lignes d’interruption. Il y a 4 lignes dédiées aux interruptions internes et 12 lignes liées aux interruptions des périphériques. Les sources d’interruptions pouvant être générées par les périphériques sont au nombre de 32 dont plus de la moitié sont réservées. Le contrôleur d’interruptions des périphériques est l’élément qui fait le lien entre les 12 lignes d’interruption mises à disposition par le cœur de l’ADSP21992 et les 32 sources issues des périphériques. Une interruption interne peut être déclenchée, par exemple, par une pile pleine (stack overflow) ou lorsque le programme écrit (force un bit à 1) dans le registre de mémorisation des interruptions IRPTL (interruption software). Plusieurs facteurs contrôlent la réponse du DSP à une interruption. Le DSP répond à une demande d’interruption si les conditions suivantes sont remplies : − − − − le DSP est en train d’exécuter une instruction ou se trouve en état de veille (Idle), l’interruption n’est pas masquée, les interruptions sont globalement activées (GIE : ICNTL[5]), une demande d’interruption avec une priorité plus élevée n’est pas pendante. Lorsque le DSP répond à une interruption, le séquenceur de programme provoque un branchement avec un call à l’adresse correspondante de la table des vecteurs d’interruption selon le déroulement suivant : − détermine l’adresse appropriée du vecteur d’interruption, − sauve la prochaine valeur (adresse de retour) du compteur de programme (PC) dans la pile PC (PC stack), − sauve les valeurs courantes des registres ASTAT et MSTAT dans la pile d’état (Status stack), − force à « 0 » le bit correspondant à l’interruption activée dans le registre de mémorisation des interruptions (IRPTL). A la fin de la routine d’interruption, lors de l’exécution de l’instruction RTI, le séquenceur de programme effectue les tâches suivantes : − restaure la valeur (adresse de retour) du compteur de programme dans la dernière position de la pile PC (PC stack), − restaure les valeurs des registres ASTAT et MSTAT contenues dans les deux dernières positions de la pile d’état (Status stack). Les interruptions masquées, si elles se produisent, sont sauvegardées dans le registre de mémorisation des interruptions IRPTL et dans un des registres d’identification des sources d’interruptions (INTRDxL et INTDxH). Si ces interruptions ne sont pas masquées, elles seront traitées dans l’ordre de priorité. Les sources d’interruption peuvent être masquées globalement ou séparément à l’aide des registres ICNTL et IMASK. − Activation / masquage global des interruptions à l’aide du flag GIE (ICNTL[5]). « 0 » provoque le masquage des interruptions, « 1 » provoque l’activation des interruptions. Les interruptions ayant pour source l’Emulateur et le Reset ne sont pas masquables. ENA INT ; DIS INT CD\DDA\Cours\Chap5.doc // activation globale des interruptions : mise à 1 du bit INCTL[5] (bit GIE) // masquage globale des interruptions : mise à 0 du bit INCTL[5] (bit GIE) SEQUENCEUR DE PROGRAMME Page 22 − Activation / masquage sélectif des interruptions à l’aide du registre IMASK[0…15]. Lors d’un Reset, par défaut toutes les interruptions masquables sont masquées. Comme indiqué plus haut, lorsqu’une source d’interruption est activée, le registre de mémorisation des interruptions (IRPTL) enregistre cette interruption en forçant à 1 le bit correspondant. Les bits de ce registre indiquent donc toutes les interruptions en cours de traitement ou pendantes. Ce registre étant accessible autant en lecture qu’en écriture, il est possible d’annuler ou de forcer une interruption de manière software. SETINT n ; CLRINT n ; // mise à 1 du bit IRPTL[n] : interruption software de priorité n // mise à 0 du bit IRPTL[n] : annulation de l’interruption de priorité n Dès qu’une interruption est prise en compte et exécutée, le séquenceur de programme force le bit correspondant à « 0 » dans le registre IRPTL de manière à permettre la détection d’une nouvelle interruption aussi vite que possible. Les priorités données aux interruptions permettent de définir l’ordre de traitement des interruptions lorsque plusieurs d’entre elles sont actives en même temps. Dans le cas d’interruptions imbriquées, une interruption en cours d’exécution peut être stoppée afin de traiter une interruption dans la priorité est plus élevée. Le séquenceur de programme utilise trois registres (ICNTL, IMASK, IRPTL) pour gérer les interruptions imbriquées. ENA INT ; DIS INT − // activation globale des interruptions : mise à 1 du bit INCTL[5] (bit GIE) // masquage globale des interruptions : mise à 0 du bit INCTL[5] (bit GIE) Activation des interruptions imbriquées en forçant à « 1 » le flag INE (ICNTL[4]). AR=ICNTL AR=SETBIT 4 of AR ; // interruptions imbriquées : mise à 1 du bit INCTL[4] (bit INE) ICNTL=AR ; − Le registre de masquage des interruptions IMASK est directement lié à la table d’interruption. Chacun des 16 bits de ce registre correspond aux 16 positions de la table d’interruption. La priorité la plus haute correspond à IMASK[0] et la plus basse à IMASK[15]. IMASK=0x1A8 ; − // (b#000110101000) activation des interruptions de priorité 3, 5, 7, 8 Le registre de mémorisation des interruptions IRPTL a la même configuration que le registre IMASK. IRPTL sert à mémoriser les interruptions activées afin d’en assurer le traitement lorsque le séquenceur de programme en donne l’ordre. ENA INT ; DIS INT // activation globale des interruptions : mise à 1 du bit INCTL[5] (bit GIE) // masquage globale des interruptions : mise à 0 du bit INCTL[5] (bit GIE) Lorsqu’une interruption de même priorité que celle en cours de traitement à lieu, la seconde interruption ne sera traitée qu’à la fin de l’exécution de la première. Lorsque les interruptions imbriquées ne sont pas autorisées, une interruption de priorité plus élevée que celle en cours d’exécution ne peut interrompre l’exécution de cette dernière. Dans ce cas, l’interruption la plus prioritaire n’est prise en considération que lorsque l’interruption en cours à été complètement traitée. L’activation des interruptions imbriquées doit se faire hors interruption CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME 5.8.2 Page 23 Registres dédiés à la gestion des lignes d’interruption La gestion des lignes d’interruption se fait au travers d’un certain nombre de registres dont la description est faite dans les paragraphes ci-dessous. 5.8.2.1 Flag de masquage global des interruptions Le registre INCTL contient un bit permettant le contrôle global des interruptions du cœur du DSP et de ses périphériques. ICNTL 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Reset = 0x0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 INE (Interrupt nesting mode enable) 0= 1= Disabled Enabled GIE (Global interrupt enable) 0= Disabled 1= Enabled PCSTKE (PCstack interrupt enable) 0= Disabled 1= Enabled Figure 5-7 : Registre de masquage général des interruptions 5.8.2.2 Registre de masquage des interruptions IMASK Les lignes d’interruptions USR0 à USR11 sont activées ou non dans le registre de masquage des interruptions du cœur du DSP, soit le registre IMASK. IMASK USR0 USR1 USR2 USR4 USR3 USR5 USR6 USR7 USR8 USR10 USR9 USR11 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Reset = 0x0000 EMU (Emulator–NMI) Highest priority PWDN(Powerdown–GIEmaskable) KERNEL (emulator kernel) STACK (Stack interrupt) From PC stack push/pop, PC stack watermark, PC or status stacks underflow, or any stack overflows UDI (User Defined Interrupts) one interrupt per bit; bit 15 has lowest priority Figure 5-8 : Registre de masquage des interruptions 5.8.2.3 Registre de mémorisation des interruptions IRPTL Lorsqu’une source d’interruption est activée, le registre IRPTL mémorise cette demande. L’assignation des bits du registre IRPTL est identique à celle de IMASK USR0 USR1 USR2 USR4 USR3 USR5 USR6 USR7 USR8 USR10 USR9 USR11 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IRPTL Reset = 0x0000 EMU PWDN KERNEL STACK UDI Figure 5-9 : Registre de mémorisation des interruptions CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME Page 24 5.8.2.4 Registre d’attribution des priorités des interruptions des périphériques Le contrôleur d’interruptions des périphériques est conçu pour gérer les 32 sources d’interruptions possibles issues des périphériques. Pour chaque source d’interruption, un code de 4 bits permet d’allouer une des 12 lignes d’interruption du cœur de l’ADSP21992 à la source d’interruption considérée. Pour réaliser cette opération il faut donc 8 registres de 16 bits (Interrupt Priority Registers :IRP0, …, IRP7). Chaque registre contient donc 4 codes de 4 bits fixant la position de la source d’interruption dans la table d’interruption. 15 14 13 12 11 10 9 1 1 1 1 1 1 1 8 7 6 5 4 3 2 1 0 IPR0 IO[0x01:0x0200] IPR7 IO[0x01:0x0207] 1 1 1 1 1 1 1 1 1 Reset = 0x1111 Priority Priority Priority Priority Figure 5-10 : Registres des priorités des interruptions pour les périphériques Le code 0x0 correspond donc à la position USR0 de la table d’interruption et par conséquent à la priorité la plus élevée pour les périphériques alors que le code 0xB correspond à la position USR11 soit la priorité la plus basse. Les codes 0xC à 0xF correspondent à un masquage de la source d’interruption. 5.8.2.5 Registres de masquage individuel des interruptions des périphériques Le contrôleur d’interruptions des périphériques propose deux registres PIMASKH et PIMASKL (Peripheral Interrupt MASK High or Low) permettant le masquage individuel des 32 sources d’interruptions des périphériques. PIMASKL IO[0x01:0x0208] 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 PIMASKM IO[0x01:0x0209] Reset = 0x1111 1 = unmasked 0 = masked Figure 5-11 : Registres de masquage des interruptions des périphériques Il y a donc 3 manières de masquer les interruptions en provenance des périphériques. 1. Dans le registre de masquage IMASK (IMASK[4] à IMASK[15]). 2. Dans les registres IRP0 à IRP7 en écrivant entre 0xC et 0xF pour les 4 bit de code. 3. Dans les registres PIMASKH et PIMASKL. 5.8.2.6 Registres d’identification des sources d’interruptions Douze doubles registres de 16 bits chacun (INTRDxH : INTRDxL, x=[0…11]) sont dédicacés au contrôleur d’interruptions des périphériques. Ces registres permettent de définir la source d’une interruption lorsque plusieurs d’entre-elles ont la même priorité. Par exemple si les interruptions PWMSYNC_IRQ et TMR1_IRQ ont le même niveau de priorité USR0, il va être possible de déterminer laquelle de ces deux sources d’interruptions est active en observait le bit INTRD0H[5] pour le Timer 1 et le bit INTRD0L[8] pour le PWM. Les registres INTRDxH et INTRDxL sont en lecture seulement. CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME Page 25 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 INTRD0L IO[0x01:0x0210] INTRD11H IO[0x01:0x0227 0 0 0 0 0 0 0 0 0 0 Reset = 0x0000 0 0 0 0 0 0 Read only Figure 5-12 : Registre des sources interruptions propres aux périphériques 5.8.3 Sources d’interruption pour les périphériques Le tableau ci-dessous illustre l’ensemble des sources d’interruption dédiées à l’ADSP21992. IPMASK IPMASKL[0] IPMASKL[1] IPMASKL[2] IPMASKL[3] IPMASKL[4] IPMASKL[5] IPMASKL[6] IPMASKL[7] IPMASKL[8] IPMASKL[9] IPMASKL[10] IPMASKL[11] IPMASKL[12] IPMASKL[13] IPMASKL[14] IPMASKL[15] IPMASKH[0] IPMASKH[1] IPMASKH[2] IPMASKH[3] IPMASKH[4] IPMASKH[5] IPMASKH[6] IPMASKH[7] IPMASKH[8] IPMASKH[9] IPMASKH[10] IPMASKH[11] IPMASKH[12] IPMASKH[13] IPMASKH[14] IPMASKH[15] Registre IPR IPR0[3 :0] IPR0[7 :4] IPR0[11 :8] IPR0[15 :12] IPR1[3 :0] IPR1[7 :4] IPR1[11 :8] IPR1[15 :12] IPR2[3 :0] IPR2[7 :4] IPR2[11 :8] IPR2[15 :12] IPR3[3 :0] IPR3[7 :4] IPR3[11 :8] IPR3[15 :12] IPR4[3 :0] IPR4[7 :4] IPR4[11 :8] IPR4[15 :12] IPR5[3 :0] IPR5[7 :4] IPR5[11 :8] IPR5[15 :12] IPR6[3 :0] IPR6[7 :4] IPR6[11 :8] IPR6[15 :12] IPR7[3 :0] IPR7[7 :4] IPR7[11 :8] IPR7[15 :12] Nom de l’interruption SPORT_RX_IRQ SPORT_TX_IRQ SPI_IRQ PWMSYNC_IRQ PWMTRIP_IRQ EIU0TMR_IRQ EIU0_LATCH_IRQ EIU0ERR-IRQ ADC0_IRQ TMR0_IRQ TMR1_IRQ TMR2_IRQ MEMDMA_IRQ FIOA_IRQ FIOB_IRQ AUXSYNC_IRQ AUXTRIP_IRQ Source d’interruption Réception sur SPORT Transmission sur SPORT Réception/transmission sur SPI Réservé Réservé Réservé Réservé Réservé Synchronisation du PWM Désactiv. des sorties du PWM Réservé Réservé Interface encodeur : Timer Interface encodeur : Acq./mémo. Interface encodeur : Erreur Fin de conversion du conv. A/N Réservé Réservé Réservé Réservé Timer 0 Timer 1 Timer 2 DMA Flag des I/0 A Flag des I/0 A Synchronisation du PWM aux. Désactiv. des sorties du PWM aux Réservé Réservé Réservé Réservé Tableau 5-13 : Source des interruptions propres aux périphériques CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME 5.8.4 Page 26 Table des vecteurs d’interruptions La mémoire RAM de programme PM du block 0 de l’ADSP21992 se situe aux plages d’adresses comprises entre 0x00 0000 et 0x00 7FFF. Ces positions mémoires ont une largeur de 24 bits. Les positions inférieures (0x00 0000 sont réservées à la table d’interruptions. Chaque plage de 32 positions mémoires est réservée à une source d’interruption précise. Pour des routines d’interruption trés courtes, il est possible de loger toutes les instructions dans la plage s’y rapportant. Par contre, comme c’est généralement le cas, pour des routines d’interruption dépassant 32 lignes d’instruction, il est nécessaire de loger ces dernières à un autre endroit de la mémoire de programme. Dans ce cas la seule instruction à placer dans la table d’interruption est JUMP <nom du label de la routine d’interruption>. Certaine interruptions ne sont pas masquables (NMI) minimum ← Priorité → maximum Zone d’adresse mémoire Nom de l’interruption Source d’interruption PM 0x00:0000 PM 0x00:001F mem_INT_RSTI Reset (non masquable) PM 0x00:0020 PM 0x00:003F mem_INT_PWRDWN Powerdown (non masquable1) PM 0x00:0040 PM 0x00:0060 PM 0x00:0080 PM 0x00:00A0 PM 0x00:00C0 PM 0x00:00E0 PM 0x00:0100 PM 0x00:0120 PM 0x00:0140 PM 0x00:0160 PM 0x00:0180 PM 0x00:01A0 PM 0x00:005F PM 0x00:007F PM 0x00:009F PM 0x00:00BF PM 0x00:00DF PM 0x00:00FF PM 0x00:11F PM 0x00:13F PM 0x00:15F PM 0x00:17F PM 0x00:19F PM 0x00:1BF mem_INT_KERNEL mem_INT_STKI mem_INT_INT4 mem_INT_INT5 mem_INT_INT6 mem_INT_INT7 mem_INT_INT8 mem_INT_INT9 mem_INT_INT10 mem_INT_INT11 mem_INT_INT12 mem_INT_INT13 Emulation Kernel Pile du PC et de boucle Périphérique (USR0) Périphérique (USR1) Périphérique (USR2) Périphérique (USR3) Périphérique (USR4) Périphérique (USR5) Périphérique (USR6) Périphérique (USR7) Périphérique (USR8) Périphérique (USR9) PM 0x00:01C0 PM 0x00:1DF mem_INT_INT14 Périphérique (USR10) PM 0x00:01E0 mem_INT_INT15 Périphérique (USR11) PM 0x00:1FF Tableau 5-14 : Zone de mémoire (PM block 0) contenant la table d’interruption 1 : masquable uniquement avec le flag GIE (contrôle globale des interruptions ICNTL[5] CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME 5.8.5 Page 27 Exemple : Contenu de la mémoire de programme (PM, block 0) Les adresses 0x00 :0000 à 0x00 :01FF de la mémoire de programme PM interne au DSP correspondent à la table des vecteurs d’interruption. La première instruction est un saut au début du programme commençant à l’adresse définie par le label « Start ». /* RESET: 0x000 - 0x01F */ JUMP start; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; /* Powerdown: 0x020 - 0x03F */ RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; /* Loop & PC stack: 0x040 - 0x05F */ RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; /* Emulator Kernel/single step: 0x060 - 0x07F */ RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; /* USR0: 0x080 - 0x09F */ JUMP PWMSYNC_ISR; // Saut à la routine d’interruption PWMSYNC_ISR RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; /* USR1: 0x0A0 - 0x0BF */ JUMP ADC_ISR; // Saut à la routine d’interruption ADC_ISR RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; /* USR2: 0x0C0 - 0x0DF */ JUMP TIMER1_ISR // Saut à la routine d’interruption TIMER1_ISR RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; /* USR3: 0x0E0 - 0x0FF */ RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; . . . . /* USR10: 0x1C0 - 0x1DF */ RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; /* USR11: 0x1E0 - 0x1FF */ RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; RTI; CD\DDA\Cours\Chap5.doc SEQUENCEUR DE PROGRAMME BIBLIOGRAPHIE [1] ADSP-219X DSP INSTRUCTION SET REFERENCE Revision 1.1, August 2003 Part Number 82-000390-07 [2] ADSP-2199X MIXED SIGNAL DSP CONTROLLER HARDWARE REFERENCE Préliminary Revision 0, 2003 Part Number 82-000640-01 [3] MIXED-SIGNAL AND DSP DESIGN TECHNIQUES Analog Devices, Inx Edited by Walt Kester ISBN 0-7506-7611-6 CD\DDA\Cours\Chap5.doc Page 28