张小进-《嵌入式WinCE系统开发》实验指导书.doc

上传人:椰子壳 文档编号:5022376 上传时间:2020-01-29 格式:DOC 页数:90 大小:5.33MB
返回 下载 相关 举报
张小进-《嵌入式WinCE系统开发》实验指导书.doc_第1页
第1页 / 共90页
张小进-《嵌入式WinCE系统开发》实验指导书.doc_第2页
第2页 / 共90页
张小进-《嵌入式WinCE系统开发》实验指导书.doc_第3页
第3页 / 共90页
张小进-《嵌入式WinCE系统开发》实验指导书.doc_第4页
第4页 / 共90页
张小进-《嵌入式WinCE系统开发》实验指导书.doc_第5页
第5页 / 共90页
点击查看更多>>
资源描述

《张小进-《嵌入式WinCE系统开发》实验指导书.doc》由会员分享,可在线阅读,更多相关《张小进-《嵌入式WinCE系统开发》实验指导书.doc(90页珍藏版)》请在三一文库上搜索。

1、 嵌入式WinCE系统开发 实 验 指 导 书张小进 编 写适用专业: 计算机科学与技术闽江学院 计算机科学 系2009年 7月前 言嵌入式C语言设计实验由验证性实验一、WinCE 平台的构建与配置,验证性实验二、线程同步调试实验,验证性实验三驱动程序结构实验,验证性实验四IO接口控制实验,验证性实验五动态链接库实验,验证性实验六UDP和Ping实验,综合性实验七CAN总线实验构成,通过实验应达到下列要求:1.熟悉嵌入式WinCE系统开发平台的搭建,PB集成环境的使用。掌握Windows CE 内核的配置、编译方法;掌握构建一个适合特定开发平台的Windows CE 系统方法;为后续的其它实验

2、打下基础。2.加深对嵌入式WinCE系统的认识,了解WinCE 下IO 访问机制和原理;掌握WinCE 线程编程方法;掌握线程同步原理和实现线程同步的方法;进一步熟悉VS.Net 的使开发环境;能较熟练地进行嵌入式WinCE的程序设计。3.熟悉嵌入式WinCE系统驱动程序的结构, 了解驱动程序的原理和功能;掌握流式接口驱动程序的结构;掌握编写流式接口的驱动程序的方法;能根据实验内容的要求进行验证性的编程实验以掌握驱动程序的框架结构。4. 掌握在Windows CE 下访问硬件I/O 寄存器的一般方法;了解WinCE 下IO 访问机制和原理;了解数码管(LED)的显示及控制原理;能根据实验内容的

3、要求进行验证性的编程实验以掌握I/O接口控制方法。5. 了解WinCE 动态链接库的基本原理;掌握WinCE 动态链接库程序的编程方法;掌握采用静态和动态调用动态链接库方法;能根据实验内容的要求进行验证性的编程实验以掌握动态链接库的实现技术和使用方法。6. 了解UDP 网络通信的基本内容;掌握PING 实现的基本原理;了解TCP/IP 和ICMP 协议;能根据实验内容的要求进行验证性的编程实验以掌握嵌入式WinCE下的网络通信。7. 了解串口通信的基本原理;掌握串口编程的方法;掌握应用程序的GUI编程;能根据实验内容的要求进行综合性的编程实验以初步掌握串口通信的应用。8由于这门课程的实验需要大

4、量的时间练习,但受实验课时的限制需要学生课外补足(16到24学时),因此要求学生在实验前先预习实验内容并根据实验大纲的说明先期做好实验的准备工作。本指导书对综合性实验只给出设计的要求和指标不给实验源代码,由学生自己设计、编译、调试并运行;通过实验结果理解嵌入式WinCE驱动程序的实现方法;在实验报告中回答思考题。目 录 实验一 Windows CE 平台的构建与配置5实验二 线程同步调试实验27实验三 驱动程序结构实验38实验四 I/O接口控制实验52实验五 动态链接库实验61实验六 UDP 和Ping 实验70实验七 串口测试综合实验80实验一 Windows CE 平台的构建与配置实验学时

