多路MPEG-4监控系统的设计与实现
本系统的设备驱动程序采用了Windows 2000下的Windows Driver Model(WDM)驱动程序。在Windows2000中,系统有两种命名设备的方法:一种是使用符号连接名,但它的安全陛不是很好[4];另一种是利用具有唯一性的GUID号表示设备接口。上层应用程序可以通过上面两种方法获得有效的设备句柄,并利用这个设备句柄实现对设备驱动程序的访问。当上层应用程序调用WIN32AHI函数后,将由Win32子系统调用I/O服务接口,并传送给内核模式下的I/O系统服务模块。接着,I/0管理器将检查这个请求的参数,然后创建一个合适的I/O请求包(1RP)。这个IRP经过分层驱动程序的处理传送给一个合适的设备驱动程序,并由这个程序通过硬件抽象层对硬件进行操作,完成这个IRP请求。最后,I/O管理器把结果和数据还回给应用程序[3]。
在本系统的Windows2000的WDM驱动程序中,除了基本的功能模块[3](如PNP模块、Dispatch模块、Power模块等)外,可以把其余部分大概分为板卡初始化模块、参数设置模块、中断服务模块和DMA传输模块等。
为了能够使PCI总线控制模块实时地从压缩编码模块中读取压缩码流,并及时地传送给计算机,本系统采用了中断机制。当压缩编码模块中的FIFO满时,压缩编码模块产生一个中断信号,通知PCI总线控制模块启动DMA,利用块传输方式读取FIFO中的数据。同时,IME6400将后面的编码数据暂存在外挂的SDRAM中。
PHILIPS公司的SAA7146A是一片具有总线主控DMA控制器的PCI桥芯片,可以实现内存和设备间快速的数据传输。本系统采用“基于包”的DMA传输方式;同时,为了进一步提高速度,使DMA将数据直接搬移到用户应用程序中所申请的循环缓存区中。DMA的流程如图4所示。其中,Saa7l46Read例程的主要功能是进行DMA的初始化操作,并启动编码码流输出。AdapterCon-trol例程确保计算机处理器高速缓存中的内容为当前使用的内存缓冲区中的内容。DpcForIsr例程完成内存物理地址和传输的数据长度的获得,并把它们写到DMA控制寄存器中,该例程还在合适的条件下与应用程序利用事件进行通信。
4.2 传输机制的设计
在数字监控系统中,为了实现数据的实时传输,应该仔细设计设备驱动程序和上层应用程序间的数据传输机制,来确保数据的完整性和实时性。
Windows2000操作系统把虚拟内存地址空间分为用户模式的虚拟地址空间和内核模式的地址空间。一般来讲,内核模式驱动程序几乎不使用用户模式的虚拟地址来访问内存。实际上,Windows2000操作系统为驱动程序访问用户模式的数据缓冲区提供了一种方法:通过应用程序调用DeviceIoControl、ReadFile和WriteFile等API函数,传递给这些函数用户模式的虚拟地址和数据长度等参数,这样就相当于向I/O管理器提供了一个数据缓冲区。I/O管理器再根据设备驱动程序中指定的三种不同机制[3](buffer方式、direct方式和neither方式)中的一种,利用不同的实现方法来实现用户模式和内核模式间数据的共享。
图4
除了上述的方法外,共享内存块也可以由内核驱动程序申请的系统缓冲区来充当,并通过转换得到用户模式的虚拟地址,应用程序就可以通过这个地址直接访问系统地址。
另外,为了实现应用程序和驱动程序的同步,采用了共享事件的方法[4]。在Windows2000中,应用程序和内核驱动程序可以共享同一命名的事件,这个事件可以由任意一方创建。当其中一方创建了一个事件后,就可以把这个事件的句柄传送给另一方来实现事件的共享,然后通过一方捕获事件信号态、另一方设置事件信号态的方法实现两者间的通信。
在一台CPU速度为1.8G、内存为512M的工控机上,本系统可支持8块压缩板卡同时工作,从而提供对32路音视频数据的监控能力,系统的压缩率在较宽的范围内可调。