0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于DMA技术实现高速数据采集系统的设计

牵手一起梦 来源:电子技术应用 作者:薛飞,李学华,陆 2020-10-04 17:40 次阅读

介绍基于Windows98平台的DMA虚拟设备驱动程序的开发,并给出了一个简单的DMA虚拟设备驱动程序的开发实例。

直接存储器存取方式不仅具有高速度、高效率的特点,而且CPU资源占用少,因此在需要高速、批量交换数据的场合得到了广泛的应用。在DOS下编写DMA控制程序并不难,但要编制出精美实用的界面则是一件非常繁锁的工作,而且效果往往不佳。Windows自问世以来便以身采取的保护措施使得Windows与硬件直接接口时需要程序员编写专用的虚拟设备驱动程序。针对DMA的Windows虚拟设备驱动程序并不常见,因为DMA设备对物理地址采取的是直接寻址,要保护正确地寻址相对较困难。作者在开发利用DMA技术实现的高速数据采集系统——核谱获取和高速生理信号采集处理系统时,成功地编写了DMA虚拟设备驱动程序。

1 系统硬件设计

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

基于DMA技术实现高速数据采集系统的设计

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

软件部分先使用VtoolsD开发出虚拟设备驱动程序(VxD),再以Visual

C++6.0为开发工具进行界面设计和数据处理。

虚拟设备驱动程序VxD(Virtual Device

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

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

专门开发虚拟设备驱动程序的工具以WindowsDDK和VtoolsD较著名。前者比较复杂,要求编程者熟悉C语言汇编语言。VtoolsD较方便、快捷,是专门用于编写虚拟设备驱动(VxD)程序的表格式的开发工具。编程者只要填写了有关的设备名称、版本信息、需求的Windows控制消息之后,VtoolsD就会自生成VxD的程序框架,只需对一些有用的消息增添相应的功能代码,就可以编译成VxD文件,供一般的应用程序调用。这使得程序员可以将精力集中于VxD的功能实现上,而不必去理会其底层细节。这里假设设备名为MYDMA,在填写了相关的信息后,VtoolsD输出三个有用的程序:Madma.h、Mydma.c、Mydma.mak;分别打开Mydma.h和Mydma.c进行代码功能的完善;最后在VisualC++6.0中,通过Mydma.mak文件加载工程,编程生成Mydma.VxD文件;在ring3级程序中即可中通过CreateFile函数进行调用.

3 DMA设备驱动程序的编写

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

这里给出一个简单的开发实例,使用的DMA通道是第3号通道。有过在DOS下DMA编程经验的人都知道,在允许DMA传输之后,要对其状态寄存器进行查询,或通过对/EOP信号的检测以确定DMA传输完成与否。在此VxD程序中用的是查询现行字节寄存器的方法,此种方法简单易行。当然还可以在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下虚拟设备驱动程序的开发,使得整个系统的图文界面更加美观,操作更加方便、灵活,大大缩短了开发周期,提高了效率。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15160

    浏览量

    170960
  • 数据采集
    +关注

    关注

    38

    文章

    4478

    浏览量

    112299
  • WINDOWS
    +关注

    关注

    3

    文章

    3435

    浏览量

    87125
收藏 人收藏

    评论

    相关推荐

    【Aworks申请】高速数据采集系统

    申请理由:本开发板为ARM系类,能移植Linux系统,可以实现快速高效的系统,并且能实现数据云共享。对于
    发表于 07-17 14:43

    实现高速数据采集有哪些方法?

    系统的设计提出两个方面的要求:一方面,要求接口简单灵活且有较高的数据传输率;另一方面,由于数据量通常都较大,要求主机能够对数据做出快速反应,并及时分析和处理。那么想要
    发表于 07-31 07:25

    高速数据采集系统的硬件结构,CPLD在高速数据采集系统中的应用

    高速数据采集系统的硬件结构MAX7000系列CPLD及其开发平台介绍CPLD在高速数据采集系统
    发表于 04-08 06:11

    如何利用FPGA实现高速连续数据采集系统设计?

    高速连续数据采集系统的背景及功能是什么?如何利用FPGA实现高速连续数据采集
    发表于 04-08 06:19

    请问怎么设计一种高速数据采集系统

    怎么设计一种高速数据采集系统数据采集系统的组成及原理是什么?如何实现
    发表于 04-12 06:10

    怎么实现基于USB2.0的高速同步数据采集系统的设计?

    怎么实现基于USB2.0的高速同步数据采集系统的设计?
    发表于 05-21 06:47

    基于PCI总线的高速数据采集系统设计与实现

    基于PCI总线的高速数据采集系统设计与实现:本文介绍一种基于PCI总线的高速数据采集
    发表于 06-22 19:04 44次下载

    高速数据采集系统的设计

    本文对高速数据采集系统的设计进行了讨论,介绍利用高速线性放大器、高速A/D 转换芯片、ISP 器件制作的
    发表于 07-15 11:16 22次下载

    换体DMA高速数据采集电路的CPLD实现

    换体DMA高速数据采集电路的CPLD实现 介绍了换体DMA高速
    发表于 03-28 15:09 675次阅读
    换体<b class='flag-5'>DMA</b><b class='flag-5'>高速</b><b class='flag-5'>数据采集</b>电路的CPLD<b class='flag-5'>实现</b>

    换体DMA高速数据采集电路原理及其CPLD实现

    摘要:介绍了换体DMA高速数据采集电路原理及其CPLD实现。用CPLD设计双端口RAM缓存、控制译码、时序逻辑电路,很好地解决了电路元件所占体积大、电路复杂、不能
    发表于 06-20 15:12 887次阅读
    换体<b class='flag-5'>DMA</b><b class='flag-5'>高速</b><b class='flag-5'>数据采集</b>电路原理及其CPLD<b class='flag-5'>实现</b>

    高速数据采集系统中精确时标的CPLD实现方法

    高速数据采集系统中精确时标的CPLD实现方法 本文介绍一种利用复杂可编程逻辑器件给高速数据采集
    发表于 07-20 12:42 614次阅读

    基于CPLD和嵌入式系统高速数据采集系统的设计与实现

    基于CPLD和嵌入式系统高速数据采集系统的设计与实现 介绍一种基于CPLD和嵌入式系统
    发表于 10-15 23:46 627次阅读
    基于CPLD和嵌入式<b class='flag-5'>系统</b>的<b class='flag-5'>高速</b><b class='flag-5'>数据采集</b><b class='flag-5'>系统</b>的设计与<b class='flag-5'>实现</b>

    高速大容量数据采集系统设计与实现

    高速大容量数据采集系统设计与实现,下来看看
    发表于 05-10 11:24 14次下载

    基于FPGA的高速数据采集系统设计_杨江涛

    基于FPGA的高速数据采集系统设计,用ad芯片和sdram构成高速数据采集系统
    发表于 05-17 09:49 35次下载

    基于PIC总线的高速数据采集系统

    本文详细介绍了一种基于 PCI 总线的高速数据采集系统的原理、组成和功能以及在 Windows 2000 环境下进行数据采集和存储的方法。该系统
    发表于 04-14 14:29 13次下载