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
, 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
. 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
.