TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: seba85 en 19 de Septiembre de 2013, 09:00:07

Título: Reservar espacio de memoria en XC16
Publicado por: seba85 en 19 de Septiembre de 2013, 09:00:07
Hola! Alguien sabe como reservar espacios de memoria en XC16? estoy haciendo un programa parte en assembler y parte en C y puede ser que se me estén pisando los espacios de  memoria cuando declaro las variables en C....
Gracias!
Título: Re: Reservar espacio de memoria en XC16
Publicado por: gera en 19 de Septiembre de 2013, 09:22:53
En C se usa la función malloc() para reservar memoria. Sin embargo, eso lo administra el compilador y no creo que puedas saber específicamente qué espacios de memoria está usando.
Sé que en CCS hay varias directivas de compilador para administrar el uso de memoria, pero desconozco si las hay en XC. Esperemos la respuesta de los que saben.

Saludos!
Título: Re: Reservar espacio de memoria en XC16
Publicado por: MerLiNz en 19 de Septiembre de 2013, 09:27:57
no es necesario reservar nada, el compilador se encarga de asignar memoria a cada variable, aun asi si quieres asignar manualmente memoria lo tienes que hacer con __attribute__(address(direccion))
Título: Re: Reservar espacio de memoria en XC16
Publicado por: seba85 en 19 de Septiembre de 2013, 09:39:16
Gracias por responder!!!
Si en CCS se que se puede reservar un bloque y uno le da la dirección de inicio y final del bloque, y algo así es lo que ando buscando...
pero gracias igual ya tengo algo por donde empezar, cualquier avance se los comento!
Saludos!
Título: Re: Reservar espacio de memoria en XC16
Publicado por: planeta9999 en 19 de Septiembre de 2013, 11:06:05



Mírate la documentación del Linker Script, se pueden hacer muchas cosas relacionadas con la reserva de bloques de memoria.



Título: Re: Reservar espacio de memoria en XC16
Publicado por: seba85 en 20 de Septiembre de 2013, 10:56:28
Estuve intentando usar la declaración:
fractional x[11] __attribute__((address(0x0900)));
pero cuando compilo me sale como que lo ignora...
warning: ignoring address attribute applied to automatic x
Título: Re: Reservar espacio de memoria en XC16
Publicado por: MerLiNz en 20 de Septiembre de 2013, 14:18:07
debes quitar la opcion de organizacion automatica de direcciones
Título: Re: Reservar espacio de memoria en XC16
Publicado por: seba85 en 20 de Septiembre de 2013, 16:09:01
y eso como lo hago, me mataste...jeje
en la programación de los fuses esta?
Título: Re: Reservar espacio de memoria en XC16
Publicado por: gera en 20 de Septiembre de 2013, 16:18:38
y eso como lo hago, me mataste...jeje
en la programación de los fuses esta?

No, eso es una opción del compilador. Lee el manual del XC, la sección "Auto Variable Allocation"

Saludos!
Título: Re: Reservar espacio de memoria en XC16
Publicado por: seba85 en 24 de Septiembre de 2013, 10:27:02
gracias gera! ya encontré como hacerlo y me coloca las variables donde quiero pero ahora tengo otro problema, no me realiza las funciones dsp en assembler MPY y MAC
cargo dos vectores en las posiciones de memoria x e y pero no me las realiza, no se si estoy errando en alguna configuración del dsp o como declaro los vectores en las posiciones x e y....

Código: [Seleccionar]
static fractional x[11] __attribute__((address(0x0900)));  //memoria X
static fractional h[2] __attribute__((address(0x0C00)));   //memoria Y
.
.
.
asm("MOV #0x0916,W9");
        asm("MOV #0x0900,W8");
        asm("MOV [W8],W4");
        asm("MOV #0x0C02,W10");
        asm("MOV [W10],W6");
        asm("DO #9,ENDB");
        asm("MPY W4*W6,A,[W8]+=2,W4,[W10]-=2,W6");
        asm("MAC W4*W6,A,[W8],W4,[W10]+=2,W6");
        asm("SAC.R A,#0,[W9++]");
        asm("ENDB: NOP");

Título: Re: Reservar espacio de memoria en XC16
Publicado por: MerLiNz en 24 de Septiembre de 2013, 11:39:27
asm("MOV #0x0C02,W10"); es 0x0c00? o es que decrementa?
Título: Re: Reservar espacio de memoria en XC16
Publicado por: seba85 en 24 de Septiembre de 2013, 13:58:06
el programa hace la derivad digital, en 0x0C00 y 0x0C02 tenemos el 1 y -1 (en fraccional 0x7FFF y 0xFFFF) para obtener la derivada digital de una señal x se debe hacer la convolucion con la señal h=[1 -1] (en teoría de Señales y Sistemas), que sería restarle a la muestra actual la anterior. Entonces haría lo siguiente:

MPY-->  x[0]*h[1]=A
MAC--> A+x[1]*h[0]=A
esto nos da la primera derivada digital
luego
MPY-->  x[1]*h[1]=A
MAC-->  A+x[2]*h[0]=A  
segunda derivada digital... etc
y va guardando el acumulador A en un buffer a partir de la posicion 0x0916