一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2993回复:30

d12的速度问题,重重酬谢!

楼主#
更多 发布于:2003-07-14 17:38
大侠们,救命啊,我只要求能够达到200Kbyte/s就行了,我真的重谢!
我用的芯片是D12+89C58,速度怎么做都只有40Kbyte/s,应用层开的是64K的缓冲区,驱动程序用的是周立功的,固件也是在周立功的上面修改了一点,固件程序除了枚举和往HOST中发数据,基本没做任何事情,我知道固件程序需要优化,可是真的不知道该怎么做!哪位大侠能够上传优化的固件程序参考一下,或者写操作函数也行!如果作的顺利,重重酬谢,一定的money也行!
xjLegend
驱动小牛
驱动小牛
  • 注册日期2002-11-04
  • 最后登录2005-06-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-14 21:34
速度涉及到固件和高层程序的配合、传输方式等等。
固件的优化主要从数据的接收和发送处理机制上想想办法。
我想要点分,这样才有成就感嘛!
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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读写数据延误和减少主机请求次数。在实际中作用不大,只是让你爽一下。
testing
驱动牛犊
驱动牛犊
  • 注册日期2003-06-15
  • 最后登录2003-08-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-15 09:47
你先要确定你的系统的瓶颈是在哪里,再采取对应的措施。
是host分配的带宽不够?或是硬件的设计架构的问题?或是
你的固件的效率不高?
找到了问题所在,才能对症下药。
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-15 10:02
对于“数据的接收和发送处理机制”在贴子“关于USB1.1传输速度的讨论”已经略有提及。我个人认为,测试速度时,可以发送设定的数据。也就是排除MCU读写数据延误。假如速度依然很低,那你固件有待改善。一般来说,只要参照飞利浦程序应该没问题。
因为我使用d12是做Udisk,(速度延误主要在对flash数据存储),所以一直使用HD Tach作测试,发现误差太大(只有20K/byte),在实际使用中是180K/byte。总结:busbond和d12test的测试数据比较可信。So,你是用什么测试出速度的?
还有一个是“应用层开的是64K的缓冲区”,那你的固件也因该相应开同样的缓冲。而且飞利浦d12test程序本来不支持这么大的缓冲,你也要修改。光是应用软件开缓冲是没用的,我是没有64k的ram,只能循环发送来虚拟一下。最后:这个方法归根到底也是减少MCU读写数据延误和减少主机请求次数。在实际中作用不大,只是让你爽一下。


谢谢你的回答,我现在用的正是BUSHOUND来测试的,而且固件中没有任何读写操作,只是先给EpBuf赋初值64个A,然后循环发送,而且只是上传数据,我自己的板子作了128K的ram但是并没有对它操作。我初步怀疑是不是周立功固件程序中的写操作函数需要优化?
顺便问一下,飞利浦的D12TEST程序显示的读写速度只有64Kbyte/s,为什么他不能做的快一些,难道他程序中有陷阱,速度只能达到这么快?
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-15 10:05
感谢楼上各位的回答,放点分,先!
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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进行写操作,不知道可不可以?
flytomoon
驱动巨牛
驱动巨牛
  • 注册日期2003-07-09
  • 最后登录2004-10-18
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-15 10:17
不是philip的问题,是周立功没有把人家的原装板扒好,好多功能无法实现不说,速度更是相差很多。
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-07-15 10:21
你先要确定你的系统的瓶颈是在哪里,再采取对应的措施。
是host分配的带宽不够?或是硬件的设计架构的问题?或是
你的固件的效率不高?
找到了问题所在,才能对症下药。


你说的我都不是很清楚啊!我要怎么样才能知道host分配的带宽呢?硬件的构架应该没有太大的问题,我在枚举成功之后,只是将EpBuf赋初值,然后循环发送,我怀疑是固件效率不高,我把写操作贴出来了,如上,能帮忙看看吗?
testing
驱动牛犊
驱动牛犊
  • 注册日期2003-06-15
  • 最后登录2003-08-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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,这样可以省掉频繁的入栈和出栈操
作。
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-07-15 11:10
不是philip的问题,是周立功没有把人家的原装板扒好,好多功能无法实现不说,速度更是相差很多。


为什么会这样呢?程序他也是基本照抄飞利浦的啊!
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-07-15 11:12
不是philip的问题,是周立功没有把人家的原装板扒好,好多功能无法实现不说,速度更是相差很多。


能不能说清楚一点,到底是哪里没有扒好呢?是硬件有问题,还是软件改的有bug?
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
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说的,充分利用双缓冲。

wang_jingfeng
驱动牛犊
驱动牛犊
  • 注册日期2003-07-13
  • 最后登录2003-09-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-07-17 22:10
我看就汇编好使了,我已经成功开发了汇编程序。速度基本接近极限了。D12确实不行啊。
gjltce
驱动小牛
驱动小牛
  • 注册日期2003-07-05
  • 最后登录2011-12-10
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望59点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-07-18 08:16
9603 很快。
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-07-18 16:42
我看就汇编好使了,我已经成功开发了汇编程序。速度基本接近极限了。D12确实不行啊。


速度基本接近极限?是多少啊,我怎么做只有50K BYTE/s左右,他的D12TEST.EXE上面显示他的速度能够达到64K,完全是骗人,我用BUSHOUND测过了,发送一次64个字节需要5.9ms,也就10K/S左右,我都可以达到1.2ms,真不知道他是怎么测的,完全骗人!
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-07-18 16:52
\"我自己的板子作了128K的ram\"呵呵,有钱哪。
周立功完全抄飞利浦的程序的嘛!周立功的板子也是照搬的。
我没用过周立功的固件,我是自己写的。看来“for(i=0; i<len; i++)”这一句可以把循环次数改小点,如果测试用,甚至可以写64句outportb。outportb(D12_COMMAND, endp);后面inportb可以省略。如testing所说,把outportb、inportb改成marco,或则用汇编重写writeendpoint(),readendpoint()。最后参照jinghuiren说的,充分利用双缓冲。

 


高手!固件完全自己写啊?我试过双缓冲的,结果速度好象更慢了!我看了D12的资料,好象在setMode中把端点2设成iso-in的方式,再在端点配置中把Max-packet-size改成128,就可以了,然后我就直接使用writeEndpoint(),速度反而更慢了,是不是还有什么地方需要修改?
猪爸爸
论坛版主
论坛版主
  • 注册日期2001-08-15
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分1040分
  • 威望438点
  • 贡献值0点
  • 好评度129点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2003-07-18 16:54
鱼儿不要急啊!
搞定问题有时需要灵感的!
俺是[color=red]猪爸爸[/color] [img]http://bbs.zndev.com/image/post/smile/mrgreen.gif[/img] 【[url=http://shop33397538.taobao.com][color=red]猪爸爸本本美容[/color][/url]】 BELKIN贝尔金核心代理
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-07-18 16:57
9603 很快。


它的速度能够作到多少?我2001年曾经看过9603的资料的,当时想用9603+FLEX10K,后来感觉资料太少就放弃了,中间又做别的浪费了一年的时间,最后感觉D12的资料比较多,就直接买了快smart开发板,现在发现上当受骗,真是一失足成千古恨啊!
hewx
驱动牛犊
驱动牛犊
  • 注册日期2001-09-22
  • 最后登录2004-12-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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。

最后速度上去后记住给我加分。


山穷水尽疑无路,柳暗花明又一村。
上一页
游客

返回顶部