TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: MerLiNz 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.
-
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!
-
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.
-
ok gracias por el dato!
-
Interesante información, gracias paisano.
-
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€
-
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
-
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.
-
Hola:
Reviviendo nuevamente este hilo. vengo con una duda.
he intentado utilizar la división :
__builtin_divs(dividendo,divisor);
me compila bien pero recibo un error del linker, el cual anexo a contiuacion:
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!
-
el c30 es un poco patatero y hay conocerlo mucho para hacer algo decente.
que recuerdos
(http://img835.imageshack.us/img835/844/divl.jpg)
mucho asm :D
-
Hola:
Reviviendo nuevamente este hilo. vengo con una duda.
he intentado utilizar la división :
__builtin_divs(dividendo,divisor);
me compila bien pero recibo un error del linker, el cual anexo a contiuacion:
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?
-
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!
-
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
-
ok gracias por tu respuesta. He probado las que si viene y funcionan bien.
saludos!