1.引言
在嵌入式系统特别是数据采集系统中,实时性至关重要,它不仅要求嵌入式微处理器能快速作出响应,还要求嵌入式系统能及时处理数据[1]。在本文设计的数据采集系统中,如采用常规方法传输数据,当采集数据的速度较高时,由于Windows CE系统和采集系统不能同步,可能会造成数据的丢失,使得系统不能及时准确的传输数据。为解决这一问题,可以使用采集板上内置的先入先出(FIFO)缓冲器。目前国内关于在Windows CE系统中实现FIFO的文献还未见报道。对此,本文讨论了如何在Windows CE.net平台上开发基于FIFO的数据采集板的驱动程序,以保证数据采集数据的准确性。通过试验将常规方法与FIFO进行比较,得到较好的结果
2.系统的软件及硬件平台
嵌入式系统以其体积小、针对性强、实时性好等特点,在通讯、控制和消费电子等诸多领域得到了广泛的应用。本设计中的操作系统就是微软公司推出的专门用于嵌入式系统的实时操作系统Windows CE.net,它是一个32位、多线程、多任务的嵌入式操作系统,以其模块化的结构,良好实时性能力,强大的通信能力和对多种CPU的支持,在各种工业控制、消费电子等领域拥有较好的应用前景[2]。
数据采集系统的硬件平台是研华公司的MIC-2000工业控制计算机,MIC-2000具有良好的机械可靠性和总线扩展能力[3],可用于环境恶劣的工业现场。数据采集板是模拟量输入板MIC-2718,它是一个高增益、高性能的多功能数据采集板,它提供的程序可控增益放大器使用户可以不用外加电源就可以采集很小的输入信号,内置的1K字FIFO缓冲区保证了采集数据的快速性和准确性。MIC-2718为12位100KHz的A/D模块,支持16路单端或8路差分输入最大转换时间为8usec,有软件触发、定时器触发和外部触发三种方式,MIC-2718的功能框图如图1所示。
MIC-2718支持跳线选择16路单端输入或8路差动输入,当选择单端输入时每个通道只需要接一根信号线,信号的参考地为板上的公共地[4]。标准连线图如图2所示。当选择双端输入时每个通道有2根信号线,MIC-2718测量2个模拟信号的电压差,如果信号源没有接地,则称为“浮”信号源,测量“浮”信号源用图3所示的接线方法。
3.Windows CE驱动程序
与其他操作系统一样,Windows CE.net也提供了很多外设的驱动程序,驱动程序将操作系统和设备连接起来,使操作系统能够识别设备并为应用程序提供设备服务[5]。 但是,对于非常规硬件设备(或者说对现有的Windows CE应用系统是非常规的),微软并没有提供驱动程序,因此需要设备的硬件厂商提供WndowsCE的驱动,或是使用者自行开发[6]。目前,还没有MIC-2718的基于Windows CE.net 4.2版本的驱动程序,因此需要自行开发。
Windows CE.net驱动程序的2种模式是本机驱动和流接口驱动模式[7]。本机设备驱动适于集成到基于Windows CE.net平台的设备,如通用LED驱动和电源驱动。流接口驱动模型适用于任何在逻辑上被认为是一个数据源或数据存储的设备的I/O设备(任何以产生或消耗数据流作为主要功能的外围设备)[8],因此在采集系统中,WinCE的外围设备驱动程序一般以流接口驱动程序较多。另外,绝大部分外围设备驱动程序都可映射为流接口驱动程序。无论驱动程序控制的设备是什么类型,流接口驱动都使用相同的接口并导出一组相同的函数(流接口函数)。
针对本文中数据采集系统和Windows CE中驱动程序模型的特点,本设计采用流接口驱动程序模型。
FIFO存储器有两个端口(输入口和输出口),并按先入先出的顺序来暂时存放数据。当采用常规方式进行数据传输时,如采集板采样速度很快,而系统不能及时读出数据时,新采集的数据会把原来的数据覆盖,这时系统只能传递新的数据,从而造成数据丢失。MIC-2718的FIFO缓冲器可以解决这个问题,FIFO在数据采集卡中作用是缓存数据,解决采集系统中数据丢失的问题,它使采集板在高触发率或多任务操作系统(如Windows操作系统)中实现可靠稳定的高速实时数据采集和传输。
MIC-2718在完成第一次A/D转换后将数据存入MIC-2718的A/D数据寄存器(地址为BASE+0和BASE+1(BASE为MIC- 2718的基地址))和FIFO缓冲区的第一个存储单元,下一次A/D转换时,新的数据会覆盖A/D数据寄存器中的数据,但是如果缓冲区的第一个存储单元中的元素没有被系统读取,FIFO会自动将此次转换的数据存入缓冲区的下一个存储单元,上一次的数据仍然保留。每一次转换的数据都被依次存入FIFO的缓冲区中,最多可以存储1024次A/D转换的数据。转移数据时,只需读取FIFO数据寄存器(地址为BASE+23和BASE+24)中的数据,它也是 FIFO缓冲区中的第一个存储单元的数据,此时缓冲区中第一个数据被读出,下一个存储单元的数据自动代替它的位置。通过采集板中FIFO的状态寄存器(地址为BASE+25)可以判断FIFO缓冲器当前的状态。状态寄存器的D0位EF是FIFO为空的标志,D1位HF是FIFO半满的标志,D2位FF是 FIFO为满的标志。另外,对BASE+25寄存器的任何写操作都将清空FIFO缓冲器,EF被置1,HF、FF置0。
Windows CE系统提供的驱动程序开发包(Windows CE Driver Development Kit,Ceddk)中提供了丰富的驱动程序函数(地址映射、总线访问、建立DMA缓冲和I/O操作等),可以满足硬件平台上任何总线的需要[8],它通常被实现为动态库Ceddk.lib文件。由于MIC-2718是基于ISA总线的,可以直接对采集板的地址进行读写操作,同时,由于FIFO读写操作是相互独立的,可以同时进行,所以不必考虑采集板与Windows CE系统数据传输时的时序配合问题,但是在对FIFO进行读写操作时,要判断FIFO的状态,只有在缓冲区中数据未满时才能写入,未空时才能读出[9],以避免一些错误的操作。
当数据采集板通过程序控制方式、定时器触发方式或外部触发方式采集到模拟信号后自动进行A/D转换后将数据放入A/D数据寄存器并依次写入FIFO 缓冲区中,Windows CE.net中的用户应用程序通过检测FIFO标志寄存器和MIC-2718状态寄存器(地址为BASE+8)的状态来确定是否进行了有效的A/D转换。下面给出在Windows CE开发平台上对FIFO进行读操作的部分代码,设MIC-2718的基地址为300H:
PUCHAR ioPortBase=MapIoSpace(300H);//将物理地址影射为虚拟地址
BYTE aistatus=READ_PORT_UCHAR(ioPortBase+8);//读MIC-2718的状态寄存器
BYTE status=READ_PORT_UCHAR(ioPortBase+25);//读FIFO的状态寄存器
BYTE ad0,ad1;
if(aistatus&0x10)//若MIC-2718状态寄存器的A/D转换位有效
{
if(status&1!=0)//若FIFO不为空,则读FIFO
{
ad0=READ_PORT_UCHAR(ioPortBase+23);
ad1=READ_PORT_UCHAR(ioPortBase+24);
}
}
表1 A/D数据寄存器与FIFO数据寄存器的比较
在使用MIC-2718的某一通道分别用常规方式和FIFO方式对一个持续变化的电压源做连续的信号采集和传输时,两种方式传输的数据如表1所示。可以看出,第2和第8组中A/D数据寄存器中的数值是错误的,可见使用普通A/D传输方式存在数据丢失问题,因此并不能准确传输数据,而使用FIFO方式可以保证数据传输的完整性。
5.结束语
通过实际测试,在Windows CE的高速数据采集系统中,采用FIFO可以保证数据采集的可靠性,并且编程简单,程序调试方便,可以极大地提高数据采集板的采样效率。本文作者的创新点在于在Windows CE.net系统下实现FIFO数据数据传输,从而保证了数据传输的可靠性。
作者:郭宝增 马桂艳 来源:《微计算机信息》
免责声明:本文仅代表作者个人观点,与C114中国通信网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。