打印

调了一天时间,发现STM32F10X的USB库的BUG

[复制链接]
5309|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Simon21ic|  楼主 | 2012-2-8 21:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
貌似这个BUG历来已久,在一些特定情况下,会引起USB稳定性问题。

#define _ClearEP_CTR_RX(bEpNum)   (_SetENDPOINT(bEpNum,\
                                   _GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK))
#define _ClearEP_CTR_TX(bEpNum)   (_SetENDPOINT(bEpNum,\
                                   _GetENDPOINT(bEpNum) & 0xFF7F & EPREG_MASK))

引发BUG的条件:
USB非中断操作,并且使用同一个端口的输入和输出。
中断方式操作的话,由于处理速度非常快,一般不会发生问题。

引发原因:
_ClearEP_CTR_RX和_ClearEP_CTR_TX意外清零CTR_TX和CTR_RX。

有问题的宏都贴出来了,看不懂打PP。
沙发
pkat| | 2012-2-8 21:34 | 只看该作者
有时间验证一下

使用特权

评论回复
板凳
cool_coder| | 2012-2-9 15:59 | 只看该作者
关注一下。

使用特权

评论回复
地板
Simon21ic|  楼主 | 2012-2-9 16:08 | 只看该作者
呵呵,这个问题是一个非常不错的反面教材,刚刚开会教育了一下公司的开发人员,以后会作为我公司培训中的一个反面案例。

使用特权

评论回复
5
xsgy123| | 2012-2-9 16:12 | 只看该作者
是因为你公司的开发人员没有发现这个BUG吗

使用特权

评论回复
6
Simon21ic|  楼主 | 2012-2-9 16:15 | 只看该作者
本帖最后由 Simon21ic 于 2012-2-9 16:19 编辑

这个BUG貌似几年了,都没有被发现,只是要培养他们良好的开发习惯而已,在一定规模的协议栈下,即使一些非常小的问题,调试也会非常花时间。
我也只是在这个特定的应用环境下才发现这个BUG而已,大家不必在意。

另外,话说这个理应不叫BUG,按照一些IC厂家内部的说法,可以修复的只能叫“缺陷”。

使用特权

评论回复
7
txcy| | 2012-2-9 22:27 | 只看该作者
需要进一步完善的缺陷

使用特权

评论回复
8
秋天落叶| | 2012-2-9 22:43 | 只看该作者
良好的开发习惯还是很重要的

使用特权

评论回复
9
xblei| | 2012-2-10 08:46 | 只看该作者
领教了。

使用特权

评论回复
10
无冕之王| | 2012-2-10 17:35 | 只看该作者
不太好发现

使用特权

评论回复
11
kevin_ares| | 2012-2-11 23:27 | 只看该作者
看不出来,求打PP,求指导

使用特权

评论回复
12
kevin_ares| | 2012-2-13 10:12 | 只看该作者
难道 _GetENDPOINT 时 tx位为0
SetENDPOINT前一瞬间 ,硬件已经把tx置为1了,但程序还是按旧值写入,

使用特权

评论回复
13
Simon21ic|  楼主 | 2012-2-13 12:36 | 只看该作者
多任务平面下的原子性读写问题,忘记说现象了,对应USB ep会死掉,并且以一定概率发生

使用特权

评论回复
14
lxyppc| | 2012-2-13 13:34 | 只看该作者
我也有个对STM32 USB库的疑問没弄明白
https://bbs.21ic.com/icview-306802-1-1.html

使用特权

评论回复
15
kevin_ares| | 2012-2-13 13:50 | 只看该作者
多任务平面下的原子性读写问题,忘记说现象了,对应USB ep会死掉,并且以一定概率发生
Simon21ic 发表于 2012-2-13 12:36

那请问这应该怎么修改呢

有没有原子性的操作能将这两位置0?

使用特权

评论回复
16
Simon21ic|  楼主 | 2012-2-13 17:17 | 只看该作者
14# lxyppc
我用的是自己写的USB库,不是ST的库,你的问题应该直接去问ST代理的技术支持。

使用特权

评论回复
17
Simon21ic|  楼主 | 2012-2-13 17:18 | 只看该作者
那请问这应该怎么修改呢

有没有原子性的操作能将这两位置0?
kevin_ares 发表于 2012-2-13 13:50


都知道是什么原因引起的了,还修改不了吗?

使用特权

评论回复
18
Simon21ic|  楼主 | 2012-2-13 20:31 | 只看该作者
实际上,ST的USB库在轮询方式下,还有其他问题,不过这些都比较容易发现,主要是由于轮询操作方式,使得处理不及时,而引起的逻辑上的问题。不过,使用ST的库的话,还是建议直接使用中断方式,这样应该是没有问题的。这个帖子就到此结束了吧。

使用特权

评论回复
19
lxyppc| | 2012-2-14 10:16 | 只看该作者
14# lxyppc
我用的是自己写的USB库,不是ST的库,你的问题应该直接去问ST代理的技术支持。
Simon21ic 发表于 2012-2-13 17:17

楼主之前写过一个USB的stack,是那个库吗?

使用特权

评论回复
20
Simon21ic|  楼主 | 2012-2-14 21:45 | 只看该作者
就是那个,不过目前只有我一个人在用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:www.versaloon.com --- under construction

266

主题

2597

帖子

104

粉丝