传统的数据采集与控制系统采用单片机进行控制,未采用或是仅采用功能十分简单的操作系统,这已无法满足目前日益增加的工控系统要求,比如可视化的操作界面、网络化控制等。
Windows CE是一个32 位、多任务的模块化嵌入式操作系统,它的中断嵌套与优先级处理机制满足了嵌入式数据采集系统的实时性要求。同时它还支持多种架构的CPU和丰富的外设,具有强大的通讯和数据存储管理能力,并对开发人员提供了操作系统定制、驱动程序、应用程序的一整套开发工具。最具特色的是它具有与桌面Windows相似的图形界面,便于用户操作;它的应用程序开发工具也类似于桌面系统,可以有效缩短系统的开发周期。因此,我们基于PC/104 总线进行硬件系统设计,选用了微软的Windows CE 5.0操作系统作为其软件开发平台,从而构建了一个功能强大的嵌入式数据采集与控制系统。
1 基于Windows CE的数据采集与控制系统总体方案设计
嵌入式数据采集与控制系统在软硬件上都需要严格考虑功能、尺寸、功耗及可扩展性等方面的要求。为了实现传统监控系统和控制系统的一体化,硬件上我们采用常用的PC/104总线连接数据采集与控制系统的各模块;软件上采用Windows CE 5.0作为开发平台。
1.1 系统硬件设计
整个系统可以划分为几个部分,包括物理参数检测与信号调理子系统、数据采集子系统、中央监控子系统、控制策略执行子系统以及报警子系统。具体的硬件结构示意图如下:
图1系统硬件结构示意图
其中的监控子系统选择美国国家半导体的GX1-233MHz的CPU模块作为数据采集与控制系统核心,配置了两个串口,一个作为调试用,另一个作为通讯口;采用128MB的SDRAM以保证操作系统与应用程序的流畅运行;网络接口确保了与其他数据采集与控制系统以及与高层管理系统的高速通讯;大屏幕LCD与键盘用于人机交互。为了适应恶劣的工业环境与系统小尺寸要求,我们使用CF卡作为永久存储设备。数据采集子系统与监控子系统之间通过PC/104总线进行堆栈式连接,从而构建一个功能强大并满足低功耗、小尺寸的嵌入式数据采集与控制系统。
1.2 系统软件设计
系统的软件开发分为两大模块:(1)Windows CE操作系统在数据采集与控制系统硬件平台上的移植,包括系统镜像的裁剪定制、外设驱动的编写加载和引导启动程序bootloader的实现;(2)Windows CE下数据采集与控制系统应用程序的开发,包括板卡参数配置程序、数据采集程序、控制程序、人机交互界面程序。
2 嵌入式数据采集与控制系统关键技术研究与实现
由于嵌入式数据采集与控制系统的硬件平台设计技术已经较为成熟,以下将重点研究基于Windows CE 5.0的嵌入式软件开发技术。
2.1 软件系统开发流程
基于Windows CE的软件开发流程比较统一,即使用Platform Builder定制出针对特定硬件平台的操作系统镜像文件NK.bin, 使用evc或vs.net开发用户应用程序。驱动程序和操作系统引导启动程序的开发也是其中重要的组成部分。
对于本数据采集与控制系统来说,具体开发流程为:首先开发系统外设驱动(包括网卡,A/D,D/A板卡),在Platform Builder中修改系统源代码和配置文件(包括*.bib,*.reg),裁剪数据采集与控制系统所需的组件,并把外设驱动打包到镜像中,通过反复修改调试生成操作系统镜像文件NK.bin,导出其对应的SDK用于应用程序的开发。而后实现NK.bin在数据采集与控制系统硬件平台的引导加载,并在数据采集与控制系统硬件平台和开发主机间建立以太网交叉调试通道,将开发好的应用程序下载到目标平台的CF卡上,从而实现整个嵌入式数据采集与控制软件平台的开发。
2.2 外设驱动的开发与移植
2.2.1 网卡驱动移植
由于硬件系统中采用了Intel82559er的网卡,必须将网卡驱动打包到操作系统内核里。具体步骤简单描述如下:
(1)从INTEL网站下载Intel8255xer for wince 5.0的驱动文件e100ce.dll,并将该文件拷贝到所定制平台的release目录下。
(2)参考所下载驱动的config.bib,在系统配置文件的memory段中添加语句:EPKTBUF 801DC000 00020000 RESERVED,用来在内存中为网卡保留空间。
(3)在project.reg中添加驱动的相关注册表项,对网卡驱动进行加载声明,并设置网络相关参数。
(4)在project.bib的module部分里添加打包驱动字段:
E100CE.dll $(_FLATRELEASEDIR)\E100CE.dll NK SH,用以指导Windows CE定制程序在系统编译的sysgen阶段将网卡驱动打包到定制操作系统的内核镜像里。
2.2.2 数据I/O板卡驱动开发与移植
Windows CE的驱动程序按照接口方式的不同可以分成两类:本地驱动和流式驱动。所谓流式驱动,即对应用程序提供流式接口函数的驱动。它把外设抽象成一个特殊的文件,应用程序使用文件API函数(如CreateFile、DeviceIoControl)对设备进行访问,操作系统接受API后调用系统进程FileSys.exe,进而转到device.exe,由此进程调用流接口函数来操作硬件。数据采集与控制系统中的A/D、D/A板卡即采用这种流式驱动的方式进行开发。
Windows CE流式驱动的开发主要包括以下几部分:(1)编写一个DLL文件实现流接口函数;(2)编写DLL的导出函数文件*.DEF,以便应用程序调用流接口函数;(3)为驱动程序写入注册表项,以便系统启动后识别和管理驱动;(4)修改*.bib文件,把驱动打包到操作系统镜像中。在开发A/D、D/A板卡驱动时,我们需要在DLL中实现XXX_Init、XXX_Deinit、XXX_Open、XXX_Close、XXX_Read、XXX_Write等流接口函数,以完成板卡的初始化、数据读写等。
完成驱动对应的DLL和DEF文件后,我们还需要把驱动程序加载到操作系统中,这样应用程序才能调用驱动。Windows CE下驱动的加载有两种途径:系统启动时加载或者在应用程序中调用ActivateDeviceEx()函数加载。本系统采用启动时加载的方式。具体实现方法是在系统配置文件project.reg中添加驱动的注册表项,基本形式如下:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\**]
"Dll"="**.dll" //DLL文件名
"Prefix"="DRV" //代表设备的文件名前缀,流接口函数即用此前缀
"Order"=dword:0 //设备驱动启动顺序
流式驱动在定制操作系统中的打包类似于网卡驱动,通过拷贝dll文件到定制系统平台release目录和修改project.bib实现。
2.3 在CF卡上实现基于Hive的注册表
由于数据采集与控制系统是一个无电池的嵌入式系统,为了确保用户配置信息在系统掉电或重起后不丢失,我们采用基于Hive的注册表来保存数据。要做到这一点,除了在系统定制时加入HIVE-based Registry组件外,还需要修改注册表配置文件platform.reg。
要实现Hive的关键在于把存储注册表的设备驱动和文件系统驱动相关的注册表信息加入到引导hive区域内,即; HIVE BOOT SECTION和;END HIVE BOOT SECTION关键字之间。在CF卡上实现掉电保存注册表文件,需要在配置文件中添加以下四部分:
(1)[HKEY_LOCAL_MACHINE\init\BootVars]
"SYSTEMHIVE"="Documents and Settings\\system.hv" //注册表名称"PROFILEDIR"="Documents and Settings" //注册表保存的位置"StartDevMgr"=dword:1 //启动设备管理器"Registryflags"=dword:1 //自动刷新保存注册表
(2) CF卡存储驱动的注册表项 [HKEY_LOCAL_MACHINE\Drivers\PCMCIA\ATADisk]和[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]下的字段
(3)文件系统的注册表项 [HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]
(4)在Windows CE 5.0 中与之前版本的区别在于[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]下需要添加一行:"MountAsBootable"=dword:1,表示引导hive存储在此设备上。
2.4 数据采集与控制系统专用操作系统镜像的定制
在完成系统外设模块驱动的移植后,我们可以使用微软提供的集成开发环境Platform Builder来定制一个专用于数据采集与控制的操作系统镜像。针对所采用的硬件平台定制操作系统的关键步骤如下:
(1)选择 AMD Geode: X86的BSP(板卡支持包)。
(2)根据系统需求,选择industrial controller作为基本模版。
(3)在工作区的Catalog中添加各种组件(如CF卡驱动相关组件: FAT文件系统,ATAPI PCI/IDE以及CF Card Storage;网络通讯所需组件Network User Interface;命令窗口程序Console Window;交叉编译下载程序所需的Platform Manager;应用程序开发所需的MFC支持等)。
(4)进行各种定制所需的系统变量设置,修改配置文件project.reg,project.bib等,把驱动程序打包到操作系统镜像里。
完成系统组件定制与配置文件的修改后,可以编译源代码,生成操作系统映像文件NK.bin。
2.5 引导启动程序Bootloader的实现
Bootloader是在操作系统内核运行前用于初始化基本的硬件设备(如CPU,SDRAM,串口)、引导并启动操作系统的一段程序,是嵌入式操作系统运行的前提。在X86平台下,有三种Bootloader: x86 ROM BootLoader,x86 BIOS BootLoader和MSDOS+Loadcepc。
为方便起见,本系统采用MS-DOS+loadcepc的方式从CF卡启动并加载操作系统镜像。
具体实现过程:
(1) 用PB中的工具websetup.exe以及cepcboot.144做一个MS-DOS启动软盘。
(2) 用DOS下的fdisk工具为CF卡建立FAT16格式的主分区。
(3) 将CF卡格式化, 创建系统引导文件,拷贝软盘下所有文件以及loadcepc.exe至CF卡中。
(4)根据需要修改文件,如autoexec.bat,config.sys等,设置启动默认选项和启动时间。
在完成了定制的操作系统到硬件平台上的移植后,我们可以从Platform Builder中导出定制平台的SDK,并建立以太网交叉调试环境,使用Embedded VC++(evc)开发数据采集和控制程序。这个过程类似于桌面应用程序开发,不再赘述。