5、:2实验类型:验证实验要求:必修一、实验目的1、掌握Windows CE 内核的配置、编译方法;2、掌握构建一个适合特定开发平台的Windows CE 系统方法;3、熟悉Platform Builder 开发工具使用方法。二、实验内容1、安装XSBase270 实验开发平台的BSP;2、根据XSBase 目标平台的特点和系统的需要,配置Windows CE 操作系统的特性和功能;3、编译、链接操作系统内核,生成系统映象文件;4、下载并运行编译好的Windows CE 系统。三、实验原理、方法和手段1、Windows CE 操作系统简介Microsoft Windows CE 是一个开放的、可裁

6、剪的、32 位的实时嵌入式窗口操作系统。和其他桌面窗口操作系统(Windows XP/2000)相比,它具有可靠性好、实时性高、内核体积小等特点,适用于各种嵌入系统和产品。它拥有多线程、多任务、确定性的实时、完全抢先式优先级的操作系统环境,专门面向只有有限资源的嵌入式硬件系统。同时,开发人员可以根据特定硬件系统对Windows CE 操作系统进行裁剪、定制,所以目前Windows CE 被广泛用于各种嵌入式智能设备的开发,是当今应用最多、增长最快的嵌入式操作系统。Windows CE 被设计成为一种高度模块化的操作系统,每一模块都提供特定的功能,这些模块中的一部分被划分成组件,系统设计者可以根

7、据设备的性质只选择那些必要的模块或模块中的组件包含进操作系统映像,从而使Windows CE 变得非常紧凑(只占不到200 KB的RAM),因此只占用了运行设备所需的最小的ROM、RAM 以及其它硬件资源。Windows CE 被分成不同的模块,其中最主要的模块有内核模块(Kernel)、对象存储模块、图形窗口事件子系统(GWES)模块以及通信(Communication)模块。另外Windows CE还包含一些附加的可选择模块,这些模块可支持的任务有管理可安装设备驱动程序、支持COM 等。一个最小的Windows CE 系统至少由内核和文件系统模块组成。1.1 内核模块内核模块是Window

8、s CE 操作系统的核心,它为任何基于Windows CE 的设备提供处理器调度、内存管理、异常处理以及系统内通信等系统功能,并为应用程序使用这些核心功能提供内核服务。Windows CE 的内核模块通过CoreDLL 模块表示。所有的操作系统定制设计都必须包含这个模块,但并不是这个模块的所有组件都必需的,有一些内核组件是可选的。1.2 对象存储对象存储是Windows CE 的默认文件系统,它相当于Windows CE 设备上的硬盘。对象存储是由共享一个内核堆的文件系统、系统数据库和系统注册表组成,即使在没有系统主电源时,对象存储也能维持应用程序及相关数据不会丢失。对象存储可将用户数据和应用

9、程序数据存入文件或注册器。在操作系统创建进程(该进程中只包括那些必需选项)的过程中,对于这些不同的对象存储组件,可以选取,也可以忽略。1.3 图形窗口和事件系统模块图形窗口和事件系统模块(GWES)包含大部分的核心Windows CE 功能,它集成了图形设备接口(GDI)、窗口管理器和事件管理器。GWES 模块时Windows CE 操作系统高度组件化的部分,它分别由USER 和GDI 两_部分组成,USER 用来处理消息、事件及鼠标和键盘等用户输入,而GDI 用于处理图形的屏幕和打印输出等。GWES 是用户、应用程序和操作系统之间的图形用户接口。GWES 通过处理键盘、鼠标动作与用户交互,并

10、选择传送到应用程序和操作系统的信息。GWES 通过创建并管理在显示设备和打印机上显示的窗口、图形以及文本来处理输出。GWES 的中心是窗口。所有应用程序都通过窗口接收来自操作系统的消息,即使那些为缺少图形显示的设备创建的应用程序也是如此。GWES 提供控制器、菜单、对话框以及图形显示的设备资源,还提供GDI 以控制文本与图形显示。1.4 通信模块通信模块为基于Windows CE 的设备提供有线或无线通信能力,使Windows CE 设备能够与其他设备或计算机进行连接与通信,通信组件提供对下列通信硬件和数据协议的支持: 串行I/O 支持 远程访问服务(RAS) 传输控制协议/ Internet

11、 协议(TCP/IP) 局域网(LAN) 电话技术API (TAPI) WinCE 的无线服务可选组件除上述主要模块之外,还可使用其它的操作系统模块。这些模块与组件主要有: 设备管理器和设备驱动程序 多媒体(声音)支持模块 COM 支持模块 WinCE 外壳模块WinCE 提供的每一模块或组件都支持一组可用的相关API 函数。2 Platform Builder 开发工具介绍Platform Builder(PB)是微软提供给Windows CE 开发人员进行基于Windows CE 平台下嵌入式操作系统定制的集成开发环境。它提供了所有进行设计、创建、编译、测试和调试Windows CE 操作

