基于Win98平台的DMA高速数据采集系统设计
即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下虚拟设备驱动程序的开发,使得整个系统的图文界面更加美观,操作更加方便、灵活,大大缩短了开发周期,提高了效率。
- Linux嵌入式系统开发平台选型探讨(11-09)
- CDMA2000基带信号发生器的FPGA+DSP实现(05-29)
- DSP中DMA操作的无阻塞请求实现(06-18)
- DSP嵌入式视频监测(06-02)
- 基于VxWorks的系统故障快速恢复设计(01-12)
- 基于 DSP-dMAX 的嵌入式 FIFO 数据传输系统设计(04-11)
