俺的MP3经过n次尝试后,发现P89V51RD2的硬件SPI无法以同一种模式分时访问SPI总线上的两个设备SD卡和VS1003B,只好回头.重新考虑优化代码,用软件方式实现高速播放. 俺的目标是流畅播放256Kbps的MP3,争取上到320Kbps
先贴上代码:
void main(void) { unsigned char xdata *pDataPoint; unsigned char ucCount; unsigned char uci;
pDataPoint = ucTestDataBuff;
for(ucCount=0; ucCount<255; ucCount++) { *pDataPoint++ = ucCount; }
while(1) { //以下代码段模拟将数据发送到VS1003B模块,未考虑忙信号,用于测试模拟SPI发码能达到的最快的C语言程序 ucCount = 16; while(ucCount--) { uci = 32; while(uci--) { SD_SPI_WriteByte(*pDataPoint++); } } //发码结束 ucCount=88; //测试语句,用于设置断点 } }
通过跟踪汇编,发现那段32字节While循环,还大有潜力可挖,pDataPoint指针变量的取数和加1操作,C语言编译居然没有采用INC DPTR指令来实现SRAM的指针操作,而是外加两个寄存器,构成指向SRAM的指针,然后对先对RX指针加1,再送到DPL和DPH,再用MOVX指令取数,太浪费了,在SD_SPI_WriteByte函数中辛苦省下的Clk全给它白白空耗掉了.
当然如此操作也是有它的道理的,DPTR是通用的,不能做为长期指针,任何进程只有短期使用权.
讨论的重点就是以下核心部分
ucCount = 16; while(ucCount--) { uci = 32; while(uci--) { SD_SPI_WriteByte(*pDataPoint++); } }
在C51语言中,如何直接操作DPTR(对DPTR加1),除了嵌入汇编代码,还有更好的办法吗?
以下是较为合理的伪代码 { DPL = DPL_BAK; DPH = DPH_BAK;
R_COUNT = 32
loop_32Byte_Send_Enter: MOVX ACC,DPTR; SD_SPI_Send(ACC) INC DPTR
DJNZ RCOUNT loop_32Byte_Send_Enter DPL_BAK = DPL ; DPH_BAK = DPH
}
|