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.