阅读:1199回复:5
<PDIUSBD12固件编程与驱动开发>一书中的一个小问题
在书的p69页的主端点out程序中有这么几句:
D12_ReadLastTransactionStatus(4); eps=D12_ReadEndpoint(4); eps&=0x60; len=D12_ReadEndpoint(4,64,epbuf); if(eps==0x60) len=D12_ReadEndpoint(4,64,epbuf); 大家看看,这段程序是用于读缓冲区里的数据,第一个缓存区读完后再读第二个缓冲区,但是epbuf的指针都没有改动,那么第二个D12_ReadEndpoint读出来的数据就把第一次D12_ReadEndpoint读出的数据给冲掉了,是不是这样的呢? 还有再第60页的D12_ReadEndPoint()函数中有这么一句 outportb(d12_command,0x80+endp); i=inportf(D12_data); if(endp==2) { if(i==0x60) bEppflags.bits.ep1buf_full=1; else beppflags.bits.ep1buf_full=0; } if(endp==4) { if(i==0x60) bEppflags.bits.ep2buf_full=1; else beppflags.bits.ep2buf_full=0; } 据我了解,d12只有主端点(索引4,5)才是双缓冲,为什么endp=2还要这样判断(i==0x60)? |
|
沙发#
发布于:2004-03-03 11:59
epbuf肯定被冲了。但这和你的应用模式有关。在有些协议中要求保留最新的东西,有些协议允许丢包。相信这点大家是知道的。
我没有仔细研读过周立功的东西,粗略看过。 基本上是入门使用的AS-IS代码。有些PHILIPS原厂代码中的粗糙之处也彻底搬过来了。举例如下: 1。有的函数声明了变量,并未使用。 2。采用了C语言中结构体缩短位数据(使用":"的语法)。这种语法的效率不高。bEppflags结构就是这样的。如果实际使用,最好使用bit操作,虽然不如结构漂亮,但底层代码应该考虑。 3。多数中断的开关(EA)值得推敲。51的同级中断是不允许重入的,所以中断未必需要那么频繁的开关。 最后,再为周立功说句公道话:他的代码似乎是考虑微机与单片机兼容的,所谓顾此失彼,也就难免了。 关于问题二,得批评Philips几句,有些东西似乎文档里说得有点模糊,有人声称端点1也是双缓冲的。但无论如何,代码那样写不会出问题,最多是看着不舒服。 |
|
|
板凳#
发布于:2004-03-02 22:24
这两个问题我也不太明白,这里的endp=2不是主端点,应该是端点1的OUT,endpointstatus寄存器里的buffer0,buffer1具体指什么?
第一个问题,每次len=D12_ReadEndpoint(4,64,epbuf);不都是将epbuf首址传出去,从首址开始写吗?clementzhao网友提到的epbuf的指针是什么? 大家讨论一下好吗? |
|
地板#
发布于:2004-02-27 16:44
主段点就是段点2。
epbuf的指针都没有改动就是连续读2个BUF啊,有什么问题?如果epbuf的指针RESET了才会冲掉。 |
|
地下室#
发布于:2004-02-27 16:12
关注
|
|
5楼#
发布于:2004-02-27 11:23
这个去周立功问估计好点:)
|
|
|