12、系统平台的工具。它运行在桌面Windows 下,开发人员可以通过交互式的环境来设计和定制内核、选择系统特性,然后进行编译和调试。该工具能够根据用户的需求,选择构建具有不同内核功能的CE 系统。同时,它也是一个集成的编译环境,可以为所有CE 支持的CPU 目标代码编译C/C+程序。一旦成功地编译了一个CE 系统,就会得到一个名为nk.bin 的映像文件。将该文件下载到目标板中,就能够运行CE 了。Platform Builder 提供了开发人员快速建立基于Windows CE 嵌入式系统所需的各种工具。Platform Builder 的集成开发环境(IDE)允许开发人员配置、建立并调试能够借助

13、Windows和Web 强大功能为嵌入式系统带来灵活性与可靠性的新一代高度模块化设计方案。Platform Builder 提供的主要特性包括:l 平台开发向导(Platform Wizard)和BSP 开发向导:开发向导用于引导开发人员区创建一个简单的系统平台或BSP(板级支持软件包),然后再根据要求进一步修改。开发向导提高了平台和BSP 创建效率;l 特性目录(Catalog):操作系统可选特性均在特性目录(Catalog)中列出,开发人员可以选择相应的特性来定制操作系统;l 导出向导(Export Wizard)。可以向其他Platform Builder 用户导出自定义的目录(Cata

14、log)特性;l 导出SDK 向导(Export SDK Wizard):使用户可以导出一个自定义的软件开发工具包(SDK),可以将客户定制的SDK 导出到特定的开发环境中(如EVC)。l 远程工具:可以执行同基于Windows CE 的目标设备有关的各种调试任务和信息收集任务;l 仿真器(Emulator):通过硬件仿真加速和简化了系统的开发,使用户可以在开发工作站上对平台和应用程序进行调试,大大简化了系统的开发流程,缩短了开发时间。l 应用程序调试器:可以在自定义的操作系统映像上对应用程序进行调试;l 内核调试器:可以对自定义的操作系统映像进行调试,并且向用户提供有关映像性能的信息;l 驱

15、动测试工具包(Windows CE.net Test Kit):系统为驱动程序开发提供了基本的测试工具集;l 基础配置:为各种流行的设备类别预置的可操作系统基础平台,为自定义操作系统的创建提供了一个起点。Platform Builder 的开发界面如图1-1 所示。图1-1 Platform Builder 开发界面3BSP 原理简述BSP 又称板级支持软件包,它是一个包括启动程序、OEM 适配层程序(OAL)、标准开发板(SDB)和相关硬件设备驱动程序的软件包。BSP 是基于Windows CE 平台系统的主要部分,它是由一些源码和二进制文件组成。对于嵌入式系统来说,它没有像PC 机那样具有

16、广泛使用的各种工业标准,各种嵌入式系统的不同应用需求决定了它选用的各自定制的硬件环境,这种多变的硬件环境决定了无法完全由操作系统来实现上层软件与底层硬件之间的无关性。因此各种商用实时操作系统都采用了分层设计的方法,它将系统中与硬件直接相关的一层软件独立出来,称之为BoardSupport Package(板级支持软件包,简称BSP)。顾名思义,BSP 是针对某个单板而设计的,它对于用户(开发者)是开放的,用户可以根据不同的硬件需求对其作改动或二次开发,而操作系统本身仅仅提供了CPU 内核的无关性。BSP 在系统中的角色,很相似于BIOS 在PC 统中的地位。BSP 在系统中所处的位置,如图1-

17、2 所示,它位于硬件平台与操作系统或应用软件之间,用于屏蔽上层软件对各种硬件的相关性。图1-2 BSP 在系统中的位置BSP 的主要功能在于配置系统硬件使其工作在正常状态,并且完成硬件与软件之间的数据交互,为OS 及上层应用程序提供一个与硬件无关的软件平台。在Platform Builder 中,微软提供了对十几中标准开发板(SDB)支持的BSP,这些BSP 覆盖了所有Windows CE 可支持的处理器类型,它可使开发者快速地评估各种操作系统特性并减少新产品开发时间。四、实验组织运行要求根据本实验的特点、要求和具体条件,采用以学生自主训练为主的开放模式组织教学。重点:Windows CE 内

