搜索
bottom↓
回复: 27

GD32的USB 虚拟串口速度怎么提升?

[复制链接]

出5入4汤圆

发表于 2019-9-16 23:27:06 | 显示全部楼层 |阅读模式
最近用到了GD32E103RB这个片子,120M主频,128+32的配置,USB是FS的速度,在办公室测试了一下速度(采用while循环直接发送10000个数据包,每个包是64字节),居然要10秒左右
算下来速度 < 64KB/S
我对USB比较陌生,之前没搞过,所以本能地搜索ST相关的USB速度优化办法(毕竟GD32很多都是和ST差不多的),网上有两个办法:
1、USB好像每1ms只能发送一个数据包,每包都是64字节,所以一秒也就64K,所以提速的话可以想办法让USB每1ms发送多个数据包出来,速度就能提升了。
听起来很有道理,但是我找了半天没找到1ms在usb是怎么做到的,关于数据缓冲大小什么的参数,改了好几个参数都没效果
2、网上有网友说道了双bulk缓冲的概念,但是我真不知道该哪里
以上两个办法有的甚至说到了具体的函数了,可惜GD32的USB协议栈和ST的不一样,函数名称也对不上
谁懂usb协议栈的帮忙看看呢,小弟我今天可能要做个可耻的伸手党了


附件:GD32官方demo,仅保留了USB 虚拟串口工程

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出590入992汤圆

发表于 2019-9-16 23:36:14 | 显示全部楼层
640000/10 = 64000Byte = 640KB/S = 5.12Mb/S
ST的CDC好像可以做到1.2Mb/S

出0入0汤圆

发表于 2019-9-17 00:46:53 | 显示全部楼层
1ms一个数据包,一个数据包最大64字节这个是全速HID设备的,对于CDC来说不是这样的。

出5入4汤圆

 楼主| 发表于 2019-9-17 07:10:24 来自手机 | 显示全部楼层
SUPER_CRJ 发表于 2019-9-16 23:36
640000/10 = 64000Byte = 640KB/S = 5.12Mb/S
ST的CDC好像可以做到1.2Mb/S

64000byte=64KB吧,您算错了
说来搞笑,昨天发了帖子又看了一会儿别人的资料,昨晚睡觉梦到有人直接把修改办法写在黑板上上了,早上醒来恨自己没抄下来

出590入992汤圆

发表于 2019-9-17 08:40:27 | 显示全部楼层
tim4146 发表于 2019-9-17 07:10
64000byte=64KB吧,您算错了
说来搞笑,昨天发了帖子又看了一会儿别人的资料,昨晚睡觉梦到有人直接把修 ...

这个没错吧?
如果当成1024 = 1K那就确实错了。

出0入85汤圆

发表于 2019-9-17 09:33:36 来自手机 | 显示全部楼层
本帖最后由 Huaan 于 2019-9-17 09:35 编辑

LZ最好再看看USB的基础知识,1ms可不只能发一个包哦,对于全速USB的批量传输,最大是19个包,因此全速USB的批量传输的理论最大数据速率是64B*19*1000=1.216MB/s。超过64字节的发送,驱动会自动给你分包的。另外STM32的USB库有个CDC_IN_FRAME_INTERVAL会限制发送速度

出0入8汤圆

发表于 2019-9-17 09:39:51 | 显示全部楼层
楼主 你这测试有问题吧  GD的 CDC 如果while 循环发送 不可能才这点速度的。

出0入0汤圆

发表于 2019-9-17 10:05:01 | 显示全部楼层
注意包和帧  一个帧是1ms  但是一个帧内有多个包  

出0入0汤圆

发表于 2019-9-17 10:07:53 | 显示全部楼层
bulk包结束:非整数端点长 或 0包长   假设端点大小50  每个包最大50  要发100可依次50+50+0   要发80可依次50+30

出0入0汤圆

发表于 2019-9-17 10:10:25 | 显示全部楼层
提高速度就是每次发多包长  爽缓冲事倍功半,只为了榨干剩余那点潜力 意义通常不大

出5入4汤圆

 楼主| 发表于 2019-9-18 02:43:52 | 显示全部楼层
Huaan 发表于 2019-9-17 09:33
LZ最好再看看USB的基础知识,1ms可不只能发一个包哦,对于全速USB的批量传输,最大是19个包,因此全速USB的 ...

您这样算一下确实能达到FS的12M速度,CDC_IN_FRAME_INTERVAL这个变量在GD的代码里面连个影子都没有..实在没办法只能自己找点资料看看了
有推荐的入门资料吗?

出5入4汤圆

 楼主| 发表于 2019-9-18 02:45:13 | 显示全部楼层
kebaojun305 发表于 2019-9-17 09:39
楼主 你这测试有问题吧  GD的 CDC 如果while 循环发送 不可能才这点速度的。

官方把功能做出来了,性能我就不提要求了,自己搞吧
不止是GD32,ST的cube生成的demo也是差不多的情况

出5入4汤圆

 楼主| 发表于 2019-9-18 02:47:08 | 显示全部楼层
huangqi412 发表于 2019-9-17 10:10
提高速度就是每次发多包长  爽缓冲事倍功半,只为了榨干剩余那点潜力 意义通常不大 ...

学习了,我再试试看能否通过改参数做到1ms发多个包吧

出0入8汤圆

发表于 2019-9-18 08:38:23 | 显示全部楼层
tim4146 发表于 2019-9-18 02:47
学习了,我再试试看能否通过改参数做到1ms发多个包吧

