Como tu dices movlwjps, no muchos conocen esa opción de "#Use Fast_Io(B)" y no la colocan en el código y les crea código extra, pero igual te genera código extra.
Yo personalmente cuando programo mezclo Código C y Código ASM, en el proyecto que este realizando para optimiza recursos, no soy un experto en ASM, pero hay ciertas cosas donde con un pocas lineas en ASM la tienes como estructuras en tablas.
Te invito a que realices un código en C regularmente complejo, y compiles en CCS, Hi-tech, y compares códigos ASM resultantes, el consumo de ROM y RAM que te genera.
Mira este análisis que hace el amigo "SUKY" con su tema: "Comparando compiladores: C18, CCS y Hi-Tech PIC18"
Revisando la siguiente tabla de comparaciones que presenta CCS, en la sección 5, donde muestra algunas implementaciones, parecía exagerado la diferencia, así que mejor probar uno mismo:
Se compara CCS 4.108, C18 3.31 y Hi-tech 9.51.
Tamaño del archivo hex al usar printf:
C18:
Código:
#include <p18f4620.h>
#include <usart.h>
#include <stdio.h>
void main(){
unsigned char Var=10;
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON &
USART_ASYNCH_MODE & USART_EIGHT_BIT &
USART_CONT_RX & USART_BRGH_HIGH ,129);
printf("Variable=%u",Var);
while(1);
}
Hi-Tech:
Código:
#include <pic18.h>
#include "usart.h"
#include <stdio.h>
#include "serial.h"
void main(){
unsigned char Var=10;
init_comms();
printf("Variable=%u",Var);
while(1);
}
CCS:
Código:
#include <18F4620.h>
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
void main(){
char Var=10;
printf("Variable=%u",Var);
while(1);
}
C18 3.31: 12372 bytes
CCS 4.108: 883 Bytes
Hi-Tech 9.51: 4649 Bytes
Velocidad de ejecución:
Código:
#include <p18f4620.h>
unsigned int uiCRC16(unsigned char value,unsigned int poly,unsigned int init_value){
unsigned int res;
unsigned int i;
res=value;
res^=init_value;
for(i=0;i<8;i++){
if(res & 1){
res>>= 1;
res^=poly;
}else{
res>>= 1;
}
}
return(res);
}
void main(){
float a,b,c;
unsigned int k;
a=12569.458;
b=8753.267;
c=a*b;
k=uiCRC16(0xAA,0xA6BC,0x00AA);
while(1);
}
C18:
Asignación 10 Ciclos. (Asignación del numero flotante a la variable)
Asignación 20 ciclos.-
Calculo 210 ciclos.- (Calculo de a*b)
Ejecución funcion 379 ciclos.-
CCS:
Asignación 8 ciclos.-
Asignación 8 ciclos.-
Calculo 133 ciclos.-
Ejecución funcion 204 ciclos.-
Hi-Tech
Asignación 7 ciclos.-
Asignación 7 ciclos.-
Calculo 425 ciclos.-
Ejecución funcion 153 ciclos.-
Código:
k=0x1563;
low=*((char *)&k);
high=*((char *)&k+1);
CCS:
Código:
33: k=0x1563;
0018 0E15 MOVLW 0x15
001A 6E12 MOVWF 0x12, ACCESS
001C 0E63 MOVLW 0x63
001E 6E11 MOVWF 0x11, ACCESS
34: low=*((char *)&k);
0020 6A16 CLRF 0x16, ACCESS
0022 0E11 MOVLW 0x11
0024 6EE9 MOVWF 0xfe9, ACCESS
0026 C016 MOVFF 0x16, 0xfea
002A CFEF MOVFF 0xfef, 0x13
35: high=*((char *)&k+1);
002E 6A16 CLRF 0x16, ACCESS
0030 0E11 MOVLW 0x11
0032 6E15 MOVWF 0x15, ACCESS
0034 0E01 MOVLW 0x1
0036 2415 ADDWF 0x15, W, ACCESS
0038 6E01 MOVWF 0x1, ACCESS
003A 0E00 MOVLW 0
003C 2016 ADDWFC 0x16, W, ACCESS
003E C001 MOVFF 0x1, 0xfe9
0042 6EEA MOVWF 0xfea, ACCESS
0044 CFEF MOVFF 0xfef, 0x14
// 24 ciclos.-
C18:
Código:
18: k=0x1563;
0EBC 0E63 MOVLW 0x63
0EBE 6EF3 MOVWF 0xff3, ACCESS
0EC0 0E01 MOVLW 0x1
0EC2 CFF3 MOVFF 0xff3, 0xfdb
0EC4 FFDB NOP
0EC6 0E15 MOVLW 0x15
0EC8 6EF3 MOVWF 0xff3, ACCESS
0ECA 0E02 MOVLW 0x2
0ECC CFF3 MOVFF 0xff3, 0xfdb
0ECE FFDB NOP
19: low=*((char *)&k);
0ED0 0E01 MOVLW 0x1
0ED2 50DB MOVF 0xfdb, W, ACCESS
0ED4 6EE7 MOVWF 0xfe7, ACCESS
0ED6 0E03 MOVLW 0x3
0ED8 CFE7 MOVFF 0xfe7, 0xfdb
0EDA FFDB NOP
20: high=*((char *)&k+1);
0EDC 0E02 MOVLW 0x2
0EDE 50DB MOVF 0xfdb, W, ACCESS
0EE0 6EE7 MOVWF 0xfe7, ACCESS
0EE2 0E04 MOVLW 0x4
0EE4 CFE7 MOVFF 0xfe7, 0xfdb
0EE6 FFDB NOP
// 22 Ciclos
Hi-Tech
Código:
16: k=0x1563;
15EE 0100 MOVLB 0
15F0 0E63 MOVLW 0x63
15F2 6FE0 MOVWF 0xe0, BANKED
15F4 0E15 MOVLW 0x15
15F6 6FE1 MOVWF 0xe1, BANKED
17: low=*((char *)&k);
15F8 C0E0 MOVFF 0xe0, 0xf7f
15FA FF7F NOP
18: high=*((char *)&k+1);
15FC C0E1 MOVFF 0xe1, 0xf7e
15FE FF7E NOP
// 9 Ciclos.-
Código:
unsigned char Buffer[200],Buffer1[200],*Ptr,*Ptr1;
Ptr=&Buffer[0];
Ptr1=&Buffer1[0];
for(k=0;k<200;k++){
*Ptr1++=*Ptr++;
}
while(1);
CCS 7214 ciclos
C18 7025 ciclos
Hi-tech 5219 ciclos