18、核的配置、编译方法;构建特定开发平台的WinCE系统方法;熟悉Platform Builder 开发工具使用方法。难点:构建特定开发平台的WinCE系统方法五、实验条件装有WinCE、XScale PXA270开发环境和VS的PC机或虚拟机六、实验步骤1、安装XSBase270 的BSP为了使Platform Builder支持XSBase270 开发板的硬件资源系统,在安装Windows CE 之后需要安装XSBase270 的板级支持软件包(BSP)。具体安装步骤:双击随开发板提供的BSP 安装文件XSBase270.msi,进入BSP 安装向导如图1-3 所示。图1-3 XSBase27

19、0 BSP 安装向导按“Next”按钮,进入安装过程,BSP 自动选择Windows CE 安装目录(D:WINCE500),如图1-4 所示。图1-4 BSP 安装目录界面按“Install”按钮,进行BSP 的安装。如图1-5 所示。图1-5 BSP 安装过程界面BSP 安装完成后,安装向导提示安装完成界面,按“Finish”按钮,完成BSP 的安装。如图1-6 所示。图1-6 BSP 安装完成界面XSBase270 的BSP 安装完成后,启动Platform Builder,在Platform Builder 的特性目录区(Catalog)的第三方BSP(Third Party)节点下出

20、现所安装的XSBase270 的BSP(Emdoor System XSBase270:ARMV4I),如图1-7 所示。图1-7 Platform Builder 中XSBase270 的BSP2、实验平台的配置第一步:新建一个目标平台:a) 选择菜单项“File” -“New Platform Wizard.”;b) 输入目标平台名称和保存的位置,如图1-8所示图1-8 目标平台名称和保存路径界面c) 为目标平台选择所支持的BSP,XSBase270开发板选择选择“EMDOOR SYSTEM XSBASE270:ARMV4I” 平台,如图1-9所示;图1-9 BSP 选择界面d) 为新建的

21、目标平台选择一个合适的模板配置,如图1-10所示;图1-10 设计模板配置e) 在“Application & Media”选择有关特性(本实验选则默认项);如图1-11所示图1-11 Applications & Media 选择界面f) 在“Networking & Communications”中选择可用特性(默认项);如图1-12所示图1-12 Networking & Communications 配置界面g) 完成“New Platform Wizard.”,如图1-13所示图1-13 平台配置完成界面第二步:平台的配置a) 选择菜单项“Platform”“Setting”。b)

22、在“Platform Settings”对话框中设置“General”选项卡。选中“Release”,如图1-14所示图1-14 编译类型设置c) 在“Platform Settings” 对话框中设置“Build Options”选项卡;针对该XSBase270开发板实验平台的选项配置如图1-15 所示图1-15 编译选项配置第三步:配置系统组件和特性如图1-16 所示,左边的workspace 区显示的是所配置的WinCE 操作系统所具有的组件,右边的Catalog 区显示的则是PB 提供的能够加入到WinCE 操作系统的所有组件。实验者可以在右边的catalog 区中选择自己需要的设备驱

23、动程序和功能组件。如果决定要添加它到左边的workspace 区以参加编译,通过右击选项再选择“Add to OS Design”。图1-16 系统组件特性界面a) 添加XSBase270 实验平台提供的设备驱动程序XSBase270 实验平台的驱动程序由平台BSP 提供,其中包括输入设备(Input Devices)、网络设备(Networking)、PC 卡(PC Card)、SD 卡、串口、触摸屏、USB 设备等;另外还包括Emdoor OEM 驱动程序(主要包括:CAN 总线驱动、IDE 接口驱动、LED 显示驱动、电机接口驱动等)。如果用户想向新建平台添加设备驱动程序,通过右击选项再

24、选择“Add to OS Design”即可。如图1-17 所示图1-17 XSBase270 的BSP 提供的驱动程序b) 添加系统功能组件系统的功能组件属于平台无关部分,由Platform Builder 开发环境统一提供。它们均是在Core Os 目录下进行添加,如图1-17 所示。用户可以根据实验的需要添加系统功能组件,本实验中添加以下系统功能组件: 添加数据同步的组件:Core OS Windows CE devices Applications-End User ActiveSync File Sync; 图片浏览器的添加:Core OS Windows CE devices Ap

