阅读:3602回复:2
使用9054rdk-little开发板中遇到的问题
//使用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( <ime ); /* Obtain coordinated universal time: */ newtime = gmtime( <ime ); printf( "Coordinated universal time is %s\n", asctime( newtime ) ); rc = PlxPciDeviceOpen( &Device, &hDevice ); PlxPciBoardReset( hDevice ); if (rc != ApiSuccess) { printf("ERROR |
|
沙发#
发布于:2001-08-08 13:42
我觉得可能是这样的:DMA传送结束后,9054向总线发中断,对于win98这样的非实时OS,中断响应时间是不可预料的,所以导致PlxDmaSglTransfer函数返回有延时,另一种可能是PLX的驱动程序采用的是common buffer DMA技术,而不是packet-based DMA,这也会引起一些延时。
|
|
板凳#
发布于:2001-08-21 22:50
您的实验正好解决了我的疑问,我一直为这个DMA间隔的具体时间而发愁,因为我没有东西实验。
具体原因我也不十分明白,但也许硬中断在驱动级响应不会影响多少,是不是启动DMA浪费了太多的时间呢?照WIN驱动的标准流程看,我一直琢磨应用级DMA的启动将是非常臃肿的,好比一个庞大的官僚机构管理唯一的总线资源,你有条件应该检验一下是不是启动DMA浪费的时间。也就是那个180us在1MS中的位置。 如果实用是突发数据还好办,如果是连续的是不是要在驱动里做点文章,提高DMA的效率呢?如果还不够用的,直觉只有在卡上用多多的FIFO,加大每次DMA数量,这样减少启动DMA的次数,再优化一下驱动,应该可以达到相当高的速度了。 如果卡上FIFO很浅,频繁的中断也是问题了,这个已经在一篇文章里验证。我没条件实验,麻烦您帮我试验一下是不是这个情况,谢谢! |
|