4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1949回复:9

怎么在双缓冲区之间切换?

楼主#
更多 发布于:2003-08-19 16:20
我想在D12的双缓冲区之间切换?可是这个双缓冲区对用户来说是透明的,我怎么知道它用的是哪个缓冲区那?
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-20 09:01
读取端点状态,bit 6,5表示2缓冲空满。
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-20 09:31
这个我知道啊,我这里其实是写数据太慢了,但是上位机要不停地读,我想在我得数据没有写完的时候,用另外一个缓冲区来应付上位机,写0给上位机就行了,不然的话,上位机在读数,但是下位机又没有写完,这样上位机就在那里傻等了,好像是死了一样。
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-21 09:24
你是想一个缓冲没写完,就在另一个缓冲写数据应付上位机?这样不行啊,双缓冲自动切换的。不如你每次写入缓冲数据量少一点还好,还有点奇怪:你的数据读取时间是多少?我使用io模拟地址线,再转地址读取数据都不会出现“上位机就在那里傻等了,好像是死了一样。”你读取一次数据机器周期是多少?1ms已经比较充裕了。
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-21 09:58
具体来说我得数据是需要实时传送给上位机的,每20ms有720字节,但是在这20ms内,每55.6us会有两个时钟中断要处理,处理完这两个中断之后,只有大约18us给usb传输数据了,因为这两个时钟的中断优先级是高于usb中断的。我得做法是采样完一个周期之后,把数据放在外部ram区,然后再送给usb,这样的话,每次给usb送数的时候,都要被那两个时钟给中断了。我发现被中断后,上位机读数一段时间就会死了,我怀疑是下位机写数据不够快。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-21 12:57
原因应该是你想的那样。
你可以试试这样的做法,你不要采样完存到ram中,再转到usb中,你可以在那两个中断里直接把数据写到usb端口里去,这样如果速度匹配的好的话,是不会丢数据的,因为在上一个包发送过程中,下面的数会写到双缓冲的第二个缓冲区里,如果出现丢数据,在把丢失的那些数据存起来,再那18us的时间里把它写到端点里即可。
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-08-21 13:08
我也这样试过的,但是我得每55.6us只能有2B的数据阿,这样的话,写满64B需要的时间是55.6*32=1779。2us的时间,在这个时间里,上位机早就发出in命令了,可是缓冲区里面还是没有数据,那么上位机的读线程就会死掉。我这样做的结果就是这样的,是我这样分析吗?因为上位机一次读数768(720+46),在驱动里面分成12各64B的包,下位机就会产生12次中断,上位机没有办法控制每两次中断之间的时间啊。他只能是读到了64B就发出下一个in命令,是吗?


clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-08-21 15:01
可以这样:每隔一段时间上位机(定时器)询问一次,如果数据收集不够,发回not ready,如果够就直接返回。not ready可以是2、3各字符搞定,你下位机再慢也可以了吧。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-08-21 15:11
也就是说你2MS才有64B的数据,那为什么不用中断传输呢?中断传输每MS会查询一次,如果第一次没准备好,第二次查询的时候就应该准备好了,另外你上位机不要一次读那么多数,根据你的情况,一次读64B就足够了,你可以循环的读数据吗,BULK是最快的方式,可是并不是说所有的情况都得用BULK传输呀,那还要INT和ISO干什么?
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-08-21 23:15
谢谢仁兄的指点,试试看了,应该是可以的
游客

返回顶部