??? 03/06/09 20:47 Read: times |
#163179 - re-written the loop in C Responding to: ???'s previous message |
This is the code generated by the RealView compiler for a re-written loop. It takes 43.57us at 58.9MHz
165: unsigned char *pport, *pbuf; 166: unsigned int i; 167: for (i = 256, pport = &FIO_PIN[3], pbuf = buf; i--; ) 0x00000610 E3A09C01 MOV R9,#0x00000100 0x00000614 E59F73BC LDR R7,[PC,#0x03BC] 0x00000618 E28D8000 ADD R8,R13,#0x00000000 0x0000061C EA000001 B 0x00000628 168: *pport = *pbuf++; 169: 0x00000620 E4D80001 LDRB R0,[R8],#0x0001 0x00000624 E5C70000 STRB R0,[R7] 0x00000628 E1B00009 MOVS R0,R9 0x0000062C E2499001 SUB R9,R9,#0x00000001 0x00000630 1AFFFFFA BNE 0x00000620 This is the output from the Keil compiler. It takes 61.02us so does not satisfy Richard's criterion. 165: unsigned char *pport, *pbuf; 166: unsigned int i; 167: for (i = 256, pport = &FIO_PIN[3], pbuf = buf; i--; ) 168: *pport = *pbuf++; 0x000003F0 4BB1 LDR R3,[PC,#0x02C4] 0x000003F2 4AB2 LDR R2,[PC,#0x02C8] 0x000003F4 A900 ADD R1,SP,#0x0000 0x000003F6 1C08 ADD R0,R1,#0 0x000003F8 E004 B 0x00000404 0x000003FA 1C05 ADD R5,R0,#0 0x000003FC 3001 ADD R0,#0x01 0x000003FE 782E LDRB R6,[R5,#0x00] 0x00000400 1C15 ADD R5,R2,#0 0x00000402 702E STRB R6,[R5,#0x00] 0x00000404 1C1D ADD R5,R3,#0 0x00000406 3B01 SUB R3,#0x01 0x00000408 2D00 CMP R5,#0x00 0x0000040A D1F6 BNE 0x000003FA As a comparison this code takes 5641 cycles with the C51 compiler (169us with Richards super 8051). So I can quite see why Richard is so disparaging about 8051 C compilers. unsigned char xdata buf[256], *pbuf; unsigned int i; for (i = 0; i < 256; ) P1 = buf[i++]; Using pointers is incredibly slow. Which reinforces the comments about bit manipulations being good on an 8051, and strings, arithmetic etc better on other mcus. David. |