基于嵌入式的LED灯亮度控制_第1页
基于嵌入式的LED灯亮度控制_第2页
基于嵌入式的LED灯亮度控制_第3页
基于嵌入式的LED灯亮度控制_第4页
基于嵌入式的LED灯亮度控制_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

沈 阳 工 程 学 院课 程 设 计课程设计题目: 基于嵌入式的LED灯亮度控制 沈 阳 工 程 学 院课程设计任务书 课程设计题目: 基于嵌入式的LED灯亮度控制 一、 设计目的Windows CE应用系统项目开发课程设计是实践性教学环节之一,是Windows CE应用系统开发课程的辅助教学过程,是计算机科学与技术专业的必修课。通过课程设计,结合实际的操作和设计,巩固课堂教学内容,使学生掌握Windows CE应用系统开发的基本概念、原理和技术,将理论与实际相结合,应用现有的硬件和软件条件完成一个完整的嵌入式系统的设计与实现,把理论课与实验课所学内容综合为一,并在此基础上强化学生的实践意识、提高其实际动手能力和创新能力,从而为后续课程的学习,毕业设计环节以及将来的实际工作打好坚实的基础。二、 课程设计的原始资料及依据查阅WINDOWS CE系统的教材、参考资料等,进一步深入了解与题目相关的WINDOWS CE系统的基本原理,系统架构,掌握开发环境和硬件芯片的基本特性,研究开发实例,实现课题要求的内容。三、 课程设计主要内容及要求设计内容:内容:在WINDOWS CE开发板上实现LED的多线程同步控制。设计要求:(1)开发基于mini2440开发板的LED灯的控制程序;(2)可以实现LED灯系统亮度的调节;(3)创建多线程的应用程序;(4)采用信号或互斥等,实现多线程同步。四、对课程设计说明书撰写内容、格式、字数的要求1课程设计说明书是体现和总结课程设计成果的载体,主要内容包括:设计题目、设计目的、设备器材、设计原理及内容、设计步骤、遇到的问题及解决方法、设计总结、参考文献等。一般不应少于3000字。2在适当位置配合相应的实验原理图、功能模块图、算法流程图等图表进行说明。应做到文理通顺,内容正确完整,书写工整,装订整齐。3设计总结部分主要写本人完成工作简介以及自己的设计体会,包括通过课程设计学到了什么,哪里遇到了困难,解决的办法以及今后的目标。4课程设计说明书手写或打印均可。手写要用学校统一的课程设计用纸,用黑或蓝黑墨水工整书写;打印时采用A4纸,页边距均为20mm,正文采用宋体小四号字,行间距18磅。文中大标题采用黑体小三号字,一级节标题采用黑体四号字,二级节标题采用黑体小四号字,表题与图题采用宋体五号字。5课程设计说明书装订顺序为:封面、任务书、成绩评定表、目录、正文、参考文献。五、设计完成后应提交成果的种类、数量、质量等方面的要求1提交课程设计说明书一份。2提交设计原理、设计图纸或图表(如接口电路原理图等)。3作品的使用或操作说明六、时间进度安排顺序阶段日期计 划 完 成 内 容备注11天系统分析、总体设计21天建立软硬件开发环境31天软件编码调试41天硬件及软件调试、51天答辩、撰写课程、提交课程设计报告5天七、主要参考资料(文献)1 C程序设计.北京:清华大学出版社,谭浩强.2005.2 Windows CE嵌入式系统 北京航空航天大学出版社 何宗键;3 Windows Embedded CE 6.0 程序设计实践 机械工业出版社 姜波;4 JeanJ Labrosse.嵌入式实时操作系统C/OS-II.北京.北京航空航天大学出版社,2003.5 Norman Matloff等.软件调试的艺术.北京:人民邮电出版社,2010.沈 阳 工 程 学 院Windows CE课程设计成绩评定表系(部): 信息学院 班级: 系统本112 学生姓名: 王学硕 指 导 教 师 评 审 意 见评价内容具 体 要 求权重评 分加权分调研论证能独立查阅文献,收集资料;能制定课程设计方案和日程安排。0.15432工作能力态度工作态度认真,遵守纪律,出勤情况是否良好,能够独立完成设计工作, 0.25432工作量按期圆满完成规定的设计任务,工作量饱满,难度适宜。0.25432说明书的质量说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。0.55432指导教师评审成绩(加权分合计乘以12) 分加权分合计指 导 教 师 签 名: 年 月 日评 阅 教 师 评 审 意 见评价内容具 体 要 求权重评 分加权分查阅文献查阅文献有一定广泛性;有综合归纳资料的能力0.25432工作量工作量饱满,难度适中。0.55432说明书的质量说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。0.35432评阅教师评审成绩(加权分合计乘以8)分加权分合计评 阅 教 师 签 名: 年 月 日课 程 设 计 总 评 成 绩分沈阳工程学院课程设计报告 摘 要摘 要以应用为中心、以计算机为基础的嵌入式技术,是当今发展最快、应用最广、最有发展前景的主要技术之一。嵌入式技术已经被广泛应用于工业控制、移动通信、信息家电、医疗仪器、汽车电子、航空航天等各个领域。在各种嵌入式处理器中,ARM以体积小、低功耗、低成本、高性能等优点,获得许多半导体厂商的支持,在嵌入式应用领域取得巨大的成功。Windows CE是一个多任务的操作系统,它采用了一种新的任务调度策略,也就是将一个进程划分成多个线程,每个线程轮流占用CPU的运行时间和资源。在这种策略下,操作系统将不断地将线程挂起、唤醒、再挂起、再唤醒,如此循环,直至最终完成某个任务。由于CPU的处理速度非常快,而且每个时间片又很短,因此,给人的感觉就是多个线程在同时运行。同样在编写基于Windows CE平台的应用程序时,也会用到多线程解决问题。Windows CE操作系统中每个应用程序启动后,就会变成一个单独的进程,并且每个进程都有自己的虚拟内存空间。操作系统可以列举系统的活动程序,并且可以根据进程的句柄终止进程或激活进程。由于每个进程都有自己的虚拟内存空间,因此各进程间相互独立,互相不干扰。进程是由线程构成的,即线程是Windows CE中最基本的执行单元。 线程有自己独立的堆栈和处理器环境。当线程被挂起时,寄存器将被推到线程的堆栈中,活动的堆栈将变成为要运行的下一个进程,该线程的CPU状态将从它的堆栈中被推出,这样新的线程将开始执行指令。进程中的线程可以共享进程地址空间,进程中的所有线程都能访问给线程分配的内存,不管是文件句柄、内存对象句柄还是同步对象句柄,线程都对其具有相同的访问权限。本文主要研究了Windows CE下的多任务体系,多线程间的同步,使用事件对象、互斥体对象、信号对象、临界区对象实现多线程间的互斥。关键词 嵌入式系统;实时性;ARM9;多线程;互斥 I沈阳工程学院课程设计报告 目 录目 录第一章 绪 论11.1 设计题目11.2 设计目的11.3 设计器材11.4 任务分析1第二章 设计原理22.1 嵌入式操作系统的概述22.1.1 嵌入式操作系统的特性22.1.2 嵌入式操作系统的分类22.1.3 嵌入式操作系统的特点22.2 设计原理32.2.1 Windows CE操作系统的主要特征32.2.2 Windows CE开发综述3第三章 系统设计73.1 系统需求分析73.1.1 课程设计内容73.1.2 课程设计要求73.2 硬件设计73.2.1 ARM处理器73.2.2 ARM硬件结构83.3.1 Windows CE下的多任务体系103.3.2 多线程的使用10第四章 多线程同步的实现154.1 下压按钮的实现154.2 位图的操作164.2.1 位图的概念164.2.2 设备相关位图174.2.3 设备无关位图174.2.4 绘制位图194.2.5 EVC中位图的创建204.3 程序中的主要函数21第五章 系统调试265.1 整个测试程序的效果图265.2 测试程序的功能26结 论27致 谢28参考文献29沈阳工程学院课程设计报告 第一章 绪 论第一章 绪 论1.1 设计题目 基于嵌入式的LED灯亮度控制1.2 设计目的1、本次课程设计的主要目的是创建线程,实现线程间的互斥,充分调动学生的积极性和创造性,重视学生实际动手能力的培养; 2、了解并掌握掌握相关专业课程知识和设计能力;3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技术;4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;5、加深对专业课的理解,强化学生的逻辑思维能力和动手能力,巩固良好的编程习惯,掌握工程软件设计的基本方法,为将来工作的学习打下坚实基础。1.3 设计器材本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:硬件要求:一台计算机,Mini2440教学开发板一块。软件配置:windows XP、EVC模拟器开发平台。1.4 任务分析早在20世纪60年代,就已经有人开始研究和开发嵌入式操作系统。但直到最近,它才在国内被越来越多的提及,在通信、电子、自动化等需要实时处理的领域所曰益显现的重要性吸引了人们越来越多的注意力。但是,人们所谈论的往往是一些著名的商业内核,诸如VxWorks、PSOS等。这些商业内核性能优越,主要原因在于嵌入式操作系统是多任务的操作系统,可以同时执行多个任务,并在它们之间来回切换,轮流使用CPU资源,让每一个任务感觉是自己在独占CPU资源,实现了同步。通过在ARM9上的Windows CE多任务的特性,通过理论的学习,理论结合实际,通过制作和调试实验板,添加多个线程,并实现多线程间的互斥。13沈阳工程学院课程设计报告 第二章 设计原理第2章 设计原理2.1 嵌入式操作系统的概述嵌入式系统是集成电路发展过程中的一个标志性成果,它把计算机直接嵌入到应用系统中,融合了计算机软/硬件技术、通信技术和微电子技术,是一种微电子产业和信息技术产业的最终产品。微电子产业是许多国家优先发展的产业。以超深亚微米工艺和IP核复用技术为支撑的系统芯片技术是国际超大规模集成电路发展的趋势和21世纪集成技术的主流。2.1.1 嵌入式操作系统的特性随着计算机技术和产品向其它行业的广泛渗透,由于嵌入式系统具有小巧、高度自动化、响应速度快的特点,因而非常适应信息家电和现代控制设备的需要,嵌入式技术成为了一个研究热点。嵌入式系统,是将计算机直接嵌入至系统中,是信息IT的最终产品。它根据应用的要求,将操作系统和功能软件集成于计算机硬件系统中,实现软件与硬件一体化。2.1.2 嵌入式操作系统的分类嵌入式操作系统是随着嵌入式系统的发展出现的。从应用范围角度大致可以分为可分为专用型(如Ucos、Windows CE、VxWorks、嵌入式Linux等)和通用型(如Palm OS、Symbian)的嵌入式操作系统等。从实时性的角度大致可以分为实时嵌入式操作系统和一般嵌入式操作系统。2.1.3 嵌入式操作系统的特点嵌入式操作系统是对通用操作系统的继承和发展,具有操作系统的基本功能,包括指令执行、任务调度、存储器管理、设备管理和中断处理等。但是,由于嵌入式系统的硬件环境和程序运行需求有很大限制,所以嵌入式操作系统又有如下并不同于一般操作系统的特点。1. 资源限制。嵌入式操作系统一般只有64MB内存,而且非易失性FLASH通常也就32MB,因此,操作系统运行时,就不能像在PC上那样使用资源了。2. 安全性限制。在嵌入式领域,系统在运行之后一般都不能在短时期内停机或者重启,因此死机、蓝屏是绝对不允许的。3. 可移植性。 2.2 设计原理多线程同步的设计依赖于Windows CE操作系统,在PC机上采用Embedded Visual C+4.0来开发,主要采用为C与C+的语言编写,多线程同步的设计需要简洁的界面和完善的功能,采用互斥量进行处理,界面框用来简单的位图来表示,通过多线程间的互斥实现多线程间的同步。2.2.1 Windows CE操作系统的主要特征Windows CE是微软公司自行开发的嵌入式操作系统,Windows CE的设计目标是:模块化及可延伸性、实时性能好,通信能力强大,支持多中CPU。从操作系统内核的角度看,Windows CE具有灵活的电源管理功能,包括睡眠/唤醒模式。在Windows CE中,还使用对象存储技术,包括文件系统、注册表及数据库。它还具有很多高性能、高效率的操作系统特性,包括视频共享储存、交叉处理同步、支持大容量堆栈等。Windows CE拥有良好的通信呢你。它广泛支持各种通信软件,也支持直接的局域网连接以及拨号连接,并提供与PC、内部网以及Internet的连接,包括用于应用级数据传输的设备至设备间的连接。在提供各种基本的通信基础结构的同时,Windows CE还提供了与Windows 9X/NT的整合和通信。 Windows CE的图形相当的出色。拥有基于Microsoft Internet Explorer的Internet浏览器,Windows CE甚至还能支持诸如手写体、声音识别、动态影像和3D图形等多种应用。Windows CE是一个多任务的操作系统,可以同时执行多个任务,并在它们之间来回切换。Windows CE其实就是Windows的简化版本,我们可以通过我们熟悉的Windows的操作方式来控制Windows CE,Windows CE也支持很多应用软件如Pocket Word,Pocket Excel。Windows CE同时内置了多媒体的功能,通过Windows Media Player可以播放声音视频。Windows CE支持的可扩充的Compact Flash/MMC/SD卡,通过扩充卡可以实现多种功能。2.2.2Windows CE开发综述2.2.2.1 Windows CE开发概述 Windows CE 开发主要包括 3 个方面的内容:应用开发、系统定制、驱动开发。 在Windows CE中进行应用开发,其开发工具和开发的流程方法都和在桌面 Windows 操作系统上进行应用开发十分类似。如果用户从事过 Windows 下的相关开发,可以很方便地为 Windows CE 编写应用程序。 使用微软提供的系统开发工具,可以为 Windows CE 进行系统定制和驱动程序的开发。用户可以增加或删除 Windows CE 中所包含的系统特性,改变 Windows CE 系统的启动界面和文件结构,为不同的硬件设备开发与其匹配的驱动程序。 另外,为了使 Windows CE 能够在硬件平台上正常加载和运行,还要开发引导操作系统的 Bootloader程序。这部分开发和硬件紧密相关,一般使用硬件厂商提供的工具来进行开发。 2.2.2.2 Windows CE开发工具在进行 Windows CE应用开发时,经常使用 Embedded Visual C+,简称 EVC。 EVC 是微软公司推出的可视化开发工具,主要用来开发基于Windows CE的应用程序。它是专为嵌入式开发而设计的开发工具,因此在一些特性上和桌面的 Visual C+开发工具会有一定程度的差异。EVC 的用户界面如图 2.1所示。 图2.1 EVC的用户界面 在进行 Windows CE 系统定制和驱动开发时,需要使用 Platform Builder 这个开发工具。Platform Builder是微软公司提供给Windows CE开发人员进行基于Windows CE平台下嵌入式操作系统定制的集成开发环境。它提供了所有进行设计、创建、编译、测试和调试 Windows CE 操作系统平台的工具。它运行在桌面 Windows 下,开发人员可以通过交互式的环境来设计和定制内核、选择系统特性,然后进行编译和调试。同时,开发人员还可以利用 Platform Builder 来进行驱动程序开发。Platform Builder 的强大功能,已使其成为 Windows CE 平台下嵌入式操作系统开发和定制的必备工具。Platform Builder 的使用界面如图 2.2 所示。 图2.2 Platform Builder的使用界面 2.2.2.3 Windows CE开发流程 Windows CE系统的开发大致可以分为 3 个阶段:硬件开发阶段、操作系统开发阶段和应用程序开发阶段。硬件开发阶段包括硬件选型与设计,Bootloader 开发。操作系统开发阶段包括 OAL 修改、内核特性裁剪、系统组件定制、驱动开发与修改以及测试与集成等。应用程序开发阶段,主要进行界面 UI、数据库以及其他应用程序的开发。基于 Windows CE 的产品开发流程如图 2.3 所示。 图2.3 基于Windows CE 的产品开发流程 (1)硬件选型,选择参考开发板。 (2)产品设计与布线,生成产品硬件板。 (3)创建或定制 Bootloader程序。 (4)导入目标设备的 BSP。 (5)创建基于该 BSP的操作系统工程,并完成系统特性定制与裁剪。 (6)创建或定制设备驱动程序。 (7)生成操作系统映像文件,将映像文件下载到参考开发板,并进行系统级调试。 (8)导出 SDK,提供给应用开发人员。 (9)应用开发人员进行应用程序编程,并针对系统 SDK生成可执行程序。 (10)将应用程序与操作系统进行整合与集成,生成最终的系统映像文件。 (11)将最终映像文件下载至产品硬件板,并进行整体测试。 沈阳工程学院课程设计报告 第三章 系统设计第3章 系统设计3.1 系统需求分析3.1.1 课程设计内容在WINDOWS CE开发板上实现LED灯的亮度控制。在mini2440开发板上用进程的互斥实现进程的同步,控制LED灯的亮度。3.1.2 课程设计要求(1)开发基于mini2440开发板的LED灯的控制程序;(2)可以实现LED灯系统亮度的调节;(3)创建多线程的应用程序;(4)采用信号或互斥等,实现多线程同步。3.2 硬件设计3.2.1 ARM处理器ARM(AdvancedRISCMachines),既可以认为是一个公司的名字,也可以认为是对微处理器的通称,还可以认为是一种技术的名字。ARM处理器是一个32位元精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。(1)ARM处理器系列ARM7系列、ARM9系列、ARM9E系列、ARM10E系列、SecurCore系列Intel的XscaleIntel的StrongARM ARM11系列,其中,ARM7、ARM9、ARM9E和ARM10为4个通用处理器系列,每一个系列提供一套相对独特的性能来满足不同应用领域的需求。(2)ARM处理器特点1、体积小、低功耗、低成本、高性能; 2、支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件; 3、大量使用寄存器,指令执行速度更快; 4、大多数数据操作都在寄存器中完成; 5、寻址方式灵活简单,执行效率高; 6、指令长度固定。(3)指令结构ARM微处理器的在较新的体系结构中支持两种指令集:ARM指令集和Thumb指令集。其中,ARM指令为32位的长度,Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30%40%以上的存储空间,同时具备32位代码的所有优点。3.2.2 ARM硬件结构(1)mini2440概述Mini2440 是一款真正低价实用的ARM9 开发板,是目前国内性价比最高的一款学习板;它采用Samsung S3C2440 为微处理器,并采用专业稳定的CPU 内核电源芯片和复位芯片来保证系统运行时的稳定性。mini2440 的PCB 采用沉金工艺的四层板设计,专业等长布线,保证关键信号线的信号完整性,生产采用机器贴片,批量生产;出厂时都经过严格的质量控制,配合这本十分详细的手册,可以迅速帮你掌握嵌入式Linux 和WinCE 开发的流程,只要有C 语言基础的人一般2 周即可入门。(2)mini2440开发板的结构CPU 处理器为Samsung S3C2440A,主频400MHz,最高533Mhz;SDRAM 内存在板64M SDRAM,32bit 数据总线,SDRAM 时钟频率高达100MHz;FLASH 存储:在板256M Nand Flash, 掉电非易失(用户可定制64M/128M/256M/512M/1G),在板2M Nor Flash,掉电非易失,已经安装BIOS。接口和资源:1 个100M 以太网RJ-45 接口(采用DM9000 网络芯片), 3 个串行口,1 个USB Host,1 个USB Slave B 型接口,1 个SD 卡存储接口,1 路立体声音频输出接口,一路麦克风接口;1 个2.0mm 间距10 针,JTAG 接口4 USER Leds,6 USER buttons(带引出座),1 个PWM 控制蜂鸣器,1 个可调电阻,用于AD 模数转换测试,1 个I2C 总线AT24C08 芯片,用于I2C 总线测试, 1 个2.0 mm 间距20pin 摄像头接口,板载实时时钟电池,电源接口(5V),带电源开关和指示灯。图3.1 开发板实物图(3)串口S3C2440 本身总共有3 个串口UART0、1、2,其中UART0,1 可组合为一个全功能的串口,在大部分的应用中,我们只用到3 个简单的串口功能(本开发板提供的Linux 和WinCE驱动也是这样设置的),即通常所说的发送(TXD)和接收(RXD),它们分别对应板上的CON1、CON2、CON3,这3 个接口都是从CPU 直接引出的,是TTL 电平。为了方便用户使用,其中UART0 做了RS232 电平转换,它们对应于COM0,可以通过附带的直连线与PC 机互相通讯。图3.2 S3C2440的串口(4)mini2440开发板地址空间分配S3C2440 支持两种启动模式:一种是从Nand Flash 启动(MINI2440 即是此种);一种是从Nor Flash 启动。在此两种启动模式下,各个片选的存储空间分配是不同的,如下图2.3:下图中,左边是 nGCS0 片选的Nor Flash 启动模式下的存储分配图;右边是 Nand Flash 启动模式下的存储分配图;图3.3 地址空间分配在 NAND Flash 启动模式下,内部的4K Bytes BootSram 被映射到nGCS0 片选的空间;在 Nor Flash 启动模式下(非Nand Flash 启动模式),与nGCS0 相连的外部存储器,Nor Flash 就被映射到nGCS0 片选的空间,SDRAM 地址空间:0x30000000 0x340000003.3 软件设计3.3.1 Windows CE下的多任务体系Windows CE操作系统中每个应用程序启动后,就会变成一个单独的进程,并且每个进程都有自己的虚拟内存空向。操作系统可以列举系统的活动进程,并且可以根据句柄终止进程和激活进程。由于每个进程。由于每个进程都有自己的虚拟内存空间,因此各进程之间相互独立,互相不干扰。进程是由线程构成的,即线程是Windows CE操作系统中最基本的执行单元。线程有自己独有的堆栈和处理器环境。当线程被挂起时,寄存器将被推到线程的堆栈中,活动的堆栈将变成要运行的下一个线程,该线程的CPU状态将从它的堆栈中被推出,这样新的线程就将开始执行指令。进程中的所有的线程都可能访问给该线程分配的内存,不管会文件句柄、内存对象句柄,线程都对其具有相同的访问权限。3.3.2 多线程的使用1. 线程的创建在MFC编程中,创建线程应使用AfxBeginThread()函数;在基于SDK的API编程中,应使用CreateThread()函数创建线程。AfxBeginThread()函数的原型定义如下图3.4所示:图3.4 AfxBeginThread()函数的原型定义 此函数的另外一种变现形式如下图所示:图3.5 AfxBeginThread()函数的另外形式定义 以上两个函数的定义的参数如下所示:1) pfnThreadProc:为辅助线程的回调指针,线程将要执行的代码就存在于该回调函数中,回调函数的原型必须按照如下方式定义:UINT MyControllingFunction(LPVOID pParam)2) pthreadClass:由CWinThread类派生而来的由RUNTIME_CLASS类制定的类。3) pParam:将要传给回调函数的参数见pfnThreadProc的说明。4) nPriority:线程优先级。5) nStackSize:线程栈的大小。6) dwCreateFlags:创建线程时的状态标志。7) CREATE_SUSPENDED:表明当线程开始后,线程处于挂起状态,直到调用了ResumeThread()函数为止。8) lpSecurityAttrs:为指向SECURITY_ATIRIBUTES结构的指针,该结构描述的是线程的安全属性,如果该形参为NULL,则采用创建该线程的线程相同的安全属性。CreateThread()函数是Windows API中用于创建线程的函数,该函数的原型定义如下:HANDLEWINAPICreateThread ( LPSECURITY_ATTRIBUTES lpsa, / security属性,在WinCE下须为NULL DWORD cbStack, / 堆栈大小,除非定义宏,否则被忽略 LPTHREAD_START_ROUTINE lpStartAddr, / 起始地址,即C的函数指针 LPVOID lpvThreadParam, / 自定义的传入线程参数 DWORD fdwCreate, / 标识线程是否立即运行,默认是LPDWORD lpIDThread / 新线程ID); Window C Runtime Library提供了封装CreateThread的函数_beginthreadex(),使得CRT对线程可以进行登记。函数原型一般在中,但Windows SDK4.2没有对此函数的定义。MFC是在eVC下提供的类库,基本上以MFC程序框架下封装了大多API系统调用,优点不仅仅是使用方便,更重要的是对系统的运行稳定性、正确性都提供的更高的保障。通过查阅得知,通过MFC提供的封装API函数AfxCreateThread()创建新线程,返回MFC的CWinThread类对象实例,这样通过对象实例可以更方便安全的进行线程的行为控制。函数原型为:CWinThread* AFXAPI AfxBeginThread( / 创建工作者线程重载方法 AFX_THREADPROC pfnThreadProc, / 线程起始函数 LPVOID pParam, / 自定义参数 int nPriority = THREAD_PRIORITY_NORMAL, / 优先级 UINT nStackSize = 0, / 栈大小 DWORD dwCreateFlags = 0, /标识线程是否立即运行,默认是 LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL / 安全属性);CWinThread* AFXAPI AfxBeginThread( / 创建UI线程 CRuntimeClass* pThreadClass, /指定线程类,为CWinThread子类 int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);线程初始化时可以传递参数,在Window CE下线程函数标准声明为UINT FunctionName(PVOID pArg),在CreateThread时将pArg对应实参指定。但传参注意MFC不是线程安全类的指针。本系统传递CDialog指针,因此通过类型转换,即在CDialog子类方法中调用AfxBeginThread(SubThread,(LPVOID)this,0,0,0,0)。2. 线程的状态线程的状态,一般有就绪态、运行台、阻塞态、终止态等。为了实现各线程的功能同步,有必要合理的是各个线程进行状态的切换。在MFC的线程框架下,通过:AfxCreateThread()启动线程、自身CWinTherad:Suspend()阻塞线程、其他线程调用CWinThread:Resume()重新就绪线程、线程return正常退出。考虑到本嵌入式系统对稳定性、效率的高要求,去掉不安全的调用,如CWinThread:Terminate()外部调用终止线程等方法。对于线程的结束,MFC建议线程自身通过return正常结束,而TerminateThread()则简单的收回线程控制块资源,极可能造成线程内部资源不能释放,是系统资源泄漏、变得不稳定。3. 线程的同步WindowsCE提供若干线程通信机制,本系统选用Event(事件)进行线程间的同步。通过CreateEvent()申请Event资源,返回HANFLE实例,以进行行为控制。在申请时即可指定生成时Event状态以及复位机制。本系统中信号生成时为复位状态,有且仅有手动调用ResetEvent()才能复位即手动方式,则在生成时参数为:CreateEvent(NULL,TRUE,FALSE,NULL)。对线程控制通过判断各Event资源信号的置位/复位实现。一个特点就是Event资源的静态优先级:多Event的判断通过WaitForMultipleObjects(3,signals,FALSE,-1)实现,对于Event数组signals装入3个Event并按优先级排列HANDLE signals3 = hCloseEvent, hPauseSampleEvent, hBeginSampleEvent,如果三个Event同时置位,则首先响应hCloseEvent,实现了线程关闭的可靠性。线程在某种条件下要进行状态切换,或者是自身行为或者是外界行为。首先线程外部创建线程,并指定线程初始状态。线程内部由于某种条件不满足,需要等待其他线程而挂起时自身调用CWindThread:Suspend()。然后需通过线程外界调用CWinThread:Resume(),使被唤醒线程进入就绪态,准备从CWinThread:Suspend()处继续执行。API的Sleep()可以是当前线程阻塞一定时间,在某些环境下(如与驱动交互时有意延时,以便驱动有时间操作硬件)可以用到。4. 进程间通信Windows CE没提供消息、端口等复杂的通信机制,而是提供了用于等待队列的几种基本的通信手段。如,事件对象、互斥、临界区等。这些都被以系统对象的形式来实现。所谓系统对象,就是由系统管理的资源实体,系统通过列表纪录并跟踪它们的状态。A. 信号量在Windows CE中,当线程在等待信号量的时候,该线程处于锁住(blocked)状态,这种状态一直持续到可用资源大于0为止。可用资源的最大值是在创建信号量的时候被指定的,因此我们可以通过信号量来指定访问资源的线程的数量。HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, /NULLLONG lInitialCount, /当前可用资源的初始值LONG lMaximumCount, /最大可用资源数量LPCTSTR lpName); /对象的名字当线程访问完可用资源以后,将释放信号量。释放信号量的函数为:BOOL ReleaseSemaphor(HANDLE hSemaphore, /对象的句柄LONG lReleaseCount, /要释放的资源数LPLONG lpPreviousCount); /返回原来的可用资源数当一个线程访问完可用资源以后,必须使用ReleaseSemaphor函数释放信号量,以使当前可用资源数递增。B. 互斥互斥也是一种保证线程同步的手段之一,它能够保证多个线程对同一共享资源的互斥访问。只有拥有互斥对象的线程才具有访问资源的权限。同时,由于互斥对象只有一个,因此就决定了了任何情况下共享资源都不会同时被多个线程所访问。创建一个互斥对象:HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, /设置成NULLBOOL bInitialOwner, /TURE或者FALSELPCTSTR lpName); /互斥对象的名称当互斥对象被创建以后,如果我们想获得这个互斥对象,首先应该通过GetLastError函数来验证互斥资源是否已经被提交,如果已经被前一个使用它的线程提交,那么我们就可以通过WaitForSingleObject函数来获得这个互斥对象。释放一个互斥对象:BOOL ReleaseMutex(HANDLE bMutex);C. 互锁函数在Windows CE中,互锁函数的作用是保证当一个线程访问一个变量的时候,其他线程无法访问此变量,以确保变量值的唯一性,这种访问方式称之为原子访问。Windows CE支持完整的互锁Win32API函数。LONG InterlockedIncrement(LPLONG lpAddend);这个函数使一个LONG类型的变量增加1,里面的参数为指向这个变化变量的指针。LONG InterlockedDncrement(LPLONG lpAddend);这个函数使一个LONG类型的变量减少1,里面的参数为指向这个变化变量的指针。D. 临界区临界区是Windows CE系统内部最常用的互斥手段,它能保证在临界区内所有被访问的资源不被其他线程访问,直到当前线程执行完临界区的代码为止。一般情况下,临界区对象用于保证一段程序代码的不间断性,一个临界区对象的使用通常被限定在某一个进程或者动态链接库中。与临界区相关的函数主要有:void InitializeCriticalSection(LPCRITICAL_SECTION);函数InitializeCriticalSection的作用是初始化临界区;void EnterCriticalSection(LPCRITICAL_SECTION);函数EnterCriticalSection的作用是进入临界区;void LeaveCriticalSection(LPCRITICAL_SECTION);函数LeaveCriticalSection的作用是退出临界区;void DeleteCriticalSection(LPCRITICAL_SECTION);函数DeleteCriticalSection的作用是撤销临界区;沈阳工程学院课程设计报告 第四章 多线程同步的实现26第4章 多线程同步的实现4.1 下压按钮的实现控件只是又一个窗口,所以可用CreateWindows或CreateWindowEx来创建窗口。控件是通过事件来通知父窗口的,而事件中包含WM_COMMAND消息,并且控件ID和句柄都编码在消息的参数中。和所有的消息一样,WM_COMMAND含有wParam和lParam这两个通用参数。对一个WM_COMMAND消息来说,wParam的高字位含有通知码,用来说明发送该消息的原因。wParam的低字位含有发送该消息的控件的ID,通常在创建控件的时候定义该ID,为了更好的使用,应该保证ID在控件的所有兄弟窗口中是唯一的。lParam则包含了控件窗口的句柄。通常,通过控件ID来追踪WM_COMMAND消息来源比通过控件的窗口句柄来追踪要更容易一些,不过这两个信息都可以从该消息中获得。下面是典型的WM_COMMAND消息处理程序中的头几行代码:WM_COMMAND: WORD idItem, wNotifyCode; HWND hwndCtl; / Parse the parameters idItem = (WORD) LOWORD (wParam); wNotifyCode = (WORD) HIWORD(wParam); hwndCtl = (HWND) lParam;从这里可以看出,WM_COMMAND消息处理程序通常是用控件ID和通知码来判断WM_COMMAND消息发送的原因。通过给控件发送预定义的消息,可以配置和操纵控件。除了这些事情,应用程序可以设置按钮的状态,给列表框增加或删除项,设置编辑框中选择的文本,所有这些都是通过给控件发送消息来完成的。控件通常是通过ID来标识的,但许多Window函数都要求用控件的句柄。这时可以用GetDlgItem函数来进行简单的转换。函数原型如下:HWND GetDlgItem(HWND hDlg, int nIDDlgItem);两个参数分别是控件的父窗口句柄和控件的ID。虽然从名字上看这个函数只能用在对话框上,但实际上它能用在任何窗口的控件上。关于对话框我将在第六章进行讨论。另外一个很方便的函数是SendDlgItemMessage,用于给控件发送消息。该函数发送消息给指定ID的子窗口。函数原型如下:LONG SendDlgItemMessage (HWND hParent, int nIDChild, UINT Msg, WPARAM wParam, LPARAM lParam);这些参数和SendMessage中的很类似。实际上,下面的这段代码从功能上讲和SendDlgItemMessage是一样的。LONG SendMessage (GetDlgItem (hParent, nIDChild), Msg, wParam, lParam);唯一的不同在于方便性,SendMessage没有嵌入GetDlgItem而已。 下面是六个预定义的窗口控件类。它们是:Button :各种按钮。Edit:一种用于输入和显示文本的窗口。List:一种包含字符串列表的窗口。Combo:编辑框和列表框的组合。Static:显示用户不能编辑的文本或图片的窗口。Scroll bar:未和具体窗口进行绑定滚动条。每个控件都有很多函数,所以本章难以涉及全部。但我会快速浏览一下这些控件,对重要的函数也会提及的。后面还会为您展示一个示例程序-CtlView,用来演示这些控件及它们同父窗口之间的交互。在本次实验中用到了两个下压按钮。下压按钮通常用于激发某种行为。当用户用手写笔按一个下压按钮,按钮会发送WM_COMMAND消息,其中wParam参数的高字位包含BN_CLICKED(用于按钮被单击的通知)通知码。具体代码的实现如下所示:void CCXZDlg:OnGegin() /start按钮触发后的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论