微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于Win98平台的DMA高速数据采集系统设计

基于Win98平台的DMA高速数据采集系统设计

时间:05-16 来源:互联网 点击:

即DMA传输结束。部分程序如下:

//Mydma.h头文件

#define MAX_TRANSFER_BYTES //最大传输字节数(自定)

#define MAX_PHYS_ADDR 0xFFF

#define DMA_CHANNEL_NUMBER 3 //使用3号通道

#define READ_DATA 111 //ring3级程序传入的命令码

//模式字定义

#define SINGLE_MODE 0x40 //单字节传输模式

#define INCREMENT_MODE 0x00 //地址加1传输模式

#define WRITEMEM_MODE 0x04 //写传输

......

//Mydma.c文件

//全局变量声明

BOOL hDMA;

PVOID ClientBuffer;

ULONG PhysAddr;

DWORD nBytes;

DWORD nPages;

PVOID DMABufferLinear;

......

BOOL OnSysDynamicDeviceInit( )

{

//虚拟化通道3

hDMA=VDMAD_Virtualize_Channel(DMA_CHANNEL_NUMBER,NULL,NULL);

if (hDMA = =0)

{

}

return FALSE;

}

else

return TRUE;

}

BOOL OnSysDynamicDeviceExit( )

{

if (hDMA)

VDMAD_Unvirtualize_Channel(hDMA);

return TRUE;

}

DWORD OnW32Deviceiocontrol(PIOCTLPARAMS p)

{

BOOL status;

DWORD count;

//局部变量定义

VMHANDLE hVM=Get_Cur_VM_Handle( );

Switch (p->dioc_IOCtlCode)

{

case DIOC_OPEN://ring3级程序调用

CreateFile函数打开VxD文件

......//进行简单处理即可

case DIOC_CLOSEHANDLE://当ring3级程序调用CloseHandle函数时

...... //简单处理即可

case READ_DATA: //命令码传入

...... //对一变量进行赋值

status=VDMAD_Lock_DMA_Region(ClientBuffer,nBytes,0,&MaxLockable,&PhysAddr,&error);

if (status ==0) //region锁定失败,申请buffer

{

nPages =......

status=PageAllocate(nPages,PG_SYS,0,0xF,0,MAX_PHYS_ADDR,&PhysAddr,PAGE CONTIG PHGEFIXED PAGEUSEALLGN,&hMem,&DMABufferLinear);

if (status = =FALSE)

{

return DIOC_FAILURE;

}

......

}

VDMAD_Phys_Mask_Channel(hDMA) //屏蔽DMA通道

VDMAD_Set_Region_Info(hDMA,bufID,TRUE,bUsingDMABuffer?DMABufferLinear:ClientBuffer,nBytes,(PVOID)PhysAddr);

VDMAD_Set_Phys_State(hDMA,hVM,SINGLE_MODE WRITEMEM_MODE INCRE-MENT_MODE); //写DMA模式寄存器

VDMAD_UnMask_Channel(hVM,hDMA); //允许DMA传输

while(count!=0x0) //查询DMA现行字节计数器,等待DMA传输完毕

{

Count=VDMAD_Get_Phys_Count(hDMA);

}

...... //作些结束处理

default:

return 1; //调用失败

}

}

4 VxD的调用示例

//在ring3级中调用VxD的方法

HANDLE hVxD

HVxD=CreateFile (\\.\mydma3.vxd,0,0,0,CREATE_NEW,FILE_FLAG_SELETE_ON_CLOSE,0); 打开设备文件

//DeviceIoControl函数用法,其中pVal为预留的内存,bighytes为ring3级程序传递给VxD的数据缓冲字节数。

DeviceIoControl (hVxD,READ_DATA,pVal,bigbytes,NULL,

0,&nbytes,0)

采用DMA技术传输数据较之查询、中断方式,无论在速度上还是数据传输量的大小上都优越得多。尤其在Windows98下虚拟设备驱动程序的开发,使得整个系统的图文界面更加美观,操作更加方便、灵活,大大缩短了开发周期,提高了效率。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top