嵌入式WinCE系统开发

上传人:仙*** 文档编号:113253674 上传时间:2022-06-24 格式:DOC 页数:87 大小:5.27MB
返回 下载 相关 举报
嵌入式WinCE系统开发_第1页
第1页 / 共87页
嵌入式WinCE系统开发_第2页
第2页 / 共87页
嵌入式WinCE系统开发_第3页
第3页 / 共87页
点击查看更多>>
资源描述
? 嵌入式WinCE系统开发 ?实 验 指 导 书张小进 编 写适用专业: 计算机科学与技术闽江学院 计算机科学 系2021年 7月前 言嵌入式C语言设计实验由验证性实验一、WinCE 平台的构建与配置,验证性实验二、线程同步调试实验,验证性实验三驱动程序结构实验,验证性实验四IO接口控制实验,验证性实验五动态链接库实验,验证性实验六UDP和Ping实验,综合性实验七CAN总线实验构成,通过实验应到达以下要求:1.熟悉嵌入式WinCE系统开发平台的搭建,PB集成环境的使用。掌握Windows CE 内核的配置、编译方法;掌握构建一个适合特定开发平台的Windows CE 系统方法;为后续的其它实验打下根底。2.加深对嵌入式WinCE系统的认识,了解WinCE 下IO 访问机制和原理;掌握WinCE 线程编程方法;掌握线程同步原理和实现线程同步的方法;进一步熟悉VS.Net 的使开发环境;能较熟练地进行嵌入式WinCE的程序设计。3.熟悉嵌入式WinCE系统驱动程序的结构, 了解驱动程序的原理和功能;掌握流式接口驱动程序的结构;掌握编写流式接口的驱动程序的方法;能根据实验内容的要求进行验证性的编程实验以掌握驱动程序的框架结构。4. 掌握在Windows CE 下访问硬件I/O 存放器的一般方法;了解WinCE 下IO 访问机制和原理;了解数码管(LED)的显示及控制原理;能根据实验内容的要求进行验证性的编程实验以掌握I/O接口控制方法。5. 了解WinCE 动态链接库的根本原理;掌握WinCE 动态链接库程序的编程方法;掌握采用静态和动态调用动态链接库方法;能根据实验内容的要求进行验证性的编程实验以掌握动态链接库的实现技术和使用方法。6. 了解UDP 网络通信的根本内容;掌握PING 实现的根本原理;了解TCP/IP 和ICMP 协议;能根据实验内容的要求进行验证性的编程实验以掌握嵌入式WinCE下的网络通信。7. 了解串口通信的根本原理;掌握串口编程的方法;掌握应用程序的GUI编程;能根据实验内容的要求进行综合性的编程实验以初步掌握串口通信的应用。8由于这门课程的实验需要大量的时间练习,但受实验课时的限制需要学生课外补足16到24学时,因此要求学生在实验前先预习实验内容并根据实验大纲的说明先期做好实验的准备工作。本指导书对综合性实验只给出设计的要求和指标不给实验源代码,由学生自己设计、编译、调试并运行;通过实验结果理解嵌入式WinCE驱动程序的实现方法;在实验报告中答复思考题。目 录 实验一 Windows CE 平台的构建与配置5实验二 线程同步调试实验27实验三 驱动程序结构实验38实验四 I/O接口控制实验52实验五 动态链接库实验61实验六 UDP 和Ping 实验70实验七 串口测试综合实验80实验一 Windows CE 平台的构建与配置实验学时: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 是一个开放的、可裁剪的、32 位的实时嵌入式窗口操作系统。和其他桌面窗口操作系统Windows XP/2000相比,它具有可靠性好、实时性高、内核体积小等特点,适用于各种嵌入系统和产品。它拥有多线程、多任务、确定性的实时、完全抢先式优先级的操作系统环境,专门面向只有有限资源的嵌入式硬件系统。同时,开发人员可以根据特定硬件系统对Windows CE 操作系统进行裁剪、定制,所以目前Windows CE 被广泛用于各种嵌入式智能设备的开发,是当今应用最多、增长最快的嵌入式操作系统。Windows CE 被设计成为一种高度模块化的操作系统,每一模块都提供特定的功能,这些模块中的一局部被划分成组件,系统设计者可以根据设备的性质只选择那些必要的模块或模块中的组件包含进操作系统映像,从而使Windows CE 变得非常紧凑只占不到200 KB的RAM,因此只占用了运行设备所需的最小的ROM、RAM 以及其它硬件资源。Windows CE 被分成不同的模块,其中最主要的模块有内核模块Kernel、对象存储模块、图形窗口事件子系统GWES模块以及通信Communication模块。另外Windows CE还包含一些附加的可选择模块,这些模块可支持的任务有管理可安装设备驱动程序、支持COM 等。一个最小的Windows CE 系统至少由内核和文件系统模块组成。1.1 内核模块内核模块是Windows CE 操作系统的核心,它为任何基于Windows CE 的设备提供处理器调度、内存管理、异常处理以及系统内通信等系统功能,并为应用程序使用这些核心功能提供内核效劳。Windows CE 的内核模块通过CoreDLL 模块表示。所有的操作系统定制设计都必须包含这个模块,但并不是这个模块的所有组件都必需的,有一些内核组件是可选的。1.2 对象存储对象存储是Windows CE 的默认文件系统,它相当于Windows CE 设备上的硬盘。对象存储是由共享一个内核堆的文件系统、系统数据库和系统注册表组成,即使在没有系统主电源时,对象存储也能维持应用程序及相关数据不会丧失。对象存储可将用户数据和应用程序数据存入文件或注册器。在操作系统创立进程该进程中只包括那些必需选项的过程中,对于这些不同的对象存储组件,可以选取,也可以忽略。1.3 图形窗口和事件系统模块图形窗口和事件系统模块GWES包含大局部的核心Windows CE 功能,它集成了图形设备接口GDI、窗口管理器和事件管理器。GWES 模块时Windows CE 操作系统高度组件化的局部,它分别由USER 和GDI 两_局部组成,USER 用来处理消息、事件及鼠标和键盘等用户输入,而GDI 用于处理图形的屏幕和打印输出等。GWES 是用户、应用程序和操作系统之间的图形用户接口。GWES 通过处理键盘、鼠标动作与用户交互,并选择传送到应用程序和操作系统的信息。GWES 通过创立并管理在显示设备和打印机上显示的窗口、图形以及文本来处理输出。GWES 的中心是窗口。所有应用程序都通过窗口接收来自操作系统的消息,即使那些为缺少图形显示的设备创立的应用程序也是如此。GWES 提供控制器、菜单、对话框以及图形显示的设备资源,还提供GDI 以控制文本与图形显示。1.4 通信模块通信模块为基于Windows CE 的设备提供有线或无线通信能力,使Windows CE 设备能够与其他设备或计算机进行连接与通信,通信组件提供对以下通信硬件和数据协议的支持: 串行I/O 支持 远程访问效劳RAS 传输控制协议/ Internet 协议(TCP/IP) 局域网LAN 技术API TAPI WinCE 的无线效劳可选组件除上述主要模块之外,还可使用其它的操作系统模块。这些模块与组件主要有: 设备管理器和设备驱动程序 多媒体声音支持模块 COM 支持模块 WinCE 外壳模块WinCE 提供的每一模块或组件都支持一组可用的相关API 函数。2 Platform Builder 开发工具介绍Platform Builder(PB)是微软提供应Windows CE 开发人员进行基于Windows CE 平台下嵌入式操作系统定制的集成开发环境。它提供了所有进行设计、创立、编译、测试和调试Windows CE 操作系统平台的工具。它运行在桌面Windows 下,开发人员可以通过交互式的环境来设计和定制内核、选择系统特性,然后进行编译和调试。该工具能够根据用户的需求,选择构建具有不同内核功能的CE 系统。同时,它也是一个集成的编译环境,可以为所有CE 支持的CPU 目标代码编译C/C+程序。一旦成功地编译了一个CE 系统,就会得到一个名为nk.bin 的映像文件。将该文件下载到目标板中,就能够运行CE 了。Platform Builder 提供了开发人员快速建立基于Windows CE 嵌入式系统所需的各种工具。Platform Builder 的集成开发环境IDE允许开发人员配置、建立并调试能够借助Windows和Web 强大功能为嵌入式系统带来灵活性与可靠性的新一代高度模块化设计方案。Platform Builder 提供的主要特性包括:l 平台开发向导Platform Wizard和BSP 开发向导:开发向导用于引导开发人员区创立一个简单的系统平台或BSP板级支持软件包,然后再根据要求进一步修改。开发向导提高了平台和BSP 创立效率;l 特性目录Catalog:操作系统可选特性均在特性目录Catalog中列出,开发人员可以选择相应的特性来定制操作系统;l 导出向导Export Wizard。可以向其他Platform Builder 用户导出自定义的目录Catalog特性;l 导出SDK 向导Export SDK Wizard:使用户可以导出一个自定义的软件开发工具包SDK,可以将客户定制的SDK 导出到特定的开发环境中如EVC。l 远程工具:可以执行同基于Windows CE 的目标设备有关的各种调试任务和信息收集任务;l 仿真器Emulator:通过硬件仿真加速和简化了系统的开发,使用户可以在开发工作站上对平台和应用程序进行调试,大大简化了系统的开发流程,缩短了开发时间。l 应用程序调试器:可以在自定义的操作系统映像上对应用程序进行调试;l 内核调试器:可以对自定义的操作系统映像进行调试,并且向用户提供有关映像性能的信息;l 驱动测试工具包Windows CE.net Test Kit:系统为驱动程序开发提供了根本的测试工具集;l 根底配置:为各种流行的设备类别预置的可操作系统根底平台,为自定义操作系统的创立提供了一个起点。Platform Builder 的开发界面如图1-1 所示。图1-1 Platform Builder 开发界面3BSP 原理简述BSP 又称板级支持软件包,它是一个包括启动程序、OEM 适配层程序OAL、标准开发板SDB和相关硬件设备驱动程序的软件包。BSP 是基于Windows CE 平台系统的主要局部,它是由一些源码和二进制文件组成。对于嵌入式系统来说,它没有像PC 机那样具有广泛使用的各种工业标准,各种嵌入式系统的不同应用需求决定了它选用的各自定制的硬件环境,这种多变的硬件环境决定了无法完全由操作系统来实现上层软件与底层硬件之间的无关性。因此各种商用实时操作系统都采用了分层设计的方法,它将系统中与硬件直接相关的一层软件独立出来,称之为BoardSupport Package(板级支持软件包,简称BSP)。顾名思义,BSP 是针对某个单板而设计的,它对于用户(开发者)是开放的,用户可以根据不同的硬件需求对其作改动或二次开发,而操作系统本身仅仅提供了CPU 内核的无关性。BSP 在系统中的角色,很相似于BIOS 在PC 统中的地位。BSP 在系统中所处的位置,如图1-2 所示,它位于硬件平台与操作系统或应用软件之间,用于屏蔽上层软件对各种硬件的相关性。图1-2 BSP 在系统中的位置BSP 的主要功能在于配置系统硬件使其工作在正常状态,并且完成硬件与软件之间的数据交互,为OS 及上层应用程序提供一个与硬件无关的软件平台。在Platform Builder 中,微软提供了对十几中标准开发板SDB支持的BSP,这些BSP 覆盖了所有Windows CE 可支持的处理器类型,它可使开发者快速地评估各种操作系统特性并减少新产品开发时间。四、实验组织运行要求根据本实验的特点、要求和具体条件,采用以学生自主训练为主的开放模式组织教学。重点:Windows CE 内核的配置、编译方法;构建特定开发平台的WinCE系统方法;熟悉Platform Builder 开发工具使用方法。难点:构建特定开发平台的WinCE系统方法五、实验条件装有WinCE、XScale PXA270开发环境和VS的PC机或虚拟机六、实验步骤1、安装XSBase270 的BSP为了使Platform Builder支持XSBase270 开发板的硬件资源系统,在安装Windows CE 之后需要安装XSBase270 的板级支持软件包BSP。具体安装步骤:双击随开发板提供的BSP 安装文件,进入BSP 安装向导如图1-3 所示。图1-3 XSBase270 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)的第三方BSPThird Party节点下出现所安装的XSBase270 的BSPEmdoor 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) 为新建的目标平台选择一个适宜的模板配置,如图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) 在“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 区中选择自己需要的设备驱动程序和功能组件。如果断定要添加它到左边的workspace 区以参加编译,通过右击选项再选择“Add to OS Design。图1-16 系统组件特性界面a) 添加XSBase270 实验平台提供的设备驱动程序XSBase270 实验平台的驱动程序由平台BSP 提供,其中包括输入设备Input Devices、网络设备Networking、PC 卡PC Card、SD 卡、串口、触摸屏、USB 设备等;另外还包括Emdoor OEM 驱动程序主要包括:CAN 总线驱动、IDE 接口驱动、LED 显示驱动、电机接口驱动等。如果用户想向新建平台添加设备驱动程序,通过右击选项再选择“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 Applications-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 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) 添加无线CF 卡:Core OS Windows CE devices Communication Servicesand Networking Networking - Local Area Network (LAN) Wireless LAN (802.11) EVC调试程序组件模块的添加:Catalog Platform Manager Platform Manager图1-18 添加系统功能组件3、平台的编译,构建系统,生成映像文件选择菜单项Build OS Sysgen 对平台进行编译如图1-19 所示,如果没出任何错误,编译完成后将生成一个系统映象文件,该文件被放在所建工程所保存的目录下的/RelDir/工程名_ ARMV4I_Release 目录下本实验的编译后的映像文件NK.bin 保存在D:WINCE500PBWorkspacesxsbase270RelDirXSBase270_ARMV4I_Release 目录下。具体编译链接花费的时间根据你的宿主机的速度和你所配置平台的大小而定。一般需要2030分钟。图1-19 平台的编译4、代码下载测试 超级终端的配置 超级终端的通信参数设置如图1-20 所示图1-20 超级终端设置启动目标平台,超级终端显示Boot Loader 配置选项如图1-21,如果需要下载新的映像文件,那么第三项必须为:3DHCP:Disable,第五项必须为:5) Download new image 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 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.Erasing 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 Builder 的功能;3、如何确定组件已经添加到PB 中?4、请编译一个在PC 机仿真Emulator运行的Windows CE 系统?八、实验报告1、实验预习在实验前每位同学都需要对本次实验进行认真的预习,并写好预习报告,在预习报告中要写出实验目的、要求,需要用到的仪器设备、物品资料以及简要的实验步骤,形成一个操作提纲。对实验中的平安考前须知及可能出现的现象等做到心中有数,但这些不要求写在预习报告中。设计性实验要求进入实验室前写出实验方案,并经指导教师审阅后实施。2、实验记录学生开始实验时,应该将记录本放在近旁,将实验中所做的每一步操作、观察到的现象和所测得的数据及相关条件如实地记录下来。实验记录中应有指导教师的签名。3、实验报告主要内容包括对实验数据、实验中的特殊现象、实验操作的成败、实验的关键点等内容进行整理、解释、分析总结,答复思考题,提出实验结论或提出自己的看法。实验二 线程同步调试实验实验学时:2实验类型:验证实验要求:必修一、实验目的1、了解WinCE 下IO 访问机制和原理;2、掌握WinCE 线程编程方法;3、掌握线程同步原理和实现线程同步的方法4、熟悉VS.Net 的开发环境;二、实验内容1、了解在Windows CE 下线程编程方法;2、掌握利用线程同步实现线程同步的根本原理;3、掌握线程同步编程;4、掌握VS.net 编程方法三、实验原理、方法和手段1、线程概述WinCE 是有优先级的多任务操作系统,它允许重功能、进程在相同时间的系统中运行,WinCE 支持最大的32 位同步进程。一个进程包括一个或多个线程,每个线程代表进程的一个独立局部,而一个线程被指定为进程的根本线程。WinCE 以抢先方式来调度线程。线程以“时间片为单位来运行,WinCE 的“时间片通常为25 毫秒。过来那个时间后,如果线程没有放弃它的时间片,并且线程并不紧急,系统就会挂起线程并调度另一个线程来运行。WinCE 将根据优先级方法来决定要运行的线程,高优先级的线程将在低优先级的线程前面调度。2、线程API 函数2.1 创立线程WinCE 提供了CreateThread 函数来创立线程,其声明如下:HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, /线程平安指针,不支持DWORD dwStackSize, /为自己所使用堆栈分配的地址空间大小,不支持LPTHREAD_START_ROUTINE lpStartAddress, /线程函数地址LPVOID lpParameter, /传入线程函数的参数DWORD dwCreationFlags, /控制线程创立的附加标志LPDWORD lpThreadId/新线程的ID 值);WinCE 不支持lpThreadAttributes 和dwStackSize 参数,将它们设置成NULL 和0 即可。lpStartAddress 指向线程函数的地址;lpParameter 被传递到线程中的参数;dwCreationFlags线程创立参数,可以设置成0 或CREATE_SUSPENDED,如果为0,表示线程立即执行,如果参数为CREATE_SUSPENDED,那么被创立的线程将处于挂起状态,而且必须要调用ResumeThread 函数将其唤醒。2.2 挂起和恢复线程正在运行的线程可以被挂起、暂停执行。同他使用SuspendThead 函数即可实现以上功能,该函数的声明如下:DWORD SuspendThread(HANDLE hThread);参数hThead 代表要挂起线程的句柄。由于SuspendThread 函数的调用将增加挂起计数,因此在实际调度线程运行之前,对SuspendThread 函数的屡次调用必须与对ResumeThread 函数的屡次调用相匹配。ResumeThread 函数的定义DWORD ResumeThreadHANDLE hThread;参数hThead 同样代表要恢复线程的句柄。3 线程同步在使用线程时,会经常遇到两个概念,即线程冲突和线程死锁。线程冲突:如果线程A 读写数据G,线程B 也正在读取数据G,那么很显然,该操作将导致数据冲突,引起数据混乱。这里需要使用同步技术,以保证线程A 和线程B 依次读写数据G,防止数据冲突。线程死锁:例如A 工人为加工III 零件在等待B 提供的I 零件,而B 正好在等待应由A加工提供的II 零件来装配I 零件。由于他们之间再没有其他的任何人帮助通信或其他通信手段。所以他们一直在等对方的零件而进入死锁状态。死锁属于逻辑错误,无法通过线程同步来解决。WinCE 实现线程同步的常用方法:事件Event、互斥Mutex、信号量Semaphore、临界区CriticalSection。3.1 利用事件同步“事件对象是实现线程同步最根本的方法之一,一个事件对象可以处于“已标示和“未标示两种状态,如果将事件对象设置为“已标示状态,表示可以执行同步操作,事件对象处于“未标示状态,那么表示需要等待事件对象变为“已标示状态才可以进行同步操作。下面介绍利用事件同步所需要的API 函数。1CreateEvent 函数。创立事件对象函数CreateEvent,其声明如下:HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,/CE 不支持,设为NULLBOOLbManualReset, /设置是否手动设置事件对象状态BOOLbInitialState, /事件对象初始状态LPTSTR lpName /事件对象名称);参数bManualReset 表示是否手动设置事件对象状态,当其值为TRUE 时,在调用完等待函数WaitForSingObject,WaitForMutipleObject后,那么必须调用ResetEvent 函数,以设置事件对象没有被标示,当其值为FALSE 时,系统调用完等待函数,会自动将事件对象设置为未标示状态。参数bInitialState 表示事件对象初始状态,当其值为TRUE 是,事件对象初始化状态为已标示,当其值为FALSE 时,事件对象初始状态为未标示。如果创立事件函数对象CreateEvent 执行成功,将返回事件对象句柄。假设失败,那么返回0,在不用事件句柄时,需要使用CloseHandle()将其关闭,以释放资源。2SetEvent 函数和ResetEvent 函数。函数SetEvent的功能是将事件对象设置为已标示状态。该函数的声明如下:BOOL SetEventHANDLE hEvent;参数hEvent 表示事件对象句柄。函数ResetEvent 函数功能将事件对象设置成未标示状态,该函数的声明如下:BOOL ResetEventHANDLE hEvent;(3) 使用事件同步的一般使用流程通常情况,在主线程中,用户利用CreateEvent 函数创立一个事件对象,并且将参数bManualReset 设为FALSE,参数bInitialState 也设为FALSE,此时事件对象状态未标示。然后在线程里通过WaitForSingleObject 函数来等待事件被标示。此时,只要在主线程中调用SetEvent 函数,将事件对象设置成已标示。那么线程里的WaitForSingleObject 函数便会返回,继续执行,同时将事件对象状态设置成未标示。3.2 利用互斥同步互斥同步类似于事件对象同步。互斥同步也将创立一个互斥对象,该互斥对象也有“被线程拥有和“不被线程拥有两种状态;当互斥对象处于“不被线程拥有状态,表示可以执行相关操作;当互斥对象处于“被线程拥有状态,表示此时不可以执行相关操作。通过等待函数请求互斥对象实现同步。1CreateMutex 函数。通过CreateMutex 函数创立互斥对象,该函数定义如下:HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, /CE 不支持BOOL bInitialOwner, /初始化拥有状态,TRUE 表示拥有,FALSE 表示未被拥有LPCTSTR lpName /互斥名称);如果创立互斥函数对象CreateMutex 执行成功,将返回互斥对象句柄。假设失败,那么返回ERROR_INVALID_HANDLE,在不用互斥句柄时,需要使用CloseHandle()将其关闭,以释放资源。2ReleaseMutex 函数。在使用等待函数请求互斥对象时,如果请求到互斥对象的拥有权,那么等待函数将自动设置互斥对象状态为“未被拥有。ReleaseMutex 函数负责释放某个线程对象互斥对象的拥有权,也就是将互斥对象设置为“未被线程拥有状态。ReleaseMutex函数定义如下:BOOL ReleaseMutex HANDLE hHandle;hHandle 表示互斥对象句柄;3利用互斥同步的一般使用流程利用互斥同步的一般使用流程是:首先利用CreateMutex 函数创立互斥对象,并将CreateMutex 中的参数bInitialOwer 设置为FALSE,使互斥对象处于“未被线程拥有状态。然后利用WaitForObject 等待互斥对象,执行相关操作。处理完成后,利用ReleaseMutex 函数释放线程对互斥对象的拥有权。当所有线程执行完毕后,需要使用CloseHandle()将其关闭。3.3 利用临界区同步“临界区是进行线程同步的另一种方法,它能够阻止两个或多个不同的线程在同一时间内访问同一个代码区域。它通过调用EnterCriticalSection 函数来指出已经进入代码的临界区,如果另一线程也调用了EnterCritialSection 函数,并且参数指向同一临界区对象,那么另一线程将阻塞,直到第一个线程调用了LeaveCriticalSection 函数离开临界区为止。临界区同步所需要的API 函数:(1) InitializeCriticalSection 函数。如果要使用临界区, 首先要使用InitializeCriticalSection 函数创立临界区,该函数定义如下:void InitializeCriticalSection( LPCRITICAL_SECTION lpCriticalSection );2 DeleteCriticalSection 函数,当结束使用临界区对象时,必须调用DeleteCriticalSection函数释放临界区对象所占有的资源。该函数定义如下:void DeleteCriticalSection( LPCRITICAL_SECTION lpCriticalSection );3EnterCriticalSection 函数,在创立了临界区对象后,需要调用EnterCriticalSection函数进入临界区,以保护代码,该函数定义如下:void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);如果临界区对象已经属于另一个线程,那么此函数将阻塞直到另一线程离开临界区才返回。4LeaveCriticalSection 函数。如果要离开临界区,只需要调用LeaveCriticalSection 函数即可。该函数定义如下:void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);3.3 利用信号量同步信号量是建立在互斥根底上,并增加了资源计数的功能。它允许预定数目的线程同时进入要同步的代码。通过设置信号量计数为1,只允许一个线程同时访问同步代码,而实现线程同步。信号量同步所需要的API 函数:1 CreateSemaphore 函数。在使用信号量实现同步时,需要调用CreateSemaphore 函数创建信号量对象。该函数定义如下:HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, /CE 不支持LONG lInitialCount, /信号量初始化计数值LONG lMaximumCount, /信号量计数最大值LPCTSTR lpName /信号量对象名称);如创立信号量成功,函数返回信号量对象句柄,否那么返回NULL 值。2ReleaseSemaphore 函数。在使用等待函数请求信号量时,等待函数自动给信号量计数减1,那么当计数减到0 时,信号量对象将不能被请求。ReleaseSemaphore 函数负责给信号量计数加值,使信号量可以被请求。此函数定义如下:BOOL ReleaseSemaphore(HANDLE hSemaphore, /信号量句柄LONG lReleaseCount, /信号量计数增加的值LPLONG lpPreviousCount /输出量,表示上一次信号量计数);4、线程同步实验原理1在PXA270目标板上具有8个LED发光二极管,利用线程函数实现在LED点亮左移后便进行点亮右移,并循环进行。其中LeftShiftThread(LPVOID param)线程函数完成左移,RightShiftThread(LPVOID param)线程函数完成右移。由于两线程函数对同一物理地址和同一输入变量outdata进行操作,所以需要利用线程同步技术进行线程同步。下面为左移线程代码:右移代码参考源程序DWORD CThreadSyncDlg:LeftShiftThread(LPVOID param)CThreadSyncDlg *pDlg=(CThreadSyncDlg*)param;if(pDlg-m_CtrlEvent.GetCheck()/利用事件同步while(1) WaitForSingleObject(pDlg-m_hSyncEvent,INFINITE);/等待事件标示pDlg-outdata =0x01;for(int i=0;ioutdata);Sleep(m_ShiftTime);pDlg-outdata =(pDlg-outdata )m_bStop) /停止return 0;SetEvent(pDlg-m_hSyncEvent);/标示事件if(pDlg-m_CtrlMutex.GetCheck()/互斥同步while(1) WaitForSingleObject(pDlg-m_hSyncMutex,INFINITE);/等待互斥pDlg-outdata =0x01;for(int i=0;ioutdata);Sleep(m_ShiftTime);pDlg-outdata =(pDlg-outdata )m_bStop) ReleaseMutex(pDlg-m_hSyncMutex);return 0;ReleaseMutex(pDlg-m_hSyncMutex);/释放互斥对象if(pDlg-m_CtrlSemaphore.GetCheck()/信号量同步while(1) WaitForSingleObject(pDlg-m_hSynSemaphore,INFINITE);pDlg-outdata =0x01;for(int i=0;ioutdata);Sleep(m_ShiftTime);pDlg-outdata =(pDlg-outdata )m_bStop) ReleaseSemaphore(pDlg-m_hSynSemaphore,1,NULL);return 0;ReleaseSemaphore(pDlg-m_hSynSemaphore,1,NULL);if(pDlg-m_CtrlCritical.GetCheck()/临界区同步while(1) EnterCriticalSection(&(pDlg-m_critical_Section);/进入临界区pDlg-outdata =0x01;for(int i=0;ioutdata);Sleep(m_ShiftTime);pDlg-outdata =(pDlg-outdata )m_bStop) LeaveCriticalSection(&(pDlg-m_critical_Section);return 0;LeaveCriticalSection(&(pDlg-m_critical_Section);/离开临界区if(pDlg-m_CtrlNone.GetCheck()/没有使用同步技术while(1) pDlg-outdata =0x01;for(int i=0;ioutdata);Sleep(m_ShiftTime);pDlg-outdata =(pDlg-outdata )m_bStop)return 0;return 0;2线程开启过程void CThreadSyncDlg:OnbtnExecute()HANDLE m_hLeftThread;HANDLE m_hRighthread;m_bStop=FALSE;if(m_CtrlEvent.GetCheck():SetEvent(m_hSyncEvent);m_hLeftThread=:CreateThread(NULL,0,LeftShiftThread,this,0,NULL);/创立左移线程m_hRighthread=:CreateThread(NULL,0,RightShiftThread,this,0,NULL); /创立右移线程if(!m_hLeftThread)MessageBox(_T(Create LeftShiftThread Failed),_T(SystemInformation),MB_OK|MB_ICONERROR);if(!m_hRighthread)MessageBox(_T(Create RightShiftThread Failed),_T(SystemInformation),MB_OK|MB_ICONERROR);CloseHandle(m_hLeftThread);CloseHandle(m_hRighthread);3线程同步量初始化BOOL CThreadSyncDlg:OnInitDialog()CDialog:OnInitDialog();SetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE); / Set small iconCenterWindow(GetDesktopWindow();/ center to the hpc screenif(!InitLightReg()MessageBox(LInit Light Register Failed,LSystemInform,MB_OK|MB_ICONERROR);return FALSE;m_CtrlEvent.SetCheck(1);m_hSyncEvent=:CreateEvent(NULL,false,false,NULL);/创立事件同步对象m_hSyncMutex=:CreateMutex(NULL,false,NULL);/创立互斥同步对象m_hSynSemaphore = CreateSemaphore(NULL,1,1,NULL);/创立信号量同步对象InitializeCriticalSection(&m_critical_Section); /创立临界区同步对象return TRUE;4 同步变量的释放void CThreadSyncDlg:OnDestroy()if(m_hSyncEvent)CloseHandle(m_hSyncEvent);if(m_hSyncMutex)CloseHandle(m_hSyncMutex);if(m_hSynSemaphore)CloseHandle(m_hSynSemaphore);DeleteCriticalSection(&m_critical_Section);CDialog:OnDestroy();四、实验组织运行要求根据本实验的特点、要求和具体条件,采用以学生自主训练为主的开放模式组织教学。重点:Windows CE 下线程编程方法;线程同步编程。难点:线程同步实现线程同步的根本原理。 五、实验条件装有WinCE、XScale PXA270开发环境和VS的PC机或虚拟机六、实验步骤第一步:连接好实验系统,翻开实验箱电源。第二步:利用Visual Studio 翻开线程同步调试工程文件,进行编译:第三步:编译该代码,点击运行按钮,这样程序就会下载到XSBase270 目标板板上运行。运行界面如图2-1 所示。图2-1 线程同步调试实验运行界面第四步:线程调试实验程序操作过程在分别选中事件同步Event、互斥同步Mutex、信号量同步Semaphore、临界区同步CriticalSection后,按下“Execute按钮Ex
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!