Windows98平台下DMA高速数据采集系统的开发

出处:电子技术应用 发布于:2011-05-31 16:28:49

  微软公司的windows视窗不仅改变了计算机操作界面,同时也改变了一个时代,它不需要有很高的打字技巧,也不需要理解各种枯燥、深奥的命令,使越来越多的人能够接触计算机,并且在各自的生活、工作、学习中广泛运用。人们只要按一下鼠标或者一两个按键,就可以完成很多事情,计算机也因此更加生活化,并以前所未有的速度普及开来。

  针对DMA的Windows虚拟设备驱动程序并不常见,因为DMA设备对物理地址采取的是直接寻址,要保护正确地寻址相对较困难。笔者在开发利用DMA技术实现的高速数据采集系统——核谱获取和高速生理信号采集处理系统时,成功地编写了DMA虚拟设备驱动程序。

  1 系统硬件设计

  利用DMA技术实现的高速数据采集系统框图如图1所示,该系统采用了ISA总线与PC机接口。当数据通过A/D转换采集进来后,先存储到系统内部的数据缓存SRAM中;当数据存满预定的字节数后,系统即向计算机发出DMA申请。DMA控制器在接管总线以后,在没有CPU的干预下,以极快的速度将缓存中的数据经计算机总线送到计算机内存中,再由计算机进行数据分析处理。

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

  软件部分先使用VtoolsD开发出虚拟设备驱动程序(VxD),再以Visual C++6.0为开发工具进行界面设计和数据处理。

  虚拟设备驱动程序VxD(Virtual Device Driver)是用来扩展Windows操作系统功能的一类程序。它主要向一般的应用程序(运行于ring3级)提供位于系统底层的服务,解决难于被一般的ring3级的应用程序处理的问题,如对硬件的支持等。VxD可以不受限制地访问所有的硬件设备,可以自由检查操作系统的数据结构,并可以访问一些内存地址。

  VDMAD即DMA设备驱动程序,它提供一个虚拟的DMA控制器,使得在Windows平台上,虚拟机(VM)之间共享DMA成为可能。在DMA方式下传输数据时,DMA控制器从一个物理地址开始,每传送完一个字节,地址自动加1或减1,再顺序存放下一字节的内容。执行DMA数据传输时,VDMAD自身占用了一块物理连续的内容,此内存便成了VM与DMA通道间交换信息的关键。

  windows98是微软公司推出的windows95的升级版本,它保持了原来window95的风格,也增加了不少新的特征。windows98各种新增的系统工具使系统的性能更稳定,功能更强大;FAT32,系统文件检查器,电源管理,磁盘扫描和整理,这些都是您不可缺少的好帮手。windows98创新的、容易使用的特征使您可以更方便地使用计算机;调整向导、WEB集成、更新的向导方式,及增强的帮助,仔细琢磨一下,肯定会有大收获。windows98新的向导使复杂的操作变得更简单,增强的即插即用功能使您可以更方便地添加新硬件,而它强大的网络功能和与WEB集成的特征使您可以更方便地使用Internet,系统附加的各种多媒体程序使您的计算机成为一个娱乐中心。

  另外,windows98还提供了更多的硬件支持功能,譬如,它可支持多台显示器同时工作,您可一边欣赏电影,一边工作;它还支持通用串行总线USB(Universal Serial Bus),通过此端口,可支持多达127个外加周边设备,如USB扬声器、扫描仪、数码镜头等;除此之外,windows98还支持DVD等新型多媒体设备。

  专门开发虚拟设备驱动程序的工具以Windows DDK和VtoolsD较着名。VtoolsD较方便、快捷,是专门用于编写虚拟设备驱动(VxD)程序的表格式的开发工具。编程者只要填写了有关的设备名称、版本信息、需求的Windows控制消息之后,VtoolsD就会自生成VxD的程序框架,只需对一些有用的消息增添相应的功能代码,就可以编译成VxD文件,供一般的应用程序调用。这里假设设备名为MYDMA,VtoolsD输出三个有用的程序:Madma.h、Mydma.c、Mydma.mak;分别打开Mydma.h和Mydma.c进行代码功能的完善;在Visual C++6.0中,通过Mydma.mak文件加载工程,编程生成Mydma.VxD文件;在ring3级程序中即可中通过CreateFile函数进行调用。

  3 DMA设备驱动程序的编写

  VxD在虚拟化了某个DMA通道后,必须利用VDMAD提供的特殊服务,管理DMA内存缓冲以及应用程序内存缓冲。Buffer是一块在物理地址上连续的内存;Region是一块在线性地址上连续的内存。因为DMA只能识别物理地址,从而要求用于DMA传输的内存地址是线性的。如果Region不能满足需要或是不连续时,VxD向VDMAD申请一个Buffer用作传输数据的中介。VDMAD控制DMA设备的设备驱动程序,赋给设备要传送数据的逻辑地址、数据长度以及传送方向,该设备在没有主机CPU的帮助下将数据移到指定的内容。

  这里给出一个简单的开发实例,使用的DMA通道是第3号通道。有过在DOS下DMA编程经验的人都知道,在允许DMA传输之后,要对其状态寄存器进行查询。当然还可以在DMA传输完成以后,由/EOP信号产生中断,通知计算机DMA传输结束;或是用一个timeout估计传输时间进行计时,计时到即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下虚拟设备驱动程序的开发,使得整个系统的图文界面更加美观,操作方便、灵活,大大缩短了开发周期,提高了效率。


  

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!