TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: vasconinicolas 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
-
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
-
Hola.
Y por que no mejor un 18F252???? memoria para rato ...
-
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:
-
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
:-/ :-/ :-/
-
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
-
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:
-
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:
for(i=0;i<=n;i++)podemos hacer
i=n;
while(i--)
Resumiendo un if
en lugar de
if(a>b)
mayor=TRUE;
else
mayor=FALSE;usamos
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
-
:-/ :-/ 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
-
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:
.................... 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:
.................... 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:
.................... 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:
.................... 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.
-
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
-
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
while(a!=0);ponemos directamente
while(a);
o si queremos el efecto contrario, en lugar de:
while(a=0);usamos:
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:
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=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!
-
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:
-
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:
-
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