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