Autor Tema: C30 + dspic33 y sus divisiones  (Leído 7325 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
C30 + dspic33 y sus divisiones
« en: 29 de Marzo de 2012, 17:12:08 »
Pues nada, llevaba unos dias buscando informacion de porque el C30 no usaba el ALU que incluyen estos pics, me extraño bastante ya que se reduce considerablemente el tiempo de una division, pues al fin he encontrado la forma de hacerlo utilizando el ALU que incorpora el micro. Lo pongo aqui para el que le sea necesario, he estado haciendo pruebas y una division de 32bits/16bit usando software tarda unos 216Tcy mientras que usando el hardware tarda 25Tcy, la diferencia es bastante grande.

el codigo es el siguiente:

resultado=__builtin_divud(dividendo,divisor); seria lo equivalente a resultado=dividendo/divisor;

ahora es importante algo, si el divisor es 0 se produce un error de hardware el cual activa el vector error math. Es importante controlar este vector ya que si no lo haces el pic se resetea cada vez que se hace una division /0. Para controlarlo unicamente seria algo tan simple como:

void __attribute__((__interrupt__,no_auto_psv)) _MathError(void) {
    INTCON1bits.MATHERR=0;
    INTCON1bits.DIV0ERR=0;
}

es importante poner ambos registros a 0 ya que si no la interrupcion se repite. Ademas el resultado de la division es un resultado impredecible, seria conveniente poner un if(divisor==0) resultado=0;

Mas arriba puse el ejemplo para dividir dos unsigned de 32bit/16bit para otras divisiones con distintos signos o valores seria:

__builtin_divud(u32bit,u16bit);
__builtin_divsd(s32bit,s16bit);
__builtin_divu(u16bit,u16bit);
__builtin_divs(s16bit,s16bit);

u32 = unsigned 32bit
s32 = signed 32bit

y lo mismo con los 16bits.
Es importante el signo y los bits ya que usar distintas variables para distintas funciones produce un resultado erroneo.
« Última modificación: 29 de Marzo de 2012, 17:39:59 por MerLiNz »

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: C30 + dspic33 y sus divisiones
« Respuesta #1 en: 29 de Marzo de 2012, 18:01:39 »
Hola!

Muy interesante el aporte. Sin embargo tengo una duda en la librería libq.h viene las siguientes divisiones:

_Q16 _Q16div(_Q16,_Q16);
_Q16 _Q16divmod(_Q16,_Q16, _Q16 *);

Estas son implementadas por software? las has utilizado?

muchas gracias por tus aportes.

saludos!

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: C30 + dspic33 y sus divisiones
« Respuesta #2 en: 29 de Marzo de 2012, 18:25:48 »
No las he usado pero seguro que son por software, si una simple division la hacen por software por defecto, ese tipo de libreria seguro que tambien.

Por hardware tienes las divisiones y aparte tambien viene divisiones fraccionales pero no me preguntes que no se como funciona.

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: C30 + dspic33 y sus divisiones
« Respuesta #3 en: 29 de Marzo de 2012, 23:11:59 »
ok gracias por el dato!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: C30 + dspic33 y sus divisiones
« Respuesta #4 en: 30 de Marzo de 2012, 02:47:59 »
Interesante información, gracias paisano.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: C30 + dspic33 y sus divisiones
« Respuesta #5 en: 30 de Marzo de 2012, 10:57:48 »
La verdad es que no entiendo como el mismo fabricante del pic no hace que sus compiladores utilicen todo el hardware que lleva, sobretodo por lo que te vale el compilador que son cerca de 800€

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: C30 + dspic33 y sus divisiones
« Respuesta #6 en: 30 de Marzo de 2012, 12:52:34 »
La verdad es que no entiendo como el mismo fabricante del pic no hace que sus compiladores utilicen todo el hardware que lleva, sobretodo por lo que te vale el compilador que son cerca de 800€
tomando eso en cuenta creo que es algo que se podría consultar en un support ticket. En un descuido lo toman en cuenta

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: C30 + dspic33 y sus divisiones
« Respuesta #7 en: 30 de Marzo de 2012, 17:03:37 »
No creo que lo tomen en cuenta, por eso mismo hicieron la funcion _builtin para que la gente lo pudiese usar. El caso es que he visto varios que preguntan en el foro de microchip y comentan que el compilador es ANSI noseque.... y por eso no lo hacen de esa manera.

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: C30 + dspic33 y sus divisiones
« Respuesta #8 en: 08 de Noviembre de 2012, 14:45:03 »
Hola:

Reviviendo nuevamente este hilo. vengo con una duda.
he intentado utilizar la división :

Código: [Seleccionar]
__builtin_divs(dividendo,divisor);
me compila bien pero recibo un error del linker, el cual anexo a contiuacion:

Código: [Seleccionar]
undefined reference to `__builtin_divs'
pareceiera que hay que definir la función antes, pero nunca he trabajado con este tipo de funciones antes. Alguien sabe como hacerlas funcionar?

saludos!


Desconectado Sispic

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
Re: C30 + dspic33 y sus divisiones
« Respuesta #9 en: 08 de Noviembre de 2012, 16:34:06 »
el c30 es un poco patatero y hay conocerlo mucho para hacer algo decente.
que recuerdos

mucho asm  :D

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: C30 + dspic33 y sus divisiones
« Respuesta #10 en: 08 de Noviembre de 2012, 17:18:16 »
Hola:

Reviviendo nuevamente este hilo. vengo con una duda.
he intentado utilizar la división :

Código: [Seleccionar]
__builtin_divs(dividendo,divisor);
me compila bien pero recibo un error del linker, el cual anexo a contiuacion:

Código: [Seleccionar]
undefined reference to `__builtin_divs'
pareceiera que hay que definir la función antes, pero nunca he trabajado con este tipo de funciones antes. Alguien sabe como hacerlas funcionar?

saludos!



que pic tienes?

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: C30 + dspic33 y sus divisiones
« Respuesta #11 en: 09 de Noviembre de 2012, 17:27:54 »
hola merlinz:

se trata de un dspic30f3011, actualmente estoy utilizando al división que viene definida en al librería libq.h, pero quisiera usar una división de hardware para mas velocidad.

saludos!

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: C30 + dspic33 y sus divisiones
« Respuesta #12 en: 09 de Noviembre de 2012, 18:57:18 »
He vuelto a leer la guia del C30 y solo tiene las funciones __builtin_divsd y divud, las s y u solas no las tiene. Corrijo el mensaje para que no haya confusiones.

PD: No puedo modificar el mensaje inicial, asi que lo dejo aqui en negrita por si acaso xD
« Última modificación: 09 de Noviembre de 2012, 18:59:36 por MerLiNz »

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: C30 + dspic33 y sus divisiones
« Respuesta #13 en: 09 de Noviembre de 2012, 23:22:44 »
ok gracias por tu respuesta. He probado las que si viene y funcionan bien.

saludos!


 

anything