我用51系列单片机用18.432MHz晶振6时钟周期,文件缓冲区16KB,写U盘速度接近200KB的速度,写一个2MB的文件使用时间不到10s 现在改用MEGA128,用8.000MHz晶振,文件缓冲区16KB,写一个2MB的文件使用时间要30s的时间。
同样的程序,按理论AVR应该比51快不少,可以为什么慢了这么多,高手可否指点一二...谢谢了。。。
我用51系列单片机用18.432MHz晶振6时钟周期,文件缓冲区16KB,写U盘速度接近200KB的速度,写一个2MB的文件使用时间不到10s 现在改用MEGA128,用8.000MHz晶振,文件缓冲区16KB,写一个2MB的文件使用时间要30s的时间。
同样的程序,按理论AVR应该比51快不少,可以为什么慢了这么多,高手可否指点一二...谢谢了。。。
楼上的朋友,请问阁下用的是iccavr编译器吗?我用的是AtmanAvr4.x,没有测试通过,阁下试过没有?谢谢了。。。
你查一下读写一个字节到CH375用多少时间啊
128,网上的例子是模拟总线时序的,速度当然慢, 你应该将CH375挂在128的总线上,那样读写U盘速度250K一点问题也没有!
我用的是ICC编译器,采用总线读写,函数采用沁恒电子的2.8版本库函数,读写速度只能达到70KB左右,楼上的是怎么做到250KB的.
影响读写速度的,主要是在数据和数据之间的时间,如果你产生或处理数据的时间长的话,对速度影响很大
采用Mega128L-8AI ,3.3V供电,8MHz,总线0等待时序
读写函数如下: void xWriteCH375Data(unsigned char mData ) { *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; //mDelay1uS();//至少延时1.2uS } unsigned char xReadCH375Data(void) { unsigned char mData; mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; mDelay1uS();//至少延时1.2uS return mData; } void xWriteCH375Cmd(unsigned char mCmd ) { mDelay1uS();//至少延时1uS *(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd; mDelay1uS(); //mDelay1uS();//至少延时2uS } 测试函数如下: i = StrCopy(mCmdParam.Create.mPathName, "\\AAAA.XXX"); i = CH375FileCreate(); for(j=0; j<64 * 2; j++) { mCmdParam.WriteX.mSectorCount = 32;//16K缓冲 mCmdParam.WriteX.mDataBuffer = FileBuff; i = CH375FileWriteX(); } mCmdParam.Modify.mFileAttr = ATTR_ARCHIVE; mCmdParam.Modify.mFileTime = MAKE_FILE_TIME(12, 12, 12); mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(2002, 2, 2 ); mCmdParam.Modify.mFileSize = 0xFFFFFFFF; i = CH375FileModify(); mCmdParam.Close.mUpdateLen = 1; i = CH375FileClose(); NOP(); 测试结果: 写2M字节需要时间31秒,以前用51系列单片机用18.432MHz晶振6时钟周期,文件缓冲区16KB,写U盘速度接近200KB的速度,这次不同的是用3。3V供电,以前是用5V。
我严重怀疑MEGA128L-8L+375能否到传说中的250K的速度....有谁真正侧过....
用AtmanAvr4.x编译器好象头文件是不一样的,你换下头文件试试看可不可以
读写函数如下: void xWriteCH375Data(unsigned char mData ) { *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; //mDelay1uS();//至少延时1.2uS } unsigned char xReadCH375Data(void) { unsigned char mData; mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; mDelay1uS();//至少延时1.2uS return mData; } void xWriteCH375Cmd(unsigned char mCmd ) { mDelay1uS();//至少延时1uS
*(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd;
mDelay1uS(); //mDelay1uS();//至少延时2uS } 真正影响速度的是这三个函数,你查看其汇编看看每一个函数用了多长时间. 还有你数据读出来怎麽存放的也会影响速度.
我的系统从U盘读的数据量不大,主要是设置信息和命令信息。
主要是采集数据到U盘,数据量比较多,我的主存储芯片是K9F5608或1208,主要数据有16M,其他都是小的数据片,速度可以不考虑,但是这个16M的数据块是用户最常用的数据,里面有电压,电流,几个地方的温度,压力,转速,还有几十个开关量等,都是小于1s的时间采集记录的,也是最关键常用的数据.
我程序开辟了16K的文件缓冲区,从NAND Flash中读取数据是很快的,我测试过,影响写U盘速度的因素不太大。
我查过汇编代码: (0071) void xWriteCH375Data(unsigned char mData ) (0072) { (0073) *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; _xWriteCH375Data: mData --> R16 2999 93008400 STS 0x8400,R16 299B 9508 RET
我估计时间都消耗在反复调用在该函数上:
call 调用该函数 消耗4T mData --> R16 消耗1T STS 0x8400,R16 消耗2T RET 消耗4T
如果在库函数里面采用类似下面写U盘的方式: for(j=0; j{ xWriteCH375Data(FileBuff[j++]); }
那速度是绝对很难块起来的....因为程序要判断j和ByteCnt,还要跳转,中间间杂这调用xWriteCH375Data,这样程序怎么可能块...AVR的结构决定AVR跳转判断块不了。。。
写U盘的函数应该改为类似种就好点了: void MoveData(char* a, char* b, int len) { switch(len & 7) { default: while (len > 7) { len -= 8; *b++ = *a++; case 7:*b++ = *a++; case 6:*b++ = *a++; case 5:*b++ = *a++; case 4:*b++ = *a++; case 3:*b++ = *a++; case 2:*b++ = *a++; case 1:*b++ = *a++; } } } 尽量减少判断和跳转,这样才可以发挥AVR的速度优势,才比51写U盘真的快...
以上观点本人没有带任何评论别人的心态发言,如果触犯您,在这里说声对不起,我只是想让我写U盘的速度提高而已。。。