俺用的那MDK3.2版,经过三级优化,测试的结果速度是一样的.
|
经过优化,MDK把8位无符号变量直接用一32位寄存器来装载,并初始化成无符号字节的初始值,代码如下.<br /><br />0x00100244 E3A00000 MOV R0,#0x00000000<br />0x00100248 E583C030 STR R12,[R3,#0x0030]<br /> 33: for(ucCount=8; ucCount; --ucCount) <br /> 34: { <br />0x0010024C E3A01008 MOV R1,#0x00000008<br /> 35: ucReadData <<= 1; <br /> 36: <br /> 37: Macro_Set_CLK_Low(); <br /> 38: Macro_Set_CLK_High(); <br /> 39: <br /> 40: // if(GetSDCard_SO_Value()) <br /> 41: if(AT91F_PIO_GetInput( AT91C_BASE_PIOA) & SD_SO) //内联函数,无调用开销 <br /> 42: { <br /> 43: // ucReadData |= 0x01; <br />0x00100250 E1A00C80 MOV R0,R0,LSL #25<br />0x00100254 E1A00C20 MOV R0,R0,LSR #24<br />0x00100258 E5834034 STR R4,[R3,#0x0034]<br />0x0010025C E5834030 STR R4,[R3,#0x0030]<br /> 586: return pPio->PIO_PDSR; <br />0x00100260 E593203C LDR R2,[R3,#0x003C]<br /> 44: ucReadData++; <br /> 45: } <br /> 46: } <br /> 47: return(ucReadData); <br /> 48: } <br /> 49: <br /> 50: void VS1003B_SPIPutChar(unsigned char ucSendData) <br /> 51: { <br /> 52: // S0SPDR = c; <br /> 53: // while((S0SPSR & 0x80) == 0); //等待SPI将数据发送完毕 <br /> 54: uchar register ucCount; <br /> 55: uchar register ucMaskCode; <br /> 56: <br />0x00100264 E2411001 SUB R1,R1,#0x00000001<br /> 41: if(AT91F_PIO_GetInput( AT91C_BASE_PIOA) & SD_SO) //内联函数,无调用开销 <br /> 42: { <br /> 43: // ucReadData |= 0x01; <br /> 44: ucReadData++; <br /> 45: } <br /> 46: } <br /> 47: return(ucReadData); <br /> 48: } <br /> 49: <br /> 50: void VS1003B_SPIPutChar(unsigned char ucSendData) <br /> 51: { <br /> 52: // S0SPDR = c; <br /> 53: // while((S0SPSR & 0x80) == 0); //等待SPI将数据发送完毕 <br /> 54: uchar register ucCount; <br /> 55: uchar register ucMaskCode; <br /> 56: <br />0x00100268 E3120A01 TST R2,#0x00001000<br />0x0010026C 12800001 ADDNE R0,R0,#0x00000001<br />0x00100270 120000FF ANDNE R0,R0,#0x000000FF<br />0x00100274 E21110FF ANDS R1,R1,#0x000000FF<br />0x00100278 1AFFFFF4 BNE 0x00100250<br /> 57: ucMaskCode = 0x80; <br /><br />说明: R1为uCount;<br />执行ucCount--的汇编语句为:<br />SUB R1,R1,#0x00000001<br />执行检查循环终止条件是否为0并退出的语句为<br />ANDS R1,R1,#0x000000FF<br />BNE 0x00100250<br /><br /><br />
|
|