hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1416回复:9

麻烦解释一下D12的主端点的双缓冲?

楼主#
更多 发布于:2003-12-05 12:09
看了D12Test开发板的固件,有些地方不明白,就是在主端点从主机收数中提到了双缓冲结构,不是很明白,麻烦解释一下。
void main_rxdone(void)
{
  unsigned char len,epstatus;
  D12_ReadLastTransactionStatus(4);
  epstatus=D12_ReadEndpointStatus(4);
  epstatus&=0x60;
  len=D12_ReadEndpoint(4,64,EpBuf);
  if(epstatus==0x60)
   len=D12_ReadEndpoint(4,64,EpBuf);
}
其中为什么要读两次?
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-05 14:17
2个缓冲去都有数据就读两次,只有一个有数据就只读一次
hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-05 15:04
如果两个缓冲区都有数,那么它们之间有什么关系没有?
 1。如果主机发送了一个缓冲区大小的数据,是不是只可能有一个缓冲区有数?
 2。如果主机发送了2个缓冲区大小的数据,是不是有可能两个缓冲区都有数,那么这两个缓冲区的数据是不是就是对应于主机发送的两个缓冲区的数据?那又该如何确定两个缓冲区中的数据,那个是在前,那个是在后?
 麻烦解释一下!谢谢
mailxufeng
驱动牛犊
驱动牛犊
  • 注册日期2003-10-15
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-12-05 15:16
其实对于这个问题我做过专门的测试,主端点IN缓冲区的测试结果如下:MCU向D12主端点缓冲区写数据,若缓冲区0为空则写入缓冲区0,若缓冲区0为满(即主机还没取走数据)则检查缓冲区1是否为空,为空则写入缓冲区1,若也为满(即双缓冲都为满)则把数据写入缓冲区0覆盖原来的数据,而主机来读数据时,由D12进行调度,若缓冲区0为满则把0缓冲区数据送入发送缓冲区,若0缓冲区为空则检查1缓冲区是否为满,是则把1缓冲区数据送入发送缓冲区。而从主机接收数据也是一样的道理。这样做是为了增加数据的吞吐量,对大批量传送有利。
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-05 15:20
一句话:不用想。这些前后关系芯片已经替你做好了,你读的第一次数据就是先到的数据。
hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-12-05 15:41
大概懂了,谢谢楼上几位!放分了!
au2o3t
驱动牛犊
驱动牛犊
  • 注册日期2002-12-27
  • 最后登录2004-03-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-12-14 18:14
void main_rxdone(void)
{
unsigned char len,epstatus;
D12_ReadLastTransactionStatus(4);
epstatus=D12_ReadEndpointStatus(4);
epstatus&=0x60;
len=D12_ReadEndpoint(4,64,EpBuf);
if(epstatus==0x60)
len=D12_ReadEndpoint(4,64,EpBuf);
}
正确吗?
是不是应该改成:
void main_rxdone(void)
{
unsigned char len,epstatus;
D12_ReadLastTransactionStatus(4);
epstatus=D12_ReadEndpointStatus(4);
epstatus&=0x60;
len=D12_ReadEndpoint(4,64,EpBuf);
if(epstatus==0x60)
len=D12_ReadEndpoint(4,64,EpBuf+len);
}

????????????????
hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-12-14 20:16
你这样也是可以的!
au2o3t
驱动牛犊
驱动牛犊
  • 注册日期2002-12-27
  • 最后登录2004-03-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-12-15 12:23
void main_rxdone(void)
{
unsigned char len,epstatus;
D12_ReadLastTransactionStatus(4);
epstatus=D12_ReadEndpointStatus(4);
epstatus&=0x60;
len=D12_ReadEndpoint(4,64,EpBuf);
if(epstatus==0x60)
len=D12_ReadEndpoint(4,64,EpBuf);
}
可是上面的代码是正确的吗????
第二次读取不该是len=D12_ReadEndpoint(4,64,EpBuf+len);吗?
那不是把第一次读到的数据覆盖了?
hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-12-15 14:54
呵呵,那只是示例,不是实际的应用例子!
游客

返回顶部