请问:PCIS-DASK中的双缓冲数据传输函数具体是如何工作的? 点击:777 | 回复:1



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2002-12-24 10:12:00
楼主
各位老师,在PCIS-DASK中的连续AI采样中的Double-buffer Mode中有几个函数,分别是AI_AsyncDblBufferHalfReady(), AI_AsyncDblBufferTransfer(). 我理解的是,程序在我们设置好连续采样模式与双缓存大小后,就让AD(PCI-9112)以DMA方式先向半缓冲区A中写数据,我们则使用AI_AsyncDblBufferHalfReady(以下简称HalfReady)来检测是否已写满A,若写满,则我们可以用AI_AsyncDblBufferTransfer(以下简称Transfer)来取走A中的数据,而同时AD还在以DMA方式向半缓冲区B中写数据。 问题是,为什么在用Transfer函数取走数据前若不使用HalfReady函数检测,取出的数据就完全不是输入信号呢?(我输入的是正弦信号,记录到的却是直线)。按理说,不检测半缓存就取数据只应该是会重复取或漏取而已,不应该取出0电位呀? 另外,为什么在连续使用两次HalfReady后再使用Transfer取出的数据与只使用一次HalfReady就用Transfer取出的数据不一样?相反,若只用一次HalfReady后连续用两次Transfer取出的数据与只使用一次Transfer得到的数据一样呢? 我猜想,是不是HalfReady函数不仅仅是起检测的作用,还起一种标记作用呢?比如说如果HalfReady标记当前的可取数据区是A的话,无论我连续用几次Transfer,取的数据始终是A中的,而B中的数据则被禁用了呢? 请各位老师能详细介绍一下AI_AsyncDblBufferHalfReady与AI_AsyncDblBufferTransfer的工作原理,如果可以的话再讲讲AI_AsyncCheck的工作原理吧。谢谢!



李侃

  • 精华:22帖
  • 求助:0帖
  • 帖子:30帖 | 813回
  • 年度积分:0
  • 历史总积分:1015
  • 注册:2002年2月27日
发表于:2002-12-24 10:12:00
1楼
如手册6.2节所示,Double-buffered AI其实是在Driver里面运作,每当使用者查到Half Ready事件时,再以Transfer取出的数据。在6.2节的示意图中,那个比较小的Buffer就是您在程序里Allocate出来的,而那个比较大的Buffer,是Driver Allocate出来的。对于Driver而言,它必须知道使用者下了Transfer指令的时候,要把那个半缓冲区复制到User建立的那块Memory中。目前的作法是,当Half Ready被查到的时候,Driver才把Buffer的指针指到目前Ready的Buffer上。如果你没有执行CheckHalfReady的话,指针不会变动,永远都会指向同一个半缓冲区。这也是您为什么发现只用一次HalfReady后连续用两次Transfer取出的数据与只使用一次Transfer得到的数据一样的原因。但即使您连续使用两次CheckHalfReady的指令,也必须两次都查到了Half Ready结果,取出的数据才会不一样。如果第一次查到Half Ready,而第二次没有,Transfer的指令还是会取出同样的数值

热门招聘
相关主题

官方公众号

智造工程师