25、plications-End User FileViewers Microsoft Image Viewer 大的软键盘组件的添加:Core OS Windows CE devices Shell and User Interface Software Input Panel Software-based Input Panel (SIP) (Choose 1 or more) SIP for Large Screens 文件系统的添加:Core OS Windows CE devices File Systems and Data Store Storage Manager FAT File

26、 System; 配置信息保存模块添加:Core OS Windows CE devices File Systems and DataStore Registry Storage (Choose 1) Hive-based Registry; CF 卡模块的添加:Catalog Device Drivers Storage Devices Compact Flash /PC Card Storage (ATADISK) 添加802.11b无线CF 卡:Core OS Windows CE devices Communication Servicesand Networking Network

27、ing - Local Area Network (LAN) Wireless LAN (802.11)STA -Automatic Configuration and 802.1x EVC调试程序组件模块的添加:Catalog Platform Manager Platform Manager图1-18 添加系统功能组件3、平台的编译,构建系统,生成映像文件选择菜单项Build OS Sysgen 对平台进行编译(如图1-19 所示),如果没出任何错误,编译完成后将生成一个系统映象文件NK.bin,该文件被放在所建工程所保存的目录下的/RelDir/工程名_ ARMV4I_Release 目

28、录下(本实验的编译后的映像文件NK.bin 保存在D:WINCE500PBWorkspacesxsbase270RelDirXSBase270_ARMV4I_Release 目录下)。具体编译链接花费的时间根据你的宿主机的速度和你所配置平台的大小而定。一般需要2030分钟。图1-19 平台的编译4、代码下载测试 超级终端的配置 超级终端的通信参数设置(如图1-20 所示)图1-20 超级终端设置启动目标平台,超级终端显示Boot Loader 配置选项(如图1-21),如果需要下载新的映像文件,则第三项必须为:3)DHCP:Disable,第五项必须为:5) Download new imag

29、e at startup图1-21 目标板的Boot Loader 菜单配置选项 Platform Builder 配置:选择菜单项Target Connectivity Options 进行连接选项配置,如图1-22 所示。下载方式采用以太网下载,单击“Settings”按钮,对以太网进行配置,如图1-22 所示。假如没有接收到设备名:XSBASE2960 的话,检查网线是否连接好,可以查看板子上,以太网端口旁的指示灯是否点亮。然后检查XSBASE2960 的IP 是否跟你的PC 机在同一网段。图1-22 目标板连接配置图1-23 下载以太网配置 下载测试选择菜单项Target Attach

30、 Device,进行设备连接,如果设备连接正常,Platform Builder 将编译好的映像文件NK.bin 通过以太网下载到目标板中,图1-24 为Platform Builder下载进程。图1-24 映像文件下载进程同时超级终端显示映像文件下载情况,当超级终端出现下面的字样的时候,表示映像文件已经下载到目标板的Flash 存储器中。FlashWrite: Saved end sector(s) First 0x206 (Length=0x1FA).FlashErase: Unlocking flash block(s) 0x1, 0x1 (please wait): Done.Eras

31、ing flash block(s) 0x1, 0x1 (please wait): .Done.FlashWrite: Restored end sector(s) First 0x206 (Length=0x1FA).Writing to flash (please wait): Done.随后断电或按复位键重新启动,并将超级终端的第5 项改为“Launch existing flashresident image at startup.”然后按“L”字母。系统将启动起来。七、思考题1、如何使用PB 编译一个Mobile Handlheld 的平台?2、请描述Platform Builde

32、r 的功能;3、如何确定组件已经添加到PB 中?4、请编译一个在PC 机仿真(Emulator)运行的Windows CE 系统?八、实验报告1、实验预习在实验前每位同学都需要对本次实验进行认真的预习,并写好预习报告,在预习报告中要写出实验目的、要求,需要用到的仪器设备、物品资料以及简要的实验步骤,形成一个操作提纲。对实验中的安全注意事项及可能出现的现象等做到心中有数,但这些不要求写在预习报告中。设计性实验要求进入实验室前写出实验方案,并经指导教师审阅后实施。2、实验记录学生开始实验时,应该将记录本放在近旁,将实验中所做的每一步操作、观察到的现象和所测得的数据及相关条件如实地记录下来。实验记录

