programacion del dsp tms320f280049...
TRANSCRIPT
PROGRAMACION del DSPTMS320F280049
L. Escobar
LENGUAJES:
- Ensamblador - Punto fijo: 16 y 32b - Punto Flotante IEEE 754- Lenguaje C - Funciones inline - Librerias- Mixto: C y ensamblador
Algoritmo Básico del PDS: La convolución
** En Lenguaje Ensamblador
ZAPA ; ACC = 0, P = 0
RPT #N-1 ; Repite N veces la ; siguiente instrucción || MAC P,*XAR1++,*AR7++ ; multiplica ; y acumula ADDL ACC,P ; Suma último producto
/* En lenguaje C */
y=0
for (i = 1; i < N-1; i++){ y += h[i] * x[i] }
x(n)x(n)
x(n-1)x(n-2)x(n-3)x(n-4)
n-1 nn-2n-3n-4
y (n )=∑i=0
N−1
h ( i)x ( n−i )
y(n)y(n)
y(n-1)y(n-2)y(n-3)y(n-4)
n-1 nn-2n-3n-4
Salida
Entrada
L. Escobar
Comparación: Lenguaje ensamblador y CProducto punto entre vectores
#include <archivo.h>
int x[N]={1,2,3,4,5}; int h[N]={1,2,3,2,1}; int y, i; int *apx, *apy ; #define N 4
Main() { apx = &x; apy = &h; y = 0; for(i=0;i < N, i++) y = y + *apx++ * *aph++
}
.mmregs .global _c_int00
.datax .word 1,2,3,4,5 h .word 1,2,3,2,1y .word 0
N .set 5
.text MOVL XAR1,#x MOVL XAR2,#h MOVL ACC, #0 RPT #N-1|| MAC P,*XAR1++,*AR7++ ADDL ACC,P MOVL DP,#y MOVL @y, ACC .end
Generalidades
Programa Principal
LENGUAJE ENSAMBLADOR
DIRECTIVAS de Ensamblador
INSTRUCCIONES de Ensamblador
SINTAXIS
Etiqueta Comando Op,Op,Op,.. ; Comentarios
Comando
.mmregs ; reconoce abreviaturas de registros map.N .set 99 ; declara N = constante = 99 dx .word 0ABh ; Reserva y escribe una loc. Para x
MOV AL, #0 ; AL = 0 MOV AL,@datA ; Carga a AL el dato datA ADD AL,@datB ; AL = AL + datB MOV @datC,AL ; Almacena AL en localización de datC
DIRECTIVAS DE ENSAMBLADOR[ TMS320C28x Assembly Language Tools User’s Guide (SPRU513) ]
DIRECTIVAS DE ENSAMBLADOR[ TMS320C28x Assembly Language Tools User’s Guide (SPRU513) ]
DIRECTIVAS DE ENSAMBLADOR
DIRECTIVAS DE ENSAMBLADOR[ TMS320C28x Assembly Language Tools User’s Guide (SPRU513) ]
DIRECTIVAS DE ENSAMBLADOR
[ TMS320C28x Assembly Language Tools User’s Guide (SPRU513) ]
Desarrollo de un Proyecto Archivos
Ensamblador Lenguaje C Librerías Comandos de ligado
Generar un Proyecto Abrir un proyecto nuevo Agregar archivos Opciones de: compilado, ensamblado y ligado Compliar / ensamlar Ligar Bajar el código a la tarjeta
L. Escobar
Generación de un proyecto
Archivos.asm
SIM
Archivo.c
DSK EVM
Librerias
Archivo.out
Ensamblar
XDS DSP
Archivo.obj
Archivo.cmd
Compilar
Ligar
Archivo.obj
L. Escobar
MEMORYMEMORY
{{
PAGE 0:PAGE 0:
VECS: org=0080h, len=007fh /*vect. int*/VECS: org=0080h, len=007fh /*vect. int*/
PROG: org=0100h, len=2B00h /* programa*/PROG: org=0100h, len=2B00h /* programa*/
PAGE 1:PAGE 1:
DATOS: org=2C00h, len=13ffh /* dato*/DATOS: org=2C00h, len=13ffh /* dato*/
}}
SECTIONSSECTIONS
{{
.vectors : load = VECS PAGE 0.vectors : load = VECS PAGE 0
.text > PROG PAGE 0.text > PROG PAGE 0
.data > DATOS PAGE 1.data > DATOS PAGE 1
.bss > DATOS PAGE 1.bss > DATOS PAGE 1
.stack > DATOS PAGE 1.stack > DATOS PAGE 1
}}
Mem_Dato
Mem_ProgPAGE 0PAGE 0
PAGE 1PAGE 1
0080h0080h
0100h0100h
2C00h2C00h
ARCHIVO DE COMANDOS .CMD ARCHIVO DE COMANDOS .CMD
ASOCIAR MEMORIA CON ARCHIVO .CMDASOCIAR MEMORIA CON ARCHIVO .CMD
L. Escobar
.data ; Datos
D1 .word 1,2,3,4D1 .word 1,2,3,4
total .word 0total .word 0
.text ; Código
DP = #D1DP = #D1
A = #0A = #0
AR0 = #D1AR0 = #D1
repeat(#4) repeat(#4)
A = A + *AR0+A = A + *AR0+
@total = A @total = A
FIN NOPFIN NOP
GOTO FINGOTO FIN
.end.end
..sect " vectors“
.ref _main .ref _main
.ref _c_int00 .ref _c_int00
.ref _inttimer.ref _inttimer
reset: b _c_int00reset: b _c_int00
nopnop
nopnop
.space 72*16 .space 72*16
tint0: b _inttimertint0: b _inttimer
nop nopnop nop
.end.end
MEMORYMEMORY
{{
PAGE 0:PAGE 0:
VECS: org=0080h, len=007fh /*VECS: org=0080h, len=007fh /*vect. int*/*/
PROG: org=0100h, len=2B00h /* PROG: org=0100h, len=2B00h /* programa*/*/
PAGE 1:PAGE 1:
DATOS: org=2C00h, len=13ffh /* DATOS: org=2C00h, len=13ffh /* datos */*/
}}
SECTIONSSECTIONS
{{
.vectors : load = VECS PAGE 0.vectors : load = VECS PAGE 0
.text > PROG PAGE 0.text > PROG PAGE 0
.data > DATOS PAGE 1.data > DATOS PAGE 1
.bss > DATOS PAGE 1.bss > DATOS PAGE 1
.stack > DATOS PAGE 1.stack > DATOS PAGE 1
}}
LIGADO DE ARCHIVOS
L. Escobar
CREAR UN PROYECTO CON CCS de TEXAS INSTRUMENTS
LLENAR INFORMACION DEL NUEVO PROYECTO
CREAR UN PROYECTO CON CCS
Botones de construir y cargar
PROYECTO: Creado y ensamblado. (Listo para ejecutarse)
Botones de correr un programa
Con los ejemplos del libro LES* (pag. 65):
- Realizar un proyecto
- Construir un proyecto
- Cargar un programa
- Correr un programa
- Visualizar memoria dato
- Graficar memoria
Ejemplos
L. Escobar
[ Arquitecturas de DSP TMS320F28xxx y Aplicaciones ]
L. Escobar
.global _c_int00 ; Símbolo global para inicio de código .data ; Sección de datos WDCR .set 07029h ; Dirección registro de control WatchDogCTE_WD .set 0068h ; Constante para desactivar el WatchDog D1 .set 1 ; Se define D1 = constante = 1 enteroD2 .set 2 ; Se define D2 = constante = 2D3 .set 3 ; Se define D3 = constante = 3D4 .set 4 ; Se define D4 = constante = 4D5 .set 5 ; Se define D5 = constante = 5total .word 0 ; Aparta una localidad para variable total =0 * SECCION DE CODIGO .text ; Sección de código _c_int00 ; Inicio de código
* Deshabilitación del WatchDog EALLOW ; Habilita escritura a registros protegidos MOVL XAR1, #WDCR ; Registro XAR1 apunta dir, WDCR MOV *XAR1,#0068h ; Desactiva WatchDog, escribe en WDCR EDIS ; Deshabilita escritura a registros protegidos* MOVW DP, #total ; Apuntador de página de datos en página de ; variable total MOV ACC, #D1 ; Mueve D1 a acumulador ADD ACC, #D2 ; Suma D2 a acumulador ADD ACC, #D3 ; Suma D3 a acumulador ADD ACC, #D4 ; Suma D4 a acumulador ADD ACC, #D5 ; Suma D5 a acumulador MOV @total, AL ; Salva la suma AL en localidad totalREGRESA NOP ; Ciclo infinito para fin de programa LB REGRESA .end ; Fin de ensamblado
Suma varias constantes en modo inmediato
L. Escobar
.global _c_int00 ; Símbolo global para inicio de código .data ; Sección de datos x1 .word 1 ; Aparta una localidad para variable x1 ; y la inicializa con el valor 1 x2 .word 2 ; Aparta una localidad para variable x1 ; y la inicializa con el valor 2x3 .word 3 x4 .word 4 x5 .word 5 total .word 0 ; Aparta una localidad para variable total y la inicializa con 0 .text ; Sección de código _c_int00 MOVW DP, #total ; Apuntador de página de datos en página de total MOV ACC, @x1 ; Mueve dato x1 a acumulador ADD ACC, @x2 ; Suma x2 a acumulador ADD ACC, @x3 ; Suma x3 a acumulador ADD ACC, @x4 ; Suma x4 a acumulador ADD ACC, @x5 ; Suma x5 a acumulador MOV @total, ACC ; Salva la suma AL en localidad totalREGRESA NOP ; Ciclo infinito para fin de programa LB REGRESA .end ; Fin de ensamblado
Suma varios datos en modo directo
L. Escobar
.global _c_int00 .dataN .set 5D .word 1,2,3,4,5 ; Aparta cinco localidades para el vector ; de datos D y le escribe los valores 1,2,3,4,5 total .word 0 .text_c_int00 MOVL XAR1,#D ; Registro XAR1 apunta al arreglo D MOV ACC, *XAR1++ ; Carga ACC con el dato apuntado por XAR1 ; Postincrementa XAR1: XAR1 = XAR1 + 1 ADD ACC,*XAR1++ ; ACC = ACC + dato apuntado por XAR1 ; XAR1 = XAR1 + 1 ADD ACC,*XAR1++ ; ACC = ACC + dato apuntado por XAR1 ; XAR1 = XAR1 + 1 ADD ACC,*XAR1++ ; ACC = ACC + dato apuntado por XAR1 ; XAR1 = XAR1 + 1 ADD ACC,*XAR1++ ; ACC = ACC + dato apuntado por XAR1 ; XAR1 = XAR1 + 1, apunta a loc. total MOV *XAR1,AL ; Guarda la parte baja del acumulador en totalREGRE NOP LB REGRE .end
Suma varios datos en modo indirecto
total= ∑i=0
N−1
x ( i)
L. Escobar
.global _c_int00 .dataN .set 5D .word 1,2,3,4,5 ; Aparta cinco localidades para el vector de ; datos D y le escribe los valores 1,2,3,4,5total .word 0 .text_c_int00 MOVL XAR1,#D ; Registro XAR1 apunta al arreglo D MOV ACC, #0 ; Se limpia acumulador RPT #N-1 ; Repite N veces #N la siguiente instrucción || ADD ACC,*XAR1++ ; ACC = ACC + dato apuntado por XAR1 ; XAR1 = XAR1 + 1 MOVW DP,#total ; Ubica al DP donde se encuentra la página total MOV @total,AL ; Guarda la parte baja del acumulador en totalREGRESANOP LB REGRESA .end
Suma varios datos en modo indirecto con instrucción RPT
total= ∑i=0
N−1
x ( i)
DIRECCIONAMIENTO CIRCULAR
L. Escobar
L. Escobar
Modo de direccionamiento de buffer circular
* Suma 15 veces los datos x .global _c_int00 .global _main .datax .word 1,2,3,4,5,6,7,8,9,10y .word 0NB .set 10N2 .set 150suma .word 0 .text_main:_c_int00 SETC SXM ; Modo extensión de signo CLRC AMODE ; Bit AMODE = 0 MOV AR1,#NB-1 ; AR1 = longitud del buffer - 1 MOVL XAR6,#x ; XAR6 apunta a dir. inicio de x ZAPA ; Cero a ACC y P RPT #N2-1 ; Repite siguiente instrucción 150 veces || ADD ACC,*XAR6%++ ; ACC = ACC + dato apuntado por XAR6 ; XAR6 = XAR6 + 1 en forma circular MOVW DP,#suma ; DP = página de suma MOV @suma, AL ; Guarda resultado en loc. sumaFIN_S NOP LB FIN_S .end
L. Escobar
Instrucciones básicas a 16 bits
Instrucciones varias a 16 bits
Instrucciones para máximos y mínimos
Operaciones de multiplicación
Instrucciones de multiplicación a 16 bits
Producto punto entre vectores
.global _c_int00 ; símbolo global para inicio del ; programa .data ; sección de datosx .word 1,2,3,4,5,6,7,8,9,10 ; datos del vector xh .word 1,2,1,2,1,2,1,2,1,2 ; datos del vector htotal .word 0 ; resultado N .set 10 ; define N = 10 = constante WDCR .set 07029h ; dir. de registro de Control WatchDog
.text ; sección de código_c_int00 ; inicia el código SETC SXM ; modo extensión de signo SPM #0 ; sin corrimiento en el multiplicador MOVW DP,#total ; carga a DP página de total MOVL XAR1,#x ; XAR1 apunta a dir_r MOVL XAR7,#h ; XAR7 apunta a dir_h MOV AR0,#N-1 ; AR0 = N, para contador de ciclo ZAPA ; ACC = 0, P =0CICLO_P1 MOV T,*XAR1++ ; T = dato apuntado por XAR1 ; XAR1 = XAR1 + 1 MPY P,T,*XAR2++ ; P = T * dato apuntado por XAR2 ; XAR2 = XAR2 + 1 ADDL ACC,P ; ACC = ACC + P << PM BANZ CICLO_P1,*AR0-- ; Regresa a CICLO_P1 si AR0 != 0 ; AR0 = XAR0 - 1 MOVL @total,ACC ; total = AL
FIN_R NOP ; ciclo infinito LB FIN_R .end
Producto punto entre vectores
** Carga del registro T y acumula, luego multiplica. ZAPA ; ACC = 0, P =0CICLO_P1 MOVA T,*XAR1++ ; T = dato apuntado por XAR1 ; XAR1 = XAR1 + 1 ; ACC = ACC + P << PM MPY P,T,*XAR2++ ; P = T * dato apuntado por XAR2 ; XAR2 = XAR2 + 1 BANZ CICLO_P1,*AR0-- ; Regresa a CICLO_P1 si AR0 != 0 ; AR0 = XAR0 - 1 ADDL ACC,@P ; ACC = ACC + P << PM
************************************************************************** ** Carga registro T, luego multiplica y acumula. ZAPA ; ACC = 0, P =0CICLO_P1 MOV T,*XAR1++ ; T = dato apuntado por XAR1 ; XAR1 = XAR1 + 1 MPYA P,T,*XAR2++ ; ACC = ACC + P << PM ; P = T * dato apuntado por XAR2 ; XAR2 = XAR2 + 1*** ADDL ACC,P ; ACC = ACC + P << PM BANZ CICLO_P1,*AR0-- ; Regresa a CICLO_P1 si AR0 != 0 ; AR0 = XAR0 - 1 ADDL ACC,P ; ACC = ACC + P << PM
Producto punto entre vectores con MAC
.mmregs .global cint00
.datax .word 1,2,3,4,5 h .word 1,2,3,2,1total .word 0
N .set 5
.text MOVL XAR1,#x MOVL XAR7,#h MOVL ACC, #0 RPT #N-1|| MAC P,*XAR1++,*AR7++ ADDL ACC,P MOVL DP,#total MOVL @total, ACC .end
Operaciones a 32 bits
MOVL ACC,@dat32 ; Carga dat32 en ACC MOVL P,@dat32 ; Carga dat32 en P MOVL XT,*XARi++ ; Carga dato apuntado por XARi en XT MOVL XARi,@dat32 ; Carga XARi con dat32 MOVL XARi,#cte22 ; Carga XARi con una constante de 22 bits MOVL ACC,P<<PM ; Carga ACC con P con corrimiento PM MOVL P,ACC ; Carga P con ACC
MOVL @dat32,ACC ; Salva ACC en dat32 MOVL @dat32,P ; Salva P en dat32 MOVL @dat32,XT ; Salva XT en dat32 MOVL @loc32,XARi ; Salva XARi en loc32 MOVL *XAR1++,XAR6 ; Salva XAR6 en loc. puntada por XAR1
Operaciones a 32 bits
ADD ACC,#cte16<<#0-15 ; ACC = ACC + cte*2^(shift 0-15) ADD ACC,@dat16<<#0-15 ; ACC = ACC + dat*2^(shift 0-15) ADD ACC,@dat16<< T ; ACC = ACC + dat*2^(T(3..0)) ADDL ACC,@loc32 ; ACC = ACC + loc32 ADDCL ACC,@loc32 ; ACC = ACC + loc32 + acarreo C ADDL ACC,@dat<<#0-15 ; ACC = ACC + dat*2^(shift 0-15) ADDL ACC,P<<PM ; ACC = ACC + P^(PM) ADDL @loc32,ACC ; loc32 = loc32 + ACC
SUB ACC,#cte16<<#0-15 ; ACC = ACC - cte*2^(shift 0-15) SUB ACC,@dat16<<#0-16 ; ACC = ACC - dat*2^(shift 0-15) SUB ACC,@dat16<<T ; ACC = ACC - dat*2^(T(3..0)) SUBL ACC,@loc32 ; ACC = ACC - loc32 SUBBL ACC,@loc32 ; ACC = ACC - loc32 - ~C SUBL ACC,P<<PM ; ACC = ACC - P^(PM) SUBL @loc32,ACC ; loc32 = loc32 - ACC SUBRL @loc32,ACC ; loc32 = ACC - loc32
Operaciones a 32 bits
IMPYL ACC,XT,@loc32 ; ACC= Bits bajos(sig.XT + sig.loc32) IMPYL P,XT,@loc32 ; P= Bits bajos(sig.XT + sig.loc32)<<PM IMPYAL P,XT,@loc32 ; ACC = ACC + unsig(P) ; P= Bits bajos(sig.XT + sig.loc32)<<PM IMPYAL P,@loc32,*XAR7 ; ACC=ACC + unsig(P) ; P= Bits bajos(sig.loc32 + sig.loc32)<<PM IMPYSL P,XT,@loc32 ; ACC = ACC - unsig(P) ; P= Bits bajos(sig.XT + sig.loc32)<<PM
QMPYAL ACC,XT,@loc32 ; ACC=ACC + P<<PM, P=XT*loc32>>32 QMACL P,@loc32,*XAR7 ; ACC=ACC + P<<PM, P=loc32*loc32>>32 QMPYL ACC,XT,@loc32 ; ACC=XT*loc32>>32 QMPYL P,XT,@loc32 ; P=XT*loc32>>32 QMPYSL ACC,XT,@loc32 ; ACC=ACC - P<<PM, P=XT*loc32>>32
Correlación rxy
(l) entre x(n) y y(n) , l > 0
.global _c_int00 .dataN .set 500cont .word 0 ; Contador de desplazamientos lX . space N*16 ; Reserva N localidades para x(n)basx .word 0y .space N*16 ; y(n), Qih=10bash .word 0rxy .space N*16 ; rxy(l), Qiy=5. .text_c_int00 SETC SXM SPM +1 ; Qiy=Qih+Qix=Q20+Q1 =Q21 MOVW DP,#cont ; DP apunta a página de cont MOV AR4,#N-1 ; Control de ciclo CORRELA MOVL XAR5,#rxh ; Salida de datos MOVL XAR2,#h ; XAR2 con Dir. de h MOV AL,#N-1 ; MOV @cont,AL ;
CORRELA: MOVL XAR7,#x ZAPA RPT @cont ; Repite la siguiente instrucción ; cont + 1 vez || MAC P,*XAR2++,*XAR7++ ; ACC = ACC + P << 1 ; P = x(n)*y(n-l), XAR2++ y XAR7++ ; (Q21) ADDL ACC,P <<PM ; Recupera último producto MOV *XAR5++,AH ; Almacena en rxy DEC @cont ; cont = cont -1 MOVL XAR2,#h ; XAR2 con Dir. inicio de h MOV ACC,@XAR2 ADD ACC,#N SUB ACC,@cont ; Dir. XAR2 = Dir. incio + l MOV XAR2,@ACC ; Ajusta retardo ``l'' de h(l)
BANZ CORRELA,AR4--
FIN NOP LB FIN_S .end