Autor Tema: Optimizar Código  (Leído 4677 veces)

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

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Optimizar Código
« en: 23 de Julio de 2008, 20:35:49 »
Hola muchachos como andan? yo trabajando en mi proyecto en los ratos libres. Hoy me tope con otro inconveniente y fue el del espacio fisico que tengo limitado para montar mi circuito, entonces pense en pasame del 877 al 873 pero no me alcanza la memoria, entonces la pregunta es? Existen pautas (muy obvias), que podamos seguir los principiantes para optimizar nuestro código?
Gracias por su tiempo...
Nicolas
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Optimizar Código
« Respuesta #1 en: 23 de Julio de 2008, 23:10:42 »
Qué tal Vasco!
Creo que la otra vez en algún hilo por allí Gonzalo te dió algunos buenos consejos.
Ojalá puedan apuntarse aquí otros.
Tal vez me esté desviando del tema del hilo, pero no pensaste en el 16f876? Es de 28 pines, el mismo tamaño que el 16F873, pero la capacidad de memoria es exactamente igual al del 16F877! Bueno es una sugerencia no más...
Saludos, nos leemos!  :mrgreen:

EDITO por error de tipeo: había escrito "apontarse" en vez de "apuntarse" :D
« Última modificación: 25 de Julio de 2008, 12:19:55 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Optimizar Código
« Respuesta #2 en: 23 de Julio de 2008, 23:50:57 »
Hola.

Y por que no mejor un 18F252???? memoria para rato ...
El papel lo aguanta todo

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Optimizar Código
« Respuesta #3 en: 24 de Julio de 2008, 14:55:21 »
También está el 18F2550! He trabajado con él y ese micro es un leoncito!!  :D  :D  :D
Definitivamente los 18F son una gran ventaja, y lo increíble es que a veces hasta son más baratos que los 16F (por lo menos aquí en mi país sucede).
Pero si aún no deseas dar el salto a los 18F, pues tienes el 16F876 que te mencioné.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Optimizar Código
« Respuesta #4 en: 24 de Julio de 2008, 16:53:45 »
También está el 18F2550! He trabajado con él y ese micro es un leoncito!!  :D  :D  :D

Totalmente de acuerdo Fire ... tambien trabajo con el y aca tambien el precio de los 18 es casi el mismo que el de los 16
 :-/ :-/ :-/
