摘要:嵌入式操作系统Windows CE.Net在数据采集系统中有广泛的应用前景, 本文对于数据采集系统比较重要的串口通讯、外部IO中断处理和网络接口的三种数据采集传输方式,如何在Windows CE.Net中实现和优化进行了分析。本文还介绍了Windows CE.Net的几种接口方式在脑电波采集系统的应用,并给出了非标准驱动程序的开发方法。
关键词:嵌入式操作系统; 数据采集; Windows CE.Net
1 引言
随着嵌入式微处理器和嵌入式操作系统的发展,嵌入式系统在通讯、控制和消费电子等诸多领域得到了广泛的应用。Windows CE.Net 4.1(以下简称WinCE)是微软公司推出的专门用于嵌入式系统的实时操作系统,它除具有通用嵌入式操作系统的一般特点,还具有其独特的优点,在各种工业控制、消费电子等领域拥有较好的应用前景。在嵌入式系统尤其是数据采集系统中,接口的编程至关重要,作者根据自己的课题研究,在本文中探讨了在数据采集系统中WinCE的几种比较重要接口的应用方法。
2 WinCE的驱动程序模型
系统接口是和驱动程序分不开的,我们首先理解WinCE的驱动程序模型。目前,WinCE提供了四种设备模型,其中两种是专用于WinCE的模型,另外两种外部模型来自其它操作系统。基于WinCE的两种模型是本机的设备驱动程序和流接口驱动程序。两种外部模型用于通用串行总线和网络驱动器接口标准的驱动程序。在采集系统中,WinCE的外围设备驱动程序一般以流接口驱动程序较多,绝大部分外围设备驱动程序都可映射为流接口驱动程序。
下图是对当前驱动模型的设备驱动程序的汇总:
图1 WinCE驱动模型汇总
3 串口的访问方法
串口通信是WinCE支持的常用的通讯方式之一,一些基于WinCE的设备可以通过串行连接与其他计算机、打印机、调制解调器或全球定位系统(GPS)卫星进行通信。串口提供的传输速率较宽,在数据采集系统中,很多数据的采集是通过串口得到的。WinCE支持绝大多数基于Windows 的台式机上用于串行通信的标准函数。这些函数可以用于打开、关闭和操作串行口,传送和接收数据,以及管理连接,其操作类似于读写文件。串口操作的主要函数有:
CreateFile 用于打开串行口
SetCommState 按定义的DCB结构配置通信设备
SetCommTimeOuts 设置通信设备上所有读/写操作的超时参数
ReadFile 向串行口读数据
WriteFile 向串行口写数据
SetCommMask 设置通讯设备的事件掩码值
WaitCommEvent 等待通讯设备发生指定的事件
CloseHandle 关闭打开的串行口句柄
其中DCB结构是设置波特率、数据位、停止位、奇偶校验等参数,因而经常使用。通过SetCommMask、WaitCommEvent函数可以实现通过事件方式进行数据的读写,从而避免对串口以查询方式读写数据,大大节省CPU的占用时间。
值得注意的是,为了调试的方便,WinCE把物理的串口一缺省作为调试口。CreateFile配置串口时,串口“COM1:”实际使用的串口是物理串口2, 串口“COM2:”使用的串口是物理串口3,以此类推。当必须使用物理串口1时,需要使用微软提供的WinCE操作系统开发工具Platform Builder更改BSP和注册表。
4 中断处理模型
在采集系统中,外部I/O访问是必不可少的通讯方式,WinCE的BSP一般都实现了WRITE_PORT_UCHAR和READ_PORT_UCHAR函数。根据控制方式,其访问方式也有三种:查询方式、中断方式和DMA方式。其中查询方式由于其执行效率较低,在实时控制系统中一般较少采用。中断方式和DMA方式被广泛地应用到基于Windows CE的标准驱动程序开发中。标准驱动程序模型如下:
WinCE把中断处理分为两部分--核心码部分和用户码部分,这样使得功能和实现的简易性比较好的平衡。核心码部分叫做中断服务例行程序(ISR),而用户码部分叫做中断服务线程(IST)。中断服务例行程序是不可嵌套的部分,因此其程序又短又快,实际只执行物理中断向逻辑中断的映射。用户的中断处理主要在中断服务线程(IST)中完成。按照微软驱动程序的要求,标准中断驱动程序主要编写底层即PDD层的代码来实现。
5 网卡访问方法
WinCE的对TCP/IP的支持和其他Windows没有多大区别, 应用系统开发者可以通过Socket API 来访问网络。例如在UDP中初始化Socket 时, 常用到WSAStartup() , socket(),setsockopt(),bind()等函数, 在发送和接受时用到sendto(),recvfrom()等函数。传送网络数据的方法除了直接操作Socket API外,还可以使用使用MFC提供的CAsyncSocket或CSocket。其使用方法同桌面Windows相同,在此不在赘述。
WinCE的MFC中还提供一种其他Windows没有的类CCeSocket, 对于WinCE网络应用程序一般推荐使用CCeSocket,而不是CAsyncSocket或CSocket。因为CAsyncSocket或Csocket主要依赖标准的窗口消息通知方式, 它们不支持异步事件通知。因为没有异步事件通知的支持, 程序不得不连续查询网络事件 ,造成程序运行效率低下。CCeSocket支持异步事件通知方式, 因而它可以提供网络事件通知。应用程序通过创建监视线程来监视这些事件通知, 实现高效的网络通讯。
6 脑电数据采集系统
现在介绍Windows CE.Net的几种接口方式在脑电波采集系统的应用。脑电监护仪主要是对人脑细胞放电(微伏级),用头皮表面安放的电极将电信号接收下来,经放大器放大,由现代计算机技术将之变成数字信号,然后将计算得到的参数显示在屏幕上,并通过网络将其传送至中央监护系统,进行进一步的存储和处理。除了采集脑电信号以外,脑电监护仪还需要采集血氧和血压信号以配合脑电监护。
本系统硬件系统主要由CPU、FLASH ROM、SDROM、以太网物理层、FIFO以及CPLD构成,如图3所示。本系统CPU采用了ARM7TDMI内核的RISC处理器S3C4510B。该芯片具有的8/16/32外部总线支持ROM、RAM、Flash存储器、DRAM和外部IO;带有MII接口的100Mpbs/10Mbps以太网控制器; 两个UART通道; 支持21个中断源,其中4个用于外部中断; 最高系统时钟可达50MHz。该系统脑电的采集由FIFO缓冲,CPLD用于产生FIFO控制逻辑和外部总线逻辑控制。当FIFO中脑电数据满时, CPLD向CPU产生中断信号, 请求CPU中断处理。血氧和血压分别通过串行口芯片传入处理器。
本系统操作系统采用Windows CE.Net 4.1,它所具有的多线程、多任务、完全抢占式的特点。WinCE的进程模式采用标准的Win32进程和线程模式,在运行时,系统可提供32个进程,线程的数量可以更多。进程和线程的同步可以通过临界段、互斥和事件来进行,也可以通过互锁函数来同步线程。
图3 脑电采集系统
此系统要用到串口、基于中断的外部IO访问和网络等接口,其中基于中断的脑电数据的采集是最关键的。这里采用的是基于中断的非标准驱动,下面介绍一下其实现方法。
要完成基于中断的非标准驱动需要实现两个步骤:一是编写中断服务线程(IST);二是注册中断服务线程(IST)。中断信号由FIFO经CPLD不断产生,每发生一次中断,运行在核心态的中断服务例行程序(ISR)就调用一次中断服务线程(IST) 。
要实现脑电基于中断方式从FIFO中读取数据,首先编写IST程序,其结构如下:
DWORD ThreadIST(void *dat)
{
ThreadISTData* pData = (ThreadISTData*)dat; //取得线程外部参数
while(!pData->abort) // 循环直至通知退出
{
WaitForSingleObject(pData->hEvent, INFINITE); //等待同步事件
//读取脑电数据, 并处理数据
UCHAR uChar= READ_PORT_UCHAR((PUCHAR)FIFO_ADDR);
…….
InterruptDone(pData->sysIntr); // 通知操作系统中断处理已完成
}
return SUCCESS;
}
其中和ISR同步依靠事件方式建立,当中断到来时,WaitForSingleObject函数停止等待。