Autor Tema: duda sobre ciclos de reloj y operaciones matematicas  (Leído 2336 veces)

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

Desconectado RSC

  • PIC10
  • *
  • Mensajes: 23
duda sobre ciclos de reloj y operaciones matematicas
« en: 17 de Septiembre de 2016, 17:37:50 »
buenas, no estoy entendiendo un tema basico, que demora mas ciclos de reloj?, sumar un numero de 1 en 1 o multiplicar y dividir por numeros grandes? cuantos ciclos de reloj demora en verificar la condicion de un if?
saludos!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:duda sobre ciclos de reloj y operaciones matematicas
« Respuesta #1 en: 17 de Septiembre de 2016, 19:45:11 »
Suponiendo que hablamos de los PICs gama baja

Depende. Todo depende. Al final voy a dar unas palabras que va a dejar por el suelo todo lo que dije!

Incrementar y decrementar en 1 es la operacion mas rapida que podes hacer, ya que hay instrucciones para eso.
Incrementar y decrementar en mas cantidad va a depender de que tan grande sea la varaible, pero usualmente es bastante rapido tambien

Multiplicar en el caso mas simple tendrias 2 shift + 1 suma ( se incrementa la cantidad segun los bytes del resultado ) por cada bit. Es decir si tenes 2 numeros de 8bits y multiplicas lo mas simple es correr un numero fijarse si es uno el carry y luego sumar en el caso que sea 1, sino se produce otro desplazamiento. Esa seria la forma mas facil de multiplicar y dentro de todo es algo rapido. Por supuesto el compilador si es lo suficientemente inteligente puede buscar muchas formas de resolverlo, ejemplo multiplicar por 5 una variable llamada "var" seria lo mismo que hacer:

var = (var << 2) + var;

Eso hace aun mas rapido la operacion. Tambien se podria hacer por sumas sucesivas, pero si tuviera que multiplicar: 127 * 210
necesitaria como minimo 127 sumas. lo cual es un poco absurdo, mientras que con desplazamientos hubiera sido mucho mas sencillo y rapido. Y aun mas rapido hacer esto (siendo var 210):

var = (var << 7) - var;

Ahora dividir es otro cantar. Se puede hacer de distintas formas tambien, dividir por 10 , es lo mismo que multiplicarlo por 0.1 , por lo tanto si tuvieras una "tabla" o el compilador se manejara de esa forma podria simplemente multiplicar por 0.1, lo cual el algoritmo seria el de la multiplicacion.
Tambien podrias pensarlo como restas sucesivas, lo cual es valido en casos simples. Ejemplo tengo que pasar de un numero a BCD y tengo que sacar las decenas.
¿Que es mas simple? , restar 10 veces 10, o multiplicarlo por 0.1 o como se le ocurra al compilador.
Las restas sucesivas no tendrian sentido en algo asi:

78954465179810 / 10

------------------------------------------------

Hay PICs que poseen hardware para la multiplicacion normalmente son de 8x8, pero que con un poco de agregados de instrucciones logras de 16x16 bits o 16x32 sin complicarlo y de forma rapida. ( haciendo siempre multiplicaciones de 8x8 )

En fin:
Si estas programando en C como en cualquier lenguaje de alto nivel, deberia importarte poco el tema de cuantos ciclos tarda. Pero es bueno saber que podes reducirlo intentando hacer algo que es simple para el microcontrlador y no dejar que el compilador haga lo que desee a veces.

¿Como pensar de esa forma?
Conociendo al micrcontrolador, ASM es lo mejor para tratar de entender como funciona y sacarle el jugo al mismo. A pesar que no lo programes fluidamente, con conocer las instrucciones e imaginarte como tiene que hacer para realizar algo te puede dar una idea.


-------------------

Respecto a tu pregunta sobre la condicion if, va a depender de lo que tengas como condicion dentro de ese if. Una igualdad/desigualdad son 3 instruciones en ASM, Ahora si tenes varias condiciones dentro se puede complicar un poco mas y obviamente va a tener mas agregado de instrucciones.
« Última modificación: 17 de Septiembre de 2016, 19:49:39 por KILLERJC »

Desconectado RSC

  • PIC10
  • *
  • Mensajes: 23
Re:duda sobre ciclos de reloj y operaciones matematicas
« Respuesta #2 en: 17 de Septiembre de 2016, 20:49:42 »
muchas gracias por la respuesta  :lol:
es mucho mas rapido que el pic haga 3 veces algo como esto
for (p=0;p<4;p++){pas1[p]=r1[p];}
 newpaso1=atol(pas1);

a que haga esto
  hip = sqrt((x2*x2) + (y2*y2));
  alfa = atan2(y2,x2)*180.0 / 3.1415;
     beta = acos((L1*L1) - (L2*L2) +(hip*hip) / (2 * L1 * hip))*180.0 / 3.1415;
     angL1 = alfa + beta;
     gama =acos(((L1*L1)+(L2*L2)-(hip*hip))/(2*L1*L2))*180.0 / 3.1415 ;
     angL2 = gama;
       pp1=angL1/0.046875;
        pp2=(angL2/0.046875)-90;

encima para que el brazo haga una linea de 4 cm necesita hacer esos calculos 100 veces(punto por punto) :mrgreen:

cuando lo tenga mas avanzado lo voy a liberar
saludos y gracias!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:duda sobre ciclos de reloj y operaciones matematicas
« Respuesta #3 en: 18 de Septiembre de 2016, 01:20:39 »
Definitivamente el primero, es mucho mas rapido algo como esto:

Código: C
  1. for (p=0;p<4;p++){pas1[p]=r1[p];}
  2.  newpaso1=atol(pas1);

Suponiendo que en r1 etngas el dato y no tengas que esperar ..

En cambio el otro codigo es un abuso al pobre microcontrolador.
Tampoco se que micro estas usando. Si usas un PIC32 tal ves ni problemas tengas con ese codigo, pero intentaria ir por algo mas liviano xD.

Desconectado RSC

  • PIC10
  • *
  • Mensajes: 23
Re:duda sobre ciclos de reloj y operaciones matematicas
« Respuesta #4 en: 18 de Septiembre de 2016, 12:34:41 »
uso un 18f4550 ^^  si ahora el codigo esta mucho mas mejorado gracias a tus consejos, todo con interrupciones y poco codigo dentro de ellos