Hola, tengo un problema con la instruccion MOVLB 0. Por ejemplo esta operacion:
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:
0270 MOVLW 0x2
0272 MOVLB 0
0274 ADDWF 0xb2, F, BANKED
Mientras el CCS lo hace en 2 instrucciones:
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:
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:
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: }