workbee
驱动牛犊
驱动牛犊
  • 注册日期2001-04-24
  • 最后登录2012-05-30
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3602回复:2

使用9054rdk-little开发板中遇到的问题

楼主#
更多 发布于:2001-08-06 18:08
//使用9054rdk-little开发板,利用plx-sdk pro v3.20 自带的驱动程序,和其本身的
//api函数做了一个如下的测试速度的程序,发现速度很慢,用逻辑分析仪看,DMA传输
//本身仅需要180us,但两次DMA传输之间有1MS的延时,不知如何解决此问题?
//环境:win98se,vc++6.0(sp4),plx-sdk pro v3.20



#include "stdafx.h"
#include <time.h>

#include <stdio.h>
#include <conio.h>

#include "PlxApi.h"

# define bufferward 4096



int main(int argc, char* argv[])
{
HANDLE hDevice;
RETURN_CODE rc;
DEVICE_LOCATION Device;
DMA_TRANSFER_ELEMENT DmaData;
DMA_CHANNEL_DESC DmaDesc;


PCI_MEMORY PciBuffer;

struct tm *newtime;
   long ltime;

U32 tempdataIn[bufferward];//原始数据


VIRTUAL_ADDRESSES Va;


int i,t,temp;
int result;

int tcount=bufferward*4;//传输计数TransferCount,最终为字节


// Open for the  device matching a specific Vendor ID,Device Id
Device.BusNumber = (U32)-1;
Device.SlotNumber = (U32)-1;
Device.VendorId = 0x10b5; // PLX Vendor ID
Device.DeviceId = 0x5406;
Device.SerialNumber[0] = '\0';


//得到程序开始时间
time( &ltime );

   /* Obtain coordinated universal time: */
   newtime = gmtime( &ltime );
   printf( "Coordinated universal time is %s\n",
                               asctime( newtime ) );


rc = PlxPciDeviceOpen(
&Device,
&hDevice
);


    
PlxPciBoardReset(
hDevice
);


if (rc != ApiSuccess)
{
 printf("ERROR
writer
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2007-12-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-08-08 13:42
我觉得可能是这样的:DMA传送结束后,9054向总线发中断,对于win98这样的非实时OS,中断响应时间是不可预料的,所以导致PlxDmaSglTransfer函数返回有延时,另一种可能是PLX的驱动程序采用的是common buffer DMA技术,而不是packet-based DMA,这也会引起一些延时。



vrs75
驱动牛犊
驱动牛犊
  • 注册日期2001-08-13
  • 最后登录2001-12-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-08-21 22:50
您的实验正好解决了我的疑问,我一直为这个DMA间隔的具体时间而发愁,因为我没有东西实验。
具体原因我也不十分明白,但也许硬中断在驱动级响应不会影响多少,是不是启动DMA浪费了太多的时间呢?照WIN驱动的标准流程看,我一直琢磨应用级DMA的启动将是非常臃肿的,好比一个庞大的官僚机构管理唯一的总线资源,你有条件应该检验一下是不是启动DMA浪费的时间。也就是那个180us在1MS中的位置。
如果实用是突发数据还好办,如果是连续的是不是要在驱动里做点文章,提高DMA的效率呢?如果还不够用的,直觉只有在卡上用多多的FIFO,加大每次DMA数量,这样减少启动DMA的次数,再优化一下驱动,应该可以达到相当高的速度了。
如果卡上FIFO很浅,频繁的中断也是问题了,这个已经在一篇文章里验证。我没条件实验,麻烦您帮我试验一下是不是这个情况,谢谢!
游客

返回顶部