Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Soy novato con el compilador CCS y me parece que es malo de cxxxnes.
Quizas sean imaginaciones mias porque lo he utilizado poco o puede que no lo tenga bien configurado, pero no optimiza nada el código.
Un ejemplo:
signed int32 PosicionI, PosicionD;
.................... PosicionI=PosicionD=0L;
07AC: CLRF 50
07AD: CLRF 4F
07AE: CLRF 4E
07AF: CLRF 4D
07B0: MOVF 50,W
07B1: MOVWF 4C
07B2: MOVF 4F,W
07B3: MOVWF 4B
07B4: MOVF 4E,W
07B5: MOVWF 4A
07B6: MOVF 4D,W
07B7: MOVWF 49
.................... PosicionI=0L;
07AC: CLRF 4C
07AD: CLRF 4B
07AE: CLRF 4A
07AF: CLRF 49
.................... PosicionD=0L;
07B0: CLRF 50
07B1: CLRF 4F
07B2: CLRF 4E
07B3: CLRF 4D
Si uso "PosicionI=PosicionD=0L;" no optimiza y hace todo CLRF sino que hace 0 una variable y luego la copia en la otra, una tontería porque acaba antes haciendola cero tambien. ¿Hay alguna forma de mejorar la optimización del código o es siempre asi de malo?. Ya me he tenido que pelear antes con compiladores poco óptimos, pero acostumbrado al Keil (para intel), he perdido la costumbre de "prepararle" el código al compilador.
Que nivel... chequeando la calidad del compilador... jejeje.
Yo a mi modesto entender creo que el compilador hace exactamente lo que se le indica... PosicionI = PosicionD, si, PosicionD vale 0 está claro que es mas facil poner PosicionI a 0 con CLRF pero realmente no hace ni mas ni menos que lo que se le ha dicho que haga...
De todas formas aunque la sentencia que indicas es válida:
- PosicionI=PosicionD=0L;
no deja de ser una forma de abreviar:
- PosicionI=0L;
- PosicionD=0L;
que el compilador si optimizaria de forma correcta.
Prueba con el C de Microchip a ver que tal aunque no creo que lo haga mejor.
furri.
Efectivamente, Furri, el compilador hace exactamente lo que yo le digo, pero eso no es lo que yo espero de un compilador. Para eso puedo compilar yo mismo el código y escribirlo en ensamblador. Creo que un buen compilador debe optimizar el código él solo (dependiendo del nivel de optimización seleccionado).
Quizas es que estoy mal acostumbrado, he usado mucho la plataforma Intel y he probado varios compiladores, quedandome con Keil. En Keil si, por ejemplo, haces:
unsigned char a,b;
b=a/2;
no vivide a entre dos, que siempre es muy ento, hace:
b=a>>1;
que para un unsigned es exactamente igual y mucho más rápido...
Por eso me interesa saber si alguien que haya usado más el CCS sabe si hay alguna forma de que optimice mas. Si no es posible tendré que darle el código ya "preparado" para que compile de la forma más óptima, y para eso hay que conocer muy bien el juego de instrucciones del micro. Yo en PIC estoy pez.
Como yo he comenzado a programar micros ayer mismo como quien dice y para mi esto es un hobby al 100%, si un programa ocupa mucho pues pones un pic compatible con mas memoria y listo....
pero lo que tu te estás planteando de la optimización lo tuve que hacer hace años, muuuuchos años con el aprovechamiento de espacio para bases de datos "grandes" en aquellos primeros IBM PC a 4,7MHz y dos disketeras de 5 1/4 (sin disco duro obviamente)... sé lo que es optimizar....
furri
Buenas, si quieres que el código quede optimizado vas a tener que hacerlo en ensamblador, es la mejor forma y tampoco es que sea muy complicado, todo es cuestión de un poco de práctica. Eso si, si el problema es muy complejo puedes escribirlo en c y después de optimizarlo con CCS, revisarlo y quedarlo a tu gusto.