33、中应有指导教师的签名。3、实验报告主要内容包括对实验数据、实验中的特殊现象、实验操作的成败、实验的关键点等内容进行整理、解释、分析总结,回答思考题,提出实验结论或提出自己的看法。实验二 线程同步调试实验实验学时:2实验类型:验证实验要求:必修一、实验目的1、了解WinCE 下IO 访问机制和原理;2、掌握WinCE 线程编程方法;3、掌握线程同步原理和实现线程同步的方法4、熟悉VS.Net 的开发环境;二、实验内容1、了解在Windows CE 下线程编程方法;2、掌握利用线程同步实现线程同步的基本原理;3、掌握线程同步编程;4、掌握VS.net 编程方法三、实验原理、方法和手段1、线程概述W

34、inCE 是有优先级的多任务操作系统,它允许重功能、进程在相同时间的系统中运行,WinCE 支持最大的32 位同步进程。一个进程包括一个或多个线程,每个线程代表进程的一个独立部分,而一个线程被指定为进程的基本线程。WinCE 以抢先方式来调度线程。线程以“时间片”为单位来运行,WinCE 的“时间片”通常为25 毫秒。过来那个时间后,如果线程没有放弃它的时间片,并且线程并不紧急,系统就会挂起线程并调度另一个线程来运行。WinCE 将根据优先级方法来决定要运行的线程,高优先级的线程将在低优先级的线程前面调度。2、线程API 函数2.1 创建线程WinCE 提供了CreateThread 函数来创

35、建线程,其声明如下:HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, /线程安全指针,不支持DWORD dwStackSize, /为自己所使用堆栈分配的地址空间大小,不支持LPTHREAD_START_ROUTINE lpStartAddress, /线程函数地址LPVOID lpParameter, /传入线程函数的参数DWORD dwCreationFlags, /控制线程创建的附加标志LPDWORD lpThreadId/新线程的ID 值);WinCE 不支持lpThreadAttributes 和dwStack

36、Size 参数,将它们设置成NULL 和0 即可。lpStartAddress 指向线程函数的地址;lpParameter 被传递到线程中的参数;dwCreationFlags线程创建参数,可以设置成0 或CREATE_SUSPENDED,如果为0,表示线程立即执行,如果参数为CREATE_SUSPENDED,则被创建的线程将处于挂起状态,而且必须要调用ResumeThread 函数将其唤醒。2.2 挂起和恢复线程正在运行的线程可以被挂起、暂停执行。同他使用SuspendThead 函数即可实现以上功能,该函数的声明如下:DWORD SuspendThread(HANDLE hThread);

37、参数hThead 代表要挂起线程的句柄。由于SuspendThread 函数的调用将增加挂起计数,因此在实际调度线程运行之前,对SuspendThread 函数的多次调用必须与对ResumeThread 函数的多次调用相匹配。ResumeThread 函数的定义DWORD ResumeThreadHANDLE hThread;参数hThead 同样代表要恢复线程的句柄。3 线程同步在使用线程时,会经常遇到两个概念,即线程冲突和线程死锁。线程冲突:如果线程A 读写数据G,线程B 也正在读取数据G,那么很显然,该操作将导致数据冲突,引起数据混乱。这里需要使用同步技术,以保证线程A 和线程B 依次读

38、写数据G,避免数据冲突。线程死锁:例如A 工人为加工III 零件在等待B 提供的I 零件,而B 正好在等待应由A加工提供的II 零件来装配I 零件。由于他们之间再没有其他的任何人帮助通信或其他通信手段。所以他们一直在等对方的零件而进入死锁状态。死锁属于逻辑错误,无法通过线程同步来解决。WinCE 实现线程同步的常用方法:事件(Event)、互斥(Mutex)、信号量(Semaphore)、临界区(CriticalSection)。3.1 利用事件同步“事件对象”是实现线程同步最基本的方法之一,一个事件对象可以处于“已标示”和“未标示”两种状态,如果将事件对象设置为“已标示”状态,表示可以执行同

39、步操作,事件对象处于“未标示”状态,则表示需要等待事件对象变为“已标示”状态才可以进行同步操作。下面介绍利用事件同步所需要的API 函数。(1)CreateEvent 函数。创建事件对象函数CreateEvent,其声明如下:HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,/CE 不支持,设为NULLBOOLbManualReset, /设置是否手动设置事件对象状态BOOLbInitialState, /事件对象初始状态LPTSTR lpName /事件对象名称);参数bManualReset 表示是否手动设置事件对象状态,