El papel lo aguanta todo

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Re: Optimizar Código
« Respuesta #5 en: 24 de Julio de 2008, 20:54:53 »
Hola muchachos, gracias por el dato, veran he trabajado con el 628, 873 y ahora con 877 y aunque lo vi por todos lados al 876 (incluso en el datasheet del 877 si mal no recuerdo jeje) no habia reparado en que tiene el tamaño del 873.. Un masa! ahora me mudo a ese pic... veran, no se terminan mas los problemas a sortear jejejej ahora es el espacio físico!! que lo tiro... Bueno, gracias de nuevo y quizá este hilo quede abierto para aportes como los que mencionas fire, sobre trucos para optimizar el código (en su momento la instrucción #separate te acordás que la mando el amigo gonzalo si mal no recuerdo?).
En cuanto a los 18 se que son una alternativa enorme pero aún creo que los 16 dan para mucho (al menos en mi caso) y despues de ver ese pibe que armo un webserver con el 877 jejeje ni que hablar. :D
Hasta pronto!
N
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Optimizar Código
« Respuesta #6 en: 25 de Julio de 2008, 12:30:40 »
Bueno, gracias de nuevo y quizá este hilo quede abierto para aportes como los que mencionas fire, sobre trucos para optimizar el código (en su momento la instrucción #separate te acordás que la mando el amigo gonzalo si mal no recuerdo?).
Totalmente correcto, ese fue una de las explicaciones del maestro Gonzalo. El #separate le permite al compilador separar algunas funciones y que no las haga "inline".
Otro punto que él te mencionó fue lo de las variables:
- Las que sólo se usan en una función no declararlas globales.
- Recordar colocar "static" en las variables que se usan en una unidad de compilación llamada desde el programa principal.
También recuerdo que Gonzalo sugirió lo de crear un archivo "encabezado.h" con todos las variables globales y definiciones generales del programa, como los #use, etc...

Bueno es lo que recuerdo, el mencionó varias cosas en ese momento. Si alguien tiene algún otro truco, puede mencionarlo acá.  :lol:

En cuanto a los 18 se que son una alternativa enorme pero aún creo que los 16 dan para mucho (al menos en mi caso) y despues de ver ese pibe que armo un webserver con el 877 jejeje ni que hablar. :D

Tienes razón, los 16F tienen bastante aplicación. Ahora bien, no sé si ese pibe que mencionas trabajó en C. Porque también tengo un amigo que se montó una máquina CNC  con la interfaz a la PC y demás... y usó también un simple 16F877, pero claro... el trabaja en assembler. Allí el código siempre está optimizado. Esa es la desventaja de trabajar en C o en Basic.
Yo siempre trato de usar los 16F si no hace falta mucho, pero definitivamente que los 18F los dejan chiquitos. No sólo tienen 8 veces la memoria de los 16F, sino que tienen muchas funcionalidades más que en muchos proyectos son bien útiles. Lo malo es que aquí muy poca gente los usa, entonces el precio es el mismo -o hasta menos- que el de los 16F, pero cuando se agotan los dueños de las tiendas de electrónica no se preocupan mucho en pedir más.  :(
Así que, aunque me dejó el gusto trabajar con un 18F -que no era mío  :? - voy a tener que volver a los 16F hasta que llegue una existencia de 18F y me compre unos cuantos!  :P

Ok saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Optimizar Código
« Respuesta #7 en: 25 de Julio de 2008, 15:22:44 »
Con respecto a optimizar codigo... la mayor parte de la memoria es ocupada por las variables, etc... por lo tanto resumiendo codigo no creo q optimicemos mucho... pero aca dejo unos truquitos para ahorrarle unas lineas en ensamblador al codigo.

Resumiendo un for
en lugar de:
Código: [Seleccionar]
for(i=0;i<=n;i++)podemos hacer
Código: [Seleccionar]
i=n;
while(i--)

Resumiendo un if
en lugar de
Código: [Seleccionar]
if(a>b)
    mayor=TRUE;
else
    mayor=FALSE;
usamos
Código: [Seleccionar]
mayor=(a>b)?TRUE:FALSE;
Por supuesto q hay veces q estamos obligados a usar el for, o el if... pero en la mayoria de los casos, estas sentencias son suficientes.
Saludos

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Re: Optimizar Código
« Respuesta #8 en: 27 de Julio de 2008, 11:25:24 »
 :-/ :-/ Genial muchachos, es la idea de este hilo... que se llene de aportes y trucos con la doble finalidad de: ahorrar espacio de rom y porque no, pulir, aceitar y aprender  nuevas maneras de escribir un programa.

Fire, por aquí se consiguen varios modelos de los 18, si querés podríamos coordinar algun método y te los mando...
un abrazo
N
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Optimizar Código
« Respuesta #9 en: 27 de Julio de 2008, 12:40:33 »
Hola chicos.

Gera, muy interesantes tus estrategias, gracias por compartirlas!
Yo personalmente sigo con el CCS, espero que alguien comente sobre sus experiencias con los otros compiladores.

El reemplazo del for por el while genera un ahorro de un ciclo de reloj por numero de veces que ejecutamos el bucle (Parece una pavada pero cuando los ciclos se suman los tiempos se nos van a las nubes) ya que aunque la cantidad de lineas de ensamblador que se generan son las mismas, uno tiene una sola instrucción GOTO y la otra dos. Les muestro los .lst que se generan al compilar:

Con el for:
Código: [Seleccionar]
.................... for(i=0;i<=n;i++){
0012:  CLRF   21
0013:  MOVF   21,W
0014:  SUBWF  22,W
0015:  BTFSS  03.0
0016:  GOTO   019
.................... }
0017:  INCF   21,F
0018:  GOTO   013

Con el while:
Código: [Seleccionar]
.................... i=n;
0012:  MOVF   22,W
0013:  MOVWF  21
.................... while(i--){
0014:  MOVF   21,W
0015:  DECF   21,F
0016:  XORLW  00
0017:  BTFSS  03.2
.................... }
0018:  GOTO   014

La segunda estrategia me hace acordar mucho al IIF del Visual para el tratamiento de condicionales booleanos  :cry: , en CCS
lamentablemente utilizar esta sentencia puede ahorrarte lineas en el archivo .c, pero no lo hara en el .hex, en realidad se
generan más lineas con la segunda instrucción. Dejo el .lst para que vean:

utilizando la clausula If convencional:
Código: [Seleccionar]
.................... if(a>b){
0014:  MOVF   21,W
0015:  SUBWF  22,W
0016:  BTFSC  03.0
0017:  GOTO   01A
....................     mayor=TRUE;
0018:  BSF    23.0
.................... }
.................... else{
0019:  GOTO   01B
....................     mayor=FALSE;
001A:  BCF    23.0
.................... }

Utilizando la clausula de única linea:
Código: [Seleccionar]
.................... mayor=(a>b)?TRUE:FALSE;
0014:  MOVF   21,W
0015:  SUBWF  22,W
0016:  BTFSC  03.0
0017:  GOTO   01A
0018:  MOVLW  01
0019:  GOTO   01B
001A:  MOVLW  00
001B:  MOVWF  78
001C:  BCF    23.0
001D:  BTFSC  78.0
001E:  BSF    23.0
.................... }

Voy a dar una opinión personal, según mi experiencia en la mayoria de los casos el ahorro en memoria tiene su clave en la estructura general del código y la declaración de variables y no en la sintaxis particular de ciertas partes del código. Se puede notar que en aunque trates de ahorrar un pequeño numero de ciclos como en estos casos, si tienes una estructura y jerarquia en el código mal diseñada donde pierdes el 25% de tu RAM para dar un ejemplo, poco te beneficiará ponerte exquisito con estos detalles. De todas formas, nunca vienen mal saberlos.

Fire, por aquí se consiguen varios modelos de los 18, si querés podríamos coordinar algun método y te los mando...

Donde compras tu tus 18F y a que precio vasco? Vamos a comparar distribuidores, uno nunca sabe donde puede encontrar buenos precios  :mrgreen:. Ah, y ya sabes Fire, si necesitas algun 18, le chiflas a vasco o a mi, y te mandamos una paloma mensajera con los chips en una bolsita, esperemos que no se canse antes de llegar a venezuela  :D.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Re: Optimizar Código
« Respuesta #10 en: 27 de Julio de 2008, 14:03:59 »
Los consigo en Electronica Cika http://cika.com.ar/ o en Celsius Argentina algunos menos, ambos negocios estan en Cordoba capital aunque Cika tambien esta en Bs As, es mas, traen los pic a pedido desde alla. Lo unico malo es que no te venden montos menoreas a 50 dolares en Cika, por ello dejo abierta la invitacion para una compra colectiva.
Gonzalo, como siempre tus aportes son magnificos, como dijera victor hugo morales, Barrilete cosmico!! de que planeta viniste???  :mrgreen:
Ta luego
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Optimizar Código
« Respuesta #11 en: 27 de Julio de 2008, 14:55:11 »
Hola Gonzalo! Muy buen analisis!!! Yo se q hay ciertas sentencias q generan menos lineas en ensamblador porq lo estudie cuando vi C, pero nunca se me ocurrio verlo de este modo ;) Me sorprende que el atajo del ?: genere mas codigo en ensamblador... pero mejor, porq es un poco incomodo a la vista, prefiero el if jeje.
Tengo muchos trucos mas, pero q no recuerdo... se me vienen a la mente a la hora de programar jeje. Pongo un par q me salen ahora:

Ahorrar en comparaciones
Código: [Seleccionar]
while(a!=0);ponemos directamente
Código: [Seleccionar]
while(a);
o si queremos el efecto contrario, en lugar de:
Código: [Seleccionar]
while(a=0);usamos:
Código: [Seleccionar]
while(!a)
Ya que las funciones while, for, if... analizan un valor de verdad (0 o distinto de 0), y los comparadores = ; <= ; >= ; != ... devuelven un valor de verdad... Entonces muchas veces no es necesario usarlos.
Recuerdo q usabamos mucho esto cuando haciamos funciones con strings, incrementabamos un puntero mientras no a punte a NULL, ya q los strings terminan en NULL:
Código: [Seleccionar]
while(puntero++)
    *puntero+=('a'-'A');
Esto va recorriendo el string letra a letra hasta el final, y cambia las minusculpas por mayusculas (pero no al reves).

Ahorrando en operaciones y asignacion
En lugar de            usamos
Código: [Seleccionar]
c=c+n                      c+=n
c=c+1                      c++
c=c-n                      c-=n
c=c-1                      c--
c=c*n                      c*=n
c=c/n                      c/=n

Espero q les sirva, saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Re: Optimizar Código
« Respuesta #12 en: 27 de Julio de 2008, 19:51:58 »
Gera, estupendos aportes. ya mismo retoco mi codigo! Gracias a todos por sumarse a esta propuesta que, para iniciados como yo, es de extrema utilidad ya que optimiza el codigo y a la ves abre la cabezota..
salute  :lol:
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Optimizar Código
« Respuesta #13 en: 28 de Julio de 2008, 11:40:58 »
Ah, y ya sabes Fire, si necesitas algun 18, le chiflas a vasco o a mi, y te mandamos una paloma mensajera con los chips en una bolsita, esperemos que no se canse antes de llegar a venezuela  :D.
:D  :D  :D

Vasco, gracias por tu amable oferta, el problema es que aquí en Venezuela estamos trancados para mandar dinero al extranjero... ya comentábamos eso en un hilo por allí... la única opción sería la que propone Gonzalo; en lo que lleguen los micros, te vuelvo a mandar la paloma mensajera con el dinero correspondiente... claro que esa ave debería estar en muy buenas condiciones físicas!  :D

Gonzalo, Gera, gracias por sus excelentes aportes respondiendo a la iniciativa de Vasco.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Re: Optimizar Código
« Respuesta #14 en: 31 de Julio de 2008, 21:31:34 »
Fire, estamos para ayudar en la medida de nuestras posibilidades, si no son muchos, te los mando para alla, ya habrá oportunidad de arreglar las cuentas  :-) ... Decime cuales te hacen falta y te los mando, sin compromiso.
Abrazo.. Vasco
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"


 

anything