测试目的,实验在使用CH376对U盘内文件进行拷贝,测试拷贝速度。
实验条件,STM32103VC(内部64KRAM,256Kflash),72Mhz,SPI 18Mhz,CH376,测试文件:MODBUS.PDF, 文件大小366 KB
测试1:字节方式读写CH376ByteRead,CH376ByteWrite,RAM缓存大小char buf[640];
测试结果,完全复制完需要19S,平均速度为19KB/S,感觉不是一般的慢。
测试2:字节方式读写CH376ByteRead,CH376ByteWrite,RAM缓存大小char buf[6400];
测试结果,程序不能运行,究其原因,发现启动文件的设置:
startup_stm32f10x_hd.s设置
因为局部变量被分配在堆上,由启动文件设置可以看出其不能超过1024字节,所以当设置buf为6400时就出现错误了。
测试3:使用更大的buf,放在flash中,字节方式读写CH376ByteRead,CH376ByteWrite,缓存大小全局变量char buf[6400];
测试结果,完全复制完需要10S,平均速度为36.6KB/S
测试4:使用更大的buf,放在flash中,字节方式读写CH376ByteRead,CH376ByteWrite,缓存大小全局变量char buf[6400];//不能接近48K
测试结果,完全复制完需要10S,平均速度为36.6KB/S,居然与方法3相同,可见使用字节方式对于速度的提升使用更大的buffer不能提升速度了,因此在上述方法的基础上改用扇区方式读写进行测试
测试5:扇区方式读写CH376SecRead,CH376SecWrite,RAM缓存大小char buf[640];
测试结果,完全复制完需要好几分钟,不知道为什么比字节模式还慢
测试6:扇区方式读写CH376SecRead,CH376SecWrite,RAM缓存大小char buf[6400];将堆栈段改为0x2800,即10240,10KB
测试结果,完全复制完需要好几分钟,不知道为什么比字节模式还慢。
原因发现CH376SecRead开始都能读出100个扇区,但是明明还没读完就只能读出33个扇区了,以后都只能读出一个扇区了,所以异常的慢。
使用扇区方式读写时发现,每次读出100个扇区,开始的时候是正确的,后来就不对了,不到100个,但是显然源文件数据刚读取了一点点,就不正确了,这是为什么呢,一下是一段扇区方式读取文件的代码:
(CH376_DAT_BLOCK_LEN 为64,sizeof(buf)= 6400)
ByteCount = 0;
sec_num =sizeof(buf)/ DEF_SECTOR_SIZE; //一次可以处理的总扇区
do{
strcpy(SrcName, FILENAME);
s = CH376FileOpen(SrcName); /* 打开文件 */
if ( s != USB_INT_SUCCESS )
mStopIfError(s );
s = CH376SecLocate(ByteCount/CH376_DAT_BLOCK_LEN ); /* 以扇区为单位移动当前文件指针到上次复制结束位置 */
if ( s != USB_INT_SUCCESS )
mStopIfError( s );
//printf( "Reading...\r\n" );
s =CH376SecRead( buf, sec_num , &ThisSecLen );
if ( s != USB_INT_SUCCESS )
mStopIfError( s );
s = CH376FileClose(TRUE); /* 关闭文件 */
if ( s != USB_INT_SUCCESS )
mStopIfError( s );
ByteCount+= ThisSecLen*CH376_DAT_BLOCK_LEN; //已经读出的总字节
printf( "read ThisSecLen = %ld\r\n",ThisSecLen); //打印每次读出实际扇区数
printf("ByteCount=%ld,FileSize=%ld\r\n", ByteCount,FileSize ); //打印已经读出字节数与文件总数
}while(ByteCount<FileSize);
以及串口打印结果:
串口打印写入字节数
终于发现问题了,原来是把DEF_SECTOR_SIZE和CH376_DAT_BLOCK_LEN给搞错了,原来USB的扇区大小是512字节,而不是64字节,Ch376的buf大小才为64字节,改过来就OK了。
测试结果,完全复制完需要5S,平均速度为72KB/S,使用扇区的方式拷贝的速度大大提高了。粗心大意害死人阿, 在以后做测试前最好把关键参数搞清楚,不要像这样走太大的弯路。