Autor Tema: Porque el C18 genera un codigo con muchas instrucciones "MOVLB 0"  (Leído 1800 veces)

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

Desconectado JuanEZWon

  • PIC10
  • *
  • Mensajes: 21
Porque el C18 genera un codigo con muchas instrucciones "MOVLB 0"
« en: 30 de Diciembre de 2011, 15:02:59 »
Hola, tengo un problema con la instruccion MOVLB 0. Por ejemplo esta operacion:

Código: [Seleccionar]
Servo_Par += 2;
El CCS Tarda solo 166.67 nanosegundos mientras el C18 tarda 250 Nanosegundos. la razon es muy simple:

El C18 hace esto:

Código: [Seleccionar]
0270    MOVLW 0x2
0272    MOVLB 0
0274    ADDWF 0xb2, F, BANKED

Mientras el CCS lo hace en 2 instrucciones:

Código: [Seleccionar]
0B22:  MOVLW  02
0B24:  ADDWF  x8B,F

y asi es en todo, el C18 anda colocando esa instruccion de MOVLB en todas partes consumiendo tiempo inecesario. ya active todas las optimizaciones incluso el Banking optimization , pero el MOVLB sigue apareciendo por todas partes como un virus. El CCS solo usa esa instruccion al principio una sola vez, pero el C18 la usa cientos de veces en mi codigo de manera innecesaria. lo raro es que solo pasa en mi proyecto, pero no he podido encontrar que es lo que origina ese problema. ¿tienen alguna idea de como hacer para que el compilador deje de colocar el MOVLB 0?.

Vean por ejemplo este codigo que genera el C18:

Código: [Seleccionar]
28:                   Timert[0] = 65535 - 37595;
  03EC    0100     MOVLB 0
  03EE    0E24     MOVLW 0x24
  03F0    6FC1     MOVWF 0xc1, BANKED
  03F2    0E6D     MOVLW 0x6d
  03F4    6FC2     MOVWF 0xc2, BANKED
29:                   Timert[1] = 65535 - 57735;
  03F6    0100     MOVLB 0
  03F8    0E78     MOVLW 0x78
  03FA    6FC3     MOVWF 0xc3, BANKED
  03FC    0E1E     MOVLW 0x1e
  03FE    6FC4     MOVWF 0xc4, BANKED
30:                   Timert[2] = 65535 - 37595;
  0400    0100     MOVLB 0
  0402    0E24     MOVLW 0x24
  0404    6FC5     MOVWF 0xc5, BANKED
  0406    0E6D     MOVLW 0x6d
  0408    6FC6     MOVWF 0xc6, BANKED
31:                   Timert[3] = 65535 - 37595;
  040A    0100     MOVLB 0
  040C    0E24     MOVLW 0x24
  040E    6FC7     MOVWF 0xc7, BANKED
  0410    0E6D     MOVLW 0x6d
  0412    6FC8     MOVWF 0xc8, BANKED
32:                   Timert[4] = 65535 - 57735;
  0414    0100     MOVLB 0
  0416    0E78     MOVLW 0x78
  0418    6FC9     MOVWF 0xc9, BANKED
  041A    0E1E     MOVLW 0x1e
  041C    6FCA     MOVWF 0xca, BANKED
33:                   Timert[5] = 65535 - 37595;
  041E    0100     MOVLB 0
  0420    0E24     MOVLW 0x24
  0422    6FCB     MOVWF 0xcb, BANKED
  0424    0E6D     MOVLW 0x6d
  0426    6FCC     MOVWF 0xcc, BANKED
34:                   Timert[6] = 65535 - 57735;
  0428    0100     MOVLB 0
  042A    0E78     MOVLW 0x78
  042C    6FCD     MOVWF 0xcd, BANKED
  042E    0E1E     MOVLW 0x1e
  0430    6FCE     MOVWF 0xce, BANKED
35:                   Timert[7] = 65535 - 37595;
  0432    0100     MOVLB 0
  0434    0E24     MOVLW 0x24
  0436    6FCF     MOVWF 0xcf, BANKED
  0438    0E6D     MOVLW 0x6d
  043A    6FD0     MOVWF 0xd0, BANKED
