阅读:2993回复:30
d12的速度问题,重重酬谢!
大侠们,救命啊,我只要求能够达到200Kbyte/s就行了,我真的重谢!
我用的芯片是D12+89C58,速度怎么做都只有40Kbyte/s,应用层开的是64K的缓冲区,驱动程序用的是周立功的,固件也是在周立功的上面修改了一点,固件程序除了枚举和往HOST中发数据,基本没做任何事情,我知道固件程序需要优化,可是真的不知道该怎么做!哪位大侠能够上传优化的固件程序参考一下,或者写操作函数也行!如果作的顺利,重重酬谢,一定的money也行! |
|
沙发#
发布于:2003-07-14 21:34
速度涉及到固件和高层程序的配合、传输方式等等。
固件的优化主要从数据的接收和发送处理机制上想想办法。 |
|
|
板凳#
发布于:2003-07-15 08:59
对于“数据的接收和发送处理机制”在贴子“关于USB1.1传输速度的讨论”已经略有提及。我个人认为,测试速度时,可以发送设定的数据。也就是排除MCU读写数据延误。假如速度依然很低,那你固件有待改善。一般来说,只要参照飞利浦程序应该没问题。
因为我使用d12是做Udisk,(速度延误主要在对flash数据存储),所以一直使用HD Tach作测试,发现误差太大(只有20K/byte),在实际使用中是180K/byte。总结:busbond和d12test的测试数据比较可信。So,你是用什么测试出速度的? 还有一个是“应用层开的是64K的缓冲区”,那你的固件也因该相应开同样的缓冲。而且飞利浦d12test程序本来不支持这么大的缓冲,你也要修改。光是应用软件开缓冲是没用的,我是没有64k的ram,只能循环发送来虚拟一下。最后:这个方法归根到底也是减少MCU读写数据延误和减少主机请求次数。在实际中作用不大,只是让你爽一下。 |
|
地板#
发布于:2003-07-15 09:47
你先要确定你的系统的瓶颈是在哪里,再采取对应的措施。
是host分配的带宽不够?或是硬件的设计架构的问题?或是 你的固件的效率不高? 找到了问题所在,才能对症下药。 |
|
地下室#
发布于:2003-07-15 10:02
对于“数据的接收和发送处理机制”在贴子“关于USB1.1传输速度的讨论”已经略有提及。我个人认为,测试速度时,可以发送设定的数据。也就是排除MCU读写数据延误。假如速度依然很低,那你固件有待改善。一般来说,只要参照飞利浦程序应该没问题。 谢谢你的回答,我现在用的正是BUSHOUND来测试的,而且固件中没有任何读写操作,只是先给EpBuf赋初值64个A,然后循环发送,而且只是上传数据,我自己的板子作了128K的ram但是并没有对它操作。我初步怀疑是不是周立功固件程序中的写操作函数需要优化? 顺便问一下,飞利浦的D12TEST程序显示的读写速度只有64Kbyte/s,为什么他不能做的快一些,难道他程序中有陷阱,速度只能达到这么快? |
|
5楼#
发布于:2003-07-15 10:05
感谢楼上各位的回答,放点分,先!
|
|
6楼#
发布于:2003-07-15 10:16
我感觉飞利浦的D12的写操作函数好象需要优化,不知道对不对,我把它贴出来,希望高手指点一下!
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf) { unsigned char i; if(bEPPflags.bits.in_isr == 0) DISABLE; outportb(D12_COMMAND, endp); inportb(D12_DATA); outportb(D12_COMMAND, 0xF0); outportb(D12_DATA, 0); //reserve outportb(D12_DATA, len); //length of endpoint data structure for(i=0; i<len; i++) outportb(D12_DATA, *(buf+i)); outportb(D12_COMMAND, 0xFA); ////enable buffer :means the data in the buffer can be send //// to host pc after next \"IN\" sign; if(bEPPflags.bits.in_isr == 0) ENABLE; return len; } void outportb(unsigned char port, unsigned char val) { unsigned char xdata *ext_address; ext_address=0xff00 + port; *ext_address = val; } unsigned char inportb(unsigned char port) { unsigned char c; unsigned char xdata *ext_address; ext_address=0xff00 + port; c = *ext_address ; return c; } 我觉得inportb()和outportb()可以直接用XBYTE的,把D12 当成外部RAM进行写操作,不知道可不可以? |
|
7楼#
发布于:2003-07-15 10:17
不是philip的问题,是周立功没有把人家的原装板扒好,好多功能无法实现不说,速度更是相差很多。
|
|
8楼#
发布于:2003-07-15 10:21
你先要确定你的系统的瓶颈是在哪里,再采取对应的措施。 你说的我都不是很清楚啊!我要怎么样才能知道host分配的带宽呢?硬件的构架应该没有太大的问题,我在枚举成功之后,只是将EpBuf赋初值,然后循环发送,我怀疑是固件效率不高,我把写操作贴出来了,如上,能帮忙看看吗? |
|
9楼#
发布于:2003-07-15 10:56
host分配的带宽就是你的endpoint的配置,比如传输方式和MaxPacketSize这些参数,bulk不保证带宽的(所以如果host端
的其他外设如果占用总线的话,你的BULK的endpoint就会很慢), 而int和iso方式是保证带宽的,如果host无法满足你的带宽需求, 你的设备无法装入。如果host分配给你的带宽就不到200kbytes/s, 你怎么优化都达不到这个速率的。 对于硬件架构的问题,你需要看d12的接口时序和你自己的接口时序 是否能完全吻合,并且没有浪费。我没用过d12,看了一下它的接口, 读写cycle都是500ns(min),应该可以到2MBytes/s的,如果你的 硬件和固件设计够好的话,可以趋近这个极限。 关于固件代码的优化,取决于你的MCU的指令周期,终极目标是让 (完成一次读写的指令数*指令周期)趋近于D12的接口的读写周期, 这样就没有任何时间的浪费了。我不了解你的具体系统设计,无法提出优化的建议。不过可以提一个小的建议,inportb和outportb你 可以不用函数,而使用macro,这样可以省掉频繁的入栈和出栈操 作。 |
|
10楼#
发布于:2003-07-15 11:10
不是philip的问题,是周立功没有把人家的原装板扒好,好多功能无法实现不说,速度更是相差很多。 为什么会这样呢?程序他也是基本照抄飞利浦的啊! |
|
11楼#
发布于:2003-07-15 11:12
不是philip的问题,是周立功没有把人家的原装板扒好,好多功能无法实现不说,速度更是相差很多。 能不能说清楚一点,到底是哪里没有扒好呢?是硬件有问题,还是软件改的有bug? |
|
12楼#
发布于:2003-07-15 14:13
\"我自己的板子作了128K的ram\"呵呵,有钱哪。
周立功完全抄飞利浦的程序的嘛!周立功的板子也是照搬的。 我没用过周立功的固件,我是自己写的。看来“for(i=0; i<len; i++)”这一句可以把循环次数改小点,如果测试用,甚至可以写64句outportb。outportb(D12_COMMAND, endp);后面inportb可以省略。如testing所说,把outportb、inportb改成marco,或则用汇编重写writeendpoint(),readendpoint()。最后参照jinghuiren说的,充分利用双缓冲。 |
|
13楼#
发布于:2003-07-17 22:10
我看就汇编好使了,我已经成功开发了汇编程序。速度基本接近极限了。D12确实不行啊。
|
|
14楼#
发布于:2003-07-18 08:16
9603 很快。
|
|
15楼#
发布于:2003-07-18 16:42
我看就汇编好使了,我已经成功开发了汇编程序。速度基本接近极限了。D12确实不行啊。 速度基本接近极限?是多少啊,我怎么做只有50K BYTE/s左右,他的D12TEST.EXE上面显示他的速度能够达到64K,完全是骗人,我用BUSHOUND测过了,发送一次64个字节需要5.9ms,也就10K/S左右,我都可以达到1.2ms,真不知道他是怎么测的,完全骗人! |
|
16楼#
发布于:2003-07-18 16:52
\"我自己的板子作了128K的ram\"呵呵,有钱哪。 高手!固件完全自己写啊?我试过双缓冲的,结果速度好象更慢了!我看了D12的资料,好象在setMode中把端点2设成iso-in的方式,再在端点配置中把Max-packet-size改成128,就可以了,然后我就直接使用writeEndpoint(),速度反而更慢了,是不是还有什么地方需要修改? |
|
17楼#
发布于:2003-07-18 16:54
鱼儿不要急啊!
搞定问题有时需要灵感的! |
|
|
18楼#
发布于:2003-07-18 16:57
9603 很快。 它的速度能够作到多少?我2001年曾经看过9603的资料的,当时想用9603+FLEX10K,后来感觉资料太少就放弃了,中间又做别的浪费了一年的时间,最后感觉D12的资料比较多,就直接买了快smart开发板,现在发现上当受骗,真是一失足成千古恨啊! |
|
19楼#
发布于:2003-07-18 17:31
我也曾经遇到过楼主的情况,我采取以下方法问题得到解决,现在传送32M内容只需35秒,基本达到要求。
1、瓶颈之一是MCU工作频率太低造成MCU读写FLASH速度太慢,我把原来的8M提高到24M速度大大提高。 2、主机端的编程问题: 把 Function1(...) { Createfile(...); Readfile(...); Closehandle(...); } 循环执行Function1(...); 改成 Function2(...) { Createfile(...); 循环执行Readfile(...); //关键地方 Closehandle(...); } 上述方法在传送大量数据时尤其重要,Function1把大量时间消耗在建立与取消链接(Createfile、Closehandle)中,Function2在整个传送中只建立与取消链接一次。原则是建立链接时主机告诉USB设备要得到什么,然后USB设备不断收/发,主机也不断发/收,传送完了再结束链接, 3、把主机端的BUFFER加大,一般16K、32K就足够了,再加大速度没有明显提高,因为D12只有128Byte BUFFER。 最后速度上去后记住给我加分。 |
|
|
上一页
下一页