40、当其值为TRUE 时,在调用完等待函数(WaitForSingObject,WaitForMutipleObject)后,则必须调用ResetEvent 函数,以设置事件对象没有被标示,当其值为FALSE 时,系统调用完等待函数,会自动将事件对象设置为未标示状态。参数bInitialState 表示事件对象初始状态,当其值为TRUE 是,事件对象初始化状态为已标示,当其值为FALSE 时,事件对象初始状态为未标示。如果创建事件函数对象CreateEvent 执行成功,将返回事件对象句柄。若失败,则返回0,在不用事件句柄时,需要使用CloseHandle()将其关闭,以释放资源。(2)SetEv

41、ent 函数和ResetEvent 函数。函数SetEvent()的功能是将事件对象设置为已标示状态。该函数的声明如下:BOOL SetEvent(HANDLE hEvent);参数hEvent 表示事件对象句柄。函数ResetEvent 函数功能将事件对象设置成未标示状态,该函数的声明如下:BOOL ResetEvent(HANDLE hEvent);(3) 使用事件同步的一般使用流程通常情况,在主线程中,用户利用CreateEvent 函数创建一个事件对象,并且将参数bManualReset 设为FALSE,参数bInitialState 也设为FALSE,此时事件对象状态未标示。然后在线

42、程里通过WaitForSingleObject 函数来等待事件被标示。此时,只要在主线程中调用SetEvent 函数,将事件对象设置成已标示。那么线程里的WaitForSingleObject 函数便会返回,继续执行,同时将事件对象状态设置成未标示。3.2 利用互斥同步互斥同步类似于事件对象同步。互斥同步也将创建一个互斥对象,该互斥对象也有“被线程拥有”和“不被线程拥有”两种状态;当互斥对象处于“不被线程拥有”状态,表示可以执行相关操作;当互斥对象处于“被线程拥有”状态,表示此时不可以执行相关操作。通过等待函数请求互斥对象实现同步。(1)CreateMutex 函数。通过CreateMutex

43、 函数创建互斥对象,该函数定义如下:HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, /CE 不支持BOOL bInitialOwner, /初始化拥有状态,TRUE 表示拥有,FALSE 表示未被拥有LPCTSTR lpName /互斥名称);如果创建互斥函数对象CreateMutex 执行成功,将返回互斥对象句柄。若失败,则返回ERROR_INVALID_HANDLE,在不用互斥句柄时,需要使用CloseHandle()将其关闭,以释放资源。(2)ReleaseMutex 函数。在使用等待函数请求互斥对象时,如果请求到互

44、斥对象的拥有权,则等待函数将自动设置互斥对象状态为“未被拥有”。ReleaseMutex 函数负责释放某个线程对象互斥对象的拥有权,也就是将互斥对象设置为“未被线程拥有”状态。ReleaseMutex函数定义如下:BOOL ReleaseMutex( HANDLE hHandle);hHandle 表示互斥对象句柄;(3)利用互斥同步的一般使用流程利用互斥同步的一般使用流程是:首先利用CreateMutex 函数创建互斥对象,并将CreateMutex 中的参数bInitialOwer 设置为FALSE,使互斥对象处于“未被线程拥有”状态。然后利用WaitForObject 等待互斥对象,执行

45、相关操作。处理完成后,利用ReleaseMutex 函数释放线程对互斥对象的拥有权。当所有线程执行完毕后,需要使用CloseHandle()将其关闭。3.3 利用临界区同步“临界区”是进行线程同步的另一种方法,它能够阻止两个或多个不同的线程在同一时间内访问同一个代码区域。它通过调用EnterCriticalSection 函数来指出已经进入代码的临界区,如果另一线程也调用了EnterCritialSection 函数,并且参数指向同一临界区对象,那么另一线程将阻塞,直到第一个线程调用了LeaveCriticalSection 函数离开临界区为止。临界区同步所需要的API 函数:(1) InitializeCriticalSection 函数。如果要使用临界区, 首先要使用InitializeCriticalSection 函数创建临界区,该函数定义如下:void InitializeCriticalSection( LPCRITICAL_SECTION lpCriticalSection );(2) DeleteCriticalSection 函数,当结束使用临界区对象时,必须调用DeleteCriticalSection函数释放临界区对象所占有的资源。该函数定义如下:void D

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1