36:                   Timert[8] = 65535 - 57735;
  043C    0100     MOVLB 0
  043E    0E78     MOVLW 0x78
  0440    6FD1     MOVWF 0xd1, BANKED
  0442    0E1E     MOVLW 0x1e
  0444    6FD2     MOVWF 0xd2, BANKED
37:                   Timert[9] = 65535 - 37595;
  0446    0100     MOVLB 0
  0448    0E24     MOVLW 0x24
  044A    6FD3     MOVWF 0xd3, BANKED
  044C    0E6D     MOVLW 0x6d
  044E    6FD4     MOVWF 0xd4, BANKED
38:                   Timert[10] = 65535 - 57735;
  0450    0100     MOVLB 0
  0452    0E78     MOVLW 0x78
  0454    6FD5     MOVWF 0xd5, BANKED
  0456    0E1E     MOVLW 0x1e
  0458    6FD6     MOVWF 0xd6, BANKED
39:                   Timert[11] = 65535 - 37595;
  045A    0100     MOVLB 0
  045C    0E24     MOVLW 0x24
  045E    6FD7     MOVWF 0xd7, BANKED
  0460    0E6D     MOVLW 0x6d
  0462    6FD8     MOVWF 0xd8, BANKED
40:                   Timert[12] = 65535 - 57735;
  0464    0100     MOVLB 0
  0466    0E78     MOVLW 0x78
  0468    6FD9     MOVWF 0xd9, BANKED
  046A    0E1E     MOVLW 0x1e
  046C    6FDA     MOVWF 0xda, BANKED
41:                   Timert[13] = 65535 - 37595;
  046E    0100     MOVLB 0
  0470    0E24     MOVLW 0x24
  0472    6FDB     MOVWF 0xdb, BANKED
  0474    0E6D     MOVLW 0x6d
  0476    6FDC     MOVWF 0xdc, BANKED
42:                   Timert[14] = 65535 - 57735;
  0478    0100     MOVLB 0
  047A    0E78     MOVLW 0x78
  047C    6FDD     MOVWF 0xdd, BANKED
  047E    0E1E     MOVLW 0x1e
  0480    6FDE     MOVWF 0xde, BANKED
43:                   Timert[15] = 65535 - 37595;
  0482    0100     MOVLB 0
  0484    0E24     MOVLW 0x24
  0486    6FDF     MOVWF 0xdf, BANKED
  0488    0E6D     MOVLW 0x6d
  048A    6FE0     MOVWF 0xe0, BANKED

El CCS me genera lo mismo pero sin los MOVLB 0. y es que ademas es un codigo critico el cual no puedo permitirme ese tipo de retrasos. si alguno de ustedes conoce la solución se lo agradeseria infinitamente

o vean este codigo, donde anda usando el MOVLB 0 siendo que ya active el Banking optimization:

Código: [Seleccionar]
30:                      if(Timert[0] > Timert[1]) //debug
  0284    0100     MOVLB 0
  0286    51C1     MOVF 0xc1, W, BANKED
  0288    0100     MOVLB 0
  028A    5DC3     SUBWF 0xc3, W, BANKED
  028C    0100     MOVLB 0
  028E    51C2     MOVF 0xc2, W, BANKED
  0290    0100     MOVLB 0
  0292    59C4     SUBWFB 0xc4, W, BANKED
31:                      {
32:                      }

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Porque el C18 genera un codigo con muchas instrucciones "MOVLB 0"
« Respuesta #1 en: 30 de Diciembre de 2011, 16:28:17 »
prueba a poner:

int *p=&Timer[0];

if(*p>*(p+1))

*p= 65535 - 37595
*(p+1)=65535 - 57735;
*(p+2)=65535 - 37595;
.....

puede que ahorres unas cuantas instrucciones.

Desconectado JuanEZWon

  • PIC10
  • *
  • Mensajes: 21
Re: Porque el C18 genera un codigo con muchas instrucciones "MOVLB 0"
« Respuesta #2 en: 30 de Diciembre de 2011, 17:04:26 »
Gracias por la ayuda, ya pude encontrar el origen del problema y era que apesar de que tenia activadas las optimizaciones, en la configuración independiente del source file algunas no estaban activadas.