当前位置:首页 > 智能硬件 > 智能硬件
[导读]直接存储器存取方式不仅具有高速度、高效率的特点,而且CPU资源占用少,因此在需要高速、批量交换数据的场合得到了广泛的应用。在DOS下编写DMA控制程序并不难,但要编制出精美实用的界面则是一件非常繁琐的工作,而且效果

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

1 系统硬件设计

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

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通道间交换信息的关键。

  专门开发虚拟设备驱动程序的工具以Windows DDK和VtoolsD较著名。前者比较复杂,要求编程者熟悉C语言和汇编语言。VtoolsD较方便、快捷,是专门用于编写虚拟设备驱动(VxD)程序的表格式的开发工具。编程者只要填写了有关的设备名称、版本信息、需求的Windows控制消息之后,VtoolsD就会自动生成VxD的程序框架,只需对一些有用的消息增添相应的功能代码,就可以编译成VxD文件,供一般的应用程序调用。这使得程序员可以将精力集中于VxD的功能实现上,而不必去理会其底层细节。这里假设设备名为MYDMA,在填写了相关的信息后,VtoolsD输出三个有用的程序:Mydma.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)。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 |PAGEFIXED | PAGEUSEALIGN,

                 &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_DELETE_ON_CLOSE,0);

                                                           //打开设备文件

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

  DeviceIoControl(hVxD,READ_DATA,pVal,bigbytes,NULL,0,&nbytes,0) 

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