GD的 CDC  有个 回环demo程序。  就是接收到数据后立即回发出去。  这个demo  速度很快的。

出10入46汤圆

发表于 2019-9-18 08:43:24 | 显示全部楼层
Win10 下的无法识别驱动的问题,解决了吗?

出5入4汤圆

 楼主| 发表于 2019-9-18 11:16:16 来自手机 | 显示全部楼层
gonboy 发表于 2019-9-18 08:43
Win10 下的无法识别驱动的问题,解决了吗?

解决了,下载了gd的驱动就好了

出5入4汤圆

 楼主| 发表于 2019-9-18 11:31:03 来自手机 | 显示全部楼层
kebaojun305 发表于 2019-9-18 08:38
GD的 CDC  有个 回环demo程序。  就是接收到数据后立即回发出去。  这个demo  速度很快的。 ...

我就是在这个上面改的,测了一下,上位机用的accessPort软件,据说是效率比较高的,设置1ms循环发送,每次发送200字节,持续发送了5秒,看了一下数据是,发送13600,接收13600,理论应该是200乘以1000乘以5=1000000字节才对,说明下位机发送不是很快啊

出5入4汤圆

 楼主| 发表于 2019-9-18 11:33:01 来自手机 | 显示全部楼层
kebaojun305 发表于 2019-9-18 08:38
GD的 CDC  有个 回环demo程序。  就是接收到数据后立即回发出去。  这个demo  速度很快的。 ...

刚刚是pcb直接连电脑试的,如果我把pcb连usb hub再连电脑,速度会快一些,5秒测试,发送接收都是27400字节,快了一倍。

出5入4汤圆

 楼主| 发表于 2019-9-18 11:48:36 来自手机 | 显示全部楼层
Huaan 发表于 2019-9-17 09:33
LZ最好再看看USB的基础知识,1ms可不只能发一个包哦,对于全速USB的批量传输,最大是19个包,因此全速USB的 ...

今天测试发现速度算下来居然有256KB/s,代码明明没有改,后来发现是产品连了usb hub或者直接连电脑的区别,可能电脑识别出了问题了,硬件上D+引脚没有加上拉电阻,下午飞个电阻再试试

出0入85汤圆

发表于 2019-9-18 12:22:38 | 显示全部楼层
本帖最后由 Huaan 于 2019-9-18 12:29 编辑
tim4146 发表于 2019-9-18 11:48
今天测试发现速度算下来居然有256KB/s,代码明明没有改,后来发现是产品连了usb hub或者直接连电脑的区别 ...


如果D+和D-上都没有上拉电阻,应该都识别不到USB设备才对
没用过GD32,内部有上拉?
D+上拉会识别成全速,D-上拉会识别成低速

出5入4汤圆

 楼主| 发表于 2019-9-18 13:17:57 来自手机 | 显示全部楼层
Huaan 发表于 2019-9-18 12:22
如果D+和D-上都没有上拉电阻,应该都识别不到USB设备才对
没用过GD32,内部有上拉?
D+上拉会识别成全速 ...

给d+单独上拉了电阻,直插电脑之后速度还是比较慢,没效果。非要插上我那个hub才能加快

出5入4汤圆

 楼主| 发表于 2019-9-18 13:25:19 来自手机 | 显示全部楼层
Huaan 发表于 2019-9-18 12:22
如果D+和D-上都没有上拉电阻,应该都识别不到USB设备才对
没用过GD32,内部有上拉?
D+上拉会识别成全速 ...

拿掉外部的电阻,用万用表量了一下,d+是有内部上拉了

出5入4汤圆

 楼主| 发表于 2019-9-18 14:12:18 来自手机 | 显示全部楼层
同样显示都是12M速率,直连电脑就是要慢,好奇怪

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出5入4汤圆

 楼主| 发表于 2019-9-18 17:06:56 来自手机 | 显示全部楼层
更新一下进度,连hub之后的工作默认可能不是中断默认,数据包越大,单次发送时间越长。

出5入4汤圆

 楼主| 发表于 2019-9-18 17:12:48 来自手机 | 显示全部楼层
gd32 demo里面的发送函数限定了发送报文长度这个参数只能最大64字节,但是内层的函数还是存在计算包个数的过程,这个和楼上说的1ms不一定只能发一个包的说法是吻合的,所以应用层的函数干脆直接调用这个函数,然后把发送字节数放大。实际测试发现单次发送256字节,配合抓包工具观察,能做到严格的1ms一次发送,这样就是256KB/s速度了。我尝试单次发送512字节,发现发送过程不再是1ms一次,有时候会出现几十ms的卡顿,尝试修改内部.h参数,改了好几个都没用。

出5入4汤圆

 楼主| 发表于 2019-9-18 17:14:06 来自手机 | 显示全部楼层
如果1ms能发送19个包,也就是1216字节,速度就能发到fs速度的,目前算下来每毫秒就4个包…继续努力

出0入0汤圆

发表于 2019-9-18 21:49:58 来自手机 | 显示全部楼层
tim4146 发表于 2019-9-18 17:14
如果1ms能发送19个包,也就是1216字节,速度就能发到fs速度的,目前算下来每毫秒就4个包…继续努力 ...

上位机也有关。。。不一定单片机锅
再说检查发送包所需时间 如果子函数太磨蹭,执行一次要200us  1ms那就只能4个啊

出5入4汤圆

 楼主| 发表于 2019-9-20 15:19:34 来自手机 | 显示全部楼层
试过各种办法,还是没办法提升,打算先放一放,马上买本书看看usb底层知识,如果能看懂原理应该会有很多思路吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 19:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表