Windows CE作业系统是Windows家族中的成员,专门设计给掌上型电脑(HPCs)所使用的电脑环境。这样的作业系统可使完整的可携式技术与现有的Windows桌面技术整合工作。与Windows 95/98、Windows NT不同的是,Windows CE是所有源代码全部由微软自行开发的嵌入式新型操作系统,其操作界面虽来源于Windows 95/98,但Windows CE是基于WIN32 API重新开发、新型的信息设备的平台。Windows CE具有模块化、结构化和基于Win32应用程序接口和与处理器无关等特点。Windows CE不仅继承了传统的Windows图形界面,并且在Windows CE平台上可以使用Windows 95/98上的编程工具(如Visual Basic、Visual C++等)、使用同样的函数、使用同样的界面风格,使绝大多数的应用软件只需简单的修改和移植就可以在Windows CE平台上继续使用。Windows CE并非是专为单一装置设计的,所以微软为旗下采用Windows CE作业系统的产品大致分为三条产品线,Pocket PC(掌上电脑)、Handheld PC(手持设备)及Auto PC.
1 驱动结构模型比较
设备驱动是操作系统和输入输出设备间的粘合剂。驱动负责将操作系统的请求传输,转化为特定物理设备控制器能够理解的命令。
在桌面Windows系统中,以支持Windows 2000/XP的WDM驱动模型为例。WDM体系结构实行分层处理,即设备驱动被分成层驱动程序、中间层驱动程序、层驱动程序,如图1所示。
在Windows CE驱动中,按驱动的结构可以分为二种类型:分层式设备驱动程序和整体式驱动程序,如图2所示。分层式设备驱动程序由上层和下层两部分代码组成[1,3].上层的程序称为模型设备驱动程序(MDD),下层的程序则称为平台相关的驱动程序(PDD)。整体式驱动程序的源代码由中断服务线程代码和针对平台的代码组成。
同桌面Windows设备驱动结构模型相比,Windows CE设备驱动相对简单一些(见图1、图2)。两种操作系统的设备驱动虽然存在许多相似的地方,都采用了模块、分层的设计方法,但是还存在许多不同的地方。在Windows CE操作系统中,分层的驱动程序并不适用于所有的驱动,尤其是将驱动程序分为两层将会导致在驱动程序操作时附加的功能调用,这无疑会降低驱动程序的效率,对于时间或性能关键的实时操作,整体式驱动程序将会更适合。
在桌面Windows系统中,驱动各层通信之间使用一种称为I/O请求包(IRP)的数据结构进行通信,影响到设备的每个操作都使用I/O请求包,若采用层次结构使I/O请求过程更加明了。I/O管理器发送IRP来请求驱动程序的处理,通常,IRP由分层的驱动程序栈来处理,而高层的驱动程序则把请求划分成更简单的请求并传递给下层驱动程序。IRP首先被送到设备堆栈的上层驱动程序,然后逐渐过滤到下层的驱动程序,每一层驱动程序都可以决定如何处理IRP.但Windows CE驱动各层之间的通信没有采用IRP通信机制,而是通过接口函数调用实现[4-5],设备驱动程序接口DDI(Device Driver Interface)是在MDD层中实现的函数集,系统中的GWES模块通过这个接口调用设备驱动程序;设备驱动程序服务器接口DDSI(Device Driver Service Provider Interface)是在PDD层中实现的函数集并由MDD调用。
2 设备驱动组成部分比较
驱动程序是一些例程的集合,它们被动地存在,等待主机系统软件的调用或激活。在Windows系统中,具体的驱动程序有所不同,其包含的例程也不同,但其主要例程是相同的。图3 描述1个Windows驱动基本流程。
下面阐述Windows CE和桌面Windows设备驱动组成的差别。
2.1驱动程序的入口点
在桌面Windows和Windows CE两个系统中的驱动程序都含有初始化模块,该模块主要功能是完成驱动程序的初始化及卸载。在桌面Windows系统的初始化模块中,包括有每1个设备驱动程序都有的1个初始化入口点:DriverEntry例程。每次设备驱动程序启动时该例程被系统自动调用,其重要的功能是设置驱动程序对应于I/O请求的主功能代码(MajorFunction)的回调例程。DriverEntry例程如下:
DriverEntry(IN PDRIVER_OBJECT DriverObject, …)
//驱动程序人口
{
DriverObject->DriverExtension->AddDevice=AddDevice;
DriverObject->DriverUnload=DriverUnload;
DriverObject->MajorFunction[IRP_MJ_CREATE]=Create;
DriverObject->MajorFunction[IRP_MJ_CLOSE]=Close;
DriverObject->MajorFunction[IRP_MJ_READ]=Read;
DriverObject->MajorFunction[IRP_MJ_WRITE]= Write;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]
=IoControl;
DriverObject->MajorFunction[IRP_MJ_PNP]=Pnp;
DriverObject->MajorFunction[IRP_MJ_POWER]=Process-
PowerIrp;
……
}
其中,AddDevice例程是在系统添加1个设备时被PnP管理器调用,其主要工作是创建并初始化设备对象;DriverUnload例程在系统卸载硬件时使用,由I/O管理器调用,释放所有资源。初始化模块中还包括有Create和Close两个例程,这是Win32程序获得和释放设备句柄的途径。
与桌面Windows设备驱动程序开发相比,Windows CE设备驱动程序开发主要难点在于不同类型设备的驱动程序架构是不一样的。以流接口驱动程序为例,Windows CE设备驱动程序是用户模式动态链接库(DLL),其入口点在不同的情况下有一些细微的差别,主要入口点包括:XXX_Init、XXX_Deinit、XXX_Open、XXX_
Close、XXX_IOControl、XXX_Read、XXX_Seek、XXX_PowerUp和XXX_PowerDown.在实际开发中,接口名称中的XXX 3个字母由所驱动的设备文件名前缀代替。
2.2 与应用程序的通信
设备驱动程序构造成功后,将它与设备一同安装进系统,以便用户可以对设备进行适当的控制及访问。在桌面Windows和Windows CE两个系统中使用Win32 API实现硬件的访问。首先调用CreateFile创建1个设备的连接,获得该设备的句柄(Handle),然后根据需要调用ReadFile、WriteFile、DeviceIoControI等函数对设备进行读写或者其他I/O控制操作,调用CloseHandle关闭设备。
在桌面Windows系统中,当用户需要访问某设备时,必须首先取出指定设备全局标识符(GUID)的设备信息集,枚举设备实例的接口数据,从中获得设备的符号链接名,然后调用CreatFile创建设备,并获得设备句柄,且在驱动程序内部通过处理IRP响应来自Win32应用程序对IRP_MJ_CREATE、IRP_MJ_READ、IRP_ MJ_WRITE和IRP_MJ_OCTL等请求;IRP由IRP首部结构和一系列的栈单元组成,每个栈单元是一个IO_STACK_LOCATION结构;驱动程序仅需知道当前I/O栈单元和IRP首部结构中的信息就可以对IRP进行处理。驱动程序处理完IRP后,使用IoCompleteRequest函数通知I/O管理器,可以通过其参数设定状态码和返回的字节数。而在Windows CE系统中,应用程序需要了解中断处理线程中数据的输入输出完成情况,以便及时处理。这就需要建立应用程序和设备驱动程序的同步通信。
2.3 设备名
在Windows设备驱动中,为了提供对Win32程序可用的名字,必须为每个设备创建符号链接。在桌面Windows和Windows CE两个系统中,都可以采用1个明确的符号链接名。1个具体设备名称是由设备名前缀和设备名索引组成的,即3个大写字母、1位数字和冒号组成。另外在桌面Windows系统中,还可以采用设备接口为设备创建符号链接。每个设备接口由1个128位全局标识符(GUID)标志,把设备注册为1个特定的设备接口就创建了1个符号链接。用户态设备可以取得拥有此GUID的设备。
2.4 驱动程序的运行模式
在Windows系统中支持两种基本模式的驱动程序类型,即用户模式(User Mode)和内核模式(Kernel Mode),不同的模式允许不同层次的内存存取和系统资源的分配。内核模式驱动程序则由运行于内核模式的系统级代码组成,它们没有系统资源存取的限制,可以执行任何有效的CPU指令,被用来直接控制硬件。用户模式驱动程序是按用户模式运行的系统级代码,它们不能使用直接的硬件I/O指令来访问硬件。
WindowsCE使用了不同的开发技术: Windows CE 使用的 VC++ 5.0 开发系统嵌入式工具包,提供系统库、工具、文本和样本代码,从而使 OEMs 能够对特定的硬件平台使 Windows CE 标准定制。嵌入式工具包也包括设备驱动包(DDK)和软件开发包(SDK) ,DDK 提供了关于写驱动器的附加文本,SDK 提供库、头文件、样本代码、文本以允许,开发者对基于 Windows CE 的平台进行写操作。
桌面Windows系统一般要求设备驱动运行在内核模式下,内核模式提供设备资源的直接访问,没有固定的用户模式的辅助操作。
Windows CE系统一般要求设备驱动运行在用户模式下,运行在用户模式下有许多优点,明显优点的是当设备驱动开发有错误动作时,内核被有效地保护起来,明显地减少了内核被驱动程序破坏或者可能导致不能重新启动内核的潜在目标存储错误,以及其他意想不到的灾难等发生的可能性。
2.5 驱动程序的安装
桌面Windows的驱动程序的通过INF文件安装,INF文件是一个文本文件,含有安装1个WDM驱动设备程序需要的所有必需的信息,包括要复制的文件列表、要创建的注册表项等。驱动程序根据INF文件中的指令安装,驱动程序可执行文件被复制到正确的位置,通常是Windows System32\Drivers目录,然后创建各种注册表项。Windows CE和桌面Windows之间的区别是Windows CE不支持。sys和。inf文件,Windows CE设备驱动是编译成动态库,将驱动的动态库文件直接拷入Windows\目录,然后创建各种注册表项即可,减少了Windows CE加载程序的复杂性和大小。
3 开发环境比较
在桌面Windows系统中,驱动程序开发采用两种方式,一种是Microsoft公司提供的Windows DDK(Device Driver Kit)[6-7].由于DDK基于汇编语言的编程方式和内核模式的调用,对没有深厚的OS原理和编程水平的人员编程较困难;另一种是NuMega公司提供的DriverStudio,它是一个大的开发工具包,包含VtoolsD、SoftICE和DriverWorks等开发工具。利用DriverStudio开发WDM驱动程序,可以大大简化开发人员的工作量、缩短开发周期以及降低开发驱动程序的难度。
Windows CE开发平台的开发者、独立硬件供应商(IHVS)和应用程序开发者都会从事基于Windows CE平台的设备驱动程序开发。对于不同的开发者,微软为Windows CE提供了2种开发工具:Platform Builder和Embedded Visual Tools.Platform Builder是一个定制基于Windows CE操作系统的嵌入式平台的集成开发环境(IDE),为创建Windows CE嵌入式系统提供了全部相关工具,范围包括用来开发基于Windows CE的应用程序和设备驱动程序以及用来创建操作系统的各种自定义版本。而Embedded Visual Tools主要用于上层应用程序、驱动的开发,功能类似于桌面Windows平台上的开发工具VC、VB等,其是Embedded Visual C++,它具有与Visual C++ 6.0基本相同的特性,包括对MFC、ATL以及COM/DCOM 的支持、应用程序向导、编译调试等多种功能。
理解Windows CE与桌面Windows设备驱动程序开发的区别,有助于熟悉桌面Windows设备驱动程序开发的程序员快速掌握嵌入式操作系统Windows CE的设备驱动程序开发。近几年来,信息家电、掌上电脑、电视机顶盒等基于Windows CE操作系统的设备已越来越普及,而Windows CE上的设备驱动程序还比较少,因此,Windows CE设备驱动程序具有不少的开发潜力和市场。希望本文对有意开发Windows CE设备驱动程序的人们有所帮助。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。