WINCE试验参考指导书专业资料_第1页
WINCE试验参考指导书专业资料_第2页
WINCE试验参考指导书专业资料_第3页
WINCE试验参考指导书专业资料_第4页
WINCE试验参考指导书专业资料_第5页
已阅读5页,还剩73页未读, 继续免费阅读

下载本文档

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

文档简介

WINCE系统实验指引书WINCE系统实验指引书 1实验一、WindowsCE系统平台创立及模仿器使用: 2一、实验目 2二、实验内容 2三、预备知识 2四、实验设备 2五、实验原理 3六、实验环节 4七、思考题 11实验二、WindowsCEBOOTLOADER实验 12一、实验目 12二、实验内容 12三、预备知识 12四、实验设备及工具 12五、实验原理及环节 12六、思考题 30实验三、WindowsCE驱动开发 31一、实验目 31二、实验内容 31三、预备知识 31四、实验设备及工具 31五、实验原理及阐明 31六、实验环节 33七、思考题 40实验四、WindowsCE应用程序开发 41一、实验目 41二、实验内容 41三、预备知识 41四、实验设备及工具 41五、实验原理及阐明 41六、实验环节 44七、思考题 58实验一、WindowsCE系统平台创立及模仿器使用:一、实验目1、理解WinCE下重要工具——模仿器2、学习和模仿器有关远程调试工具3、学习WinCE调试手段4、复习WinCE开发工具PlatformBuilder二、实验内容建立WinCEPC端模仿器,建立使用模仿器配备,结识基于PB端WinCE远程调试工具。详细环节如下:依照目的平台特点和系统需要,使用PlatformBuilder配备WINDOWSCE操作系统特性和功能。编译、链接操作系统内核,生成内核镜像文献NK.bin。将镜像文献下载,并在模仿器上运营生成WINDOWSCE系统。同步,构建一种调试版WINDOWSCE系统,并实际调试该系统。三、预备知识嵌入式系统调试手段和办法基本概念,操作系统基本知识,PlatformBuilder基本操作。四、实验设备硬件:PC一台P3以上(内存不不大于384MB,安装竣工具硬盘剩余空间不得不大于600M)、ARM9实验箱(包括NETARM2410-S实验板、JTAG仿真器、各种串口线、并口线、网线、光盘等)一台。软件:PC操作系统Win以上、ADS1.2集成开发环境、PlatformBuilder4.2版本、SourceInsight3.0。五、实验原理模仿器(emulator)是PB一某些。专用于调试在PB下创立内核及应用程序。模仿器可以在PC下模仿WindowsCE物理平台。但事实上它只但是是一种运营在CPURing3级别顾客程序。因此它运营速度要比正常物理平台要慢。模仿器仅支持x86平台,它只能调试基于"Emulator:x86"内核和所有用x86指令集编译程序。模仿器有很大限制,这些限制使它只能运营简朴应用程序。但是有一点是好,操作系统大多数API对于任何CPU而言都是相似。考虑到不受CPU类型影响简朴程序,还是可以在模仿器上调试。学习PB,用它来创立内核而又没有实际物理平台来调试,那么模仿器非常适合。但模仿器限制也非常多,因此虽然在模仿器下调试过所有可以调试内核特性(feature,或者称组件),你掌握也但是是冰山一角。WindowsCE.net模仿器是嵌入式开发非常重要工具利器之一,通过模仿器可以在开发端进行平台模仿仿真验证。并且在PB方面和EVC方面都可以启动模仿器。通过模仿器,可以模仿一种在线运营WinCE系统设备,使得针对硬件设备调试可以放在PC端模仿实现,这对于整个开发过程中设计和验证有着至关重要作用。这一点和许多嵌入式操作系统有相似之处,例如VxWorks。图1-1WindowsCE模仿器窗口注意:关于模仿器硬件限制:(摘自WindowsCE协助文档)仅能模仿DEC2114x网卡驱动来提供网络支持,其他网卡驱动不支持。仅能模仿FLAT显示驱动,其他显示驱动不支持。不支持USB设备不支持PC卡、硬盘、CF卡。不支持FAT、CDFS、DVD文献格式。六、实验环节1、使用PB建立一种X86体系下模仿器办法和上一种实验讲过办法类似,如下简朴概括一下过程。(1)运用向导建立工程,第一步如图所示:图1-2工程建立第一步点击“Next”进入下一步,如图所示:图1-3工程建立第二步在这里可以选取你需要设备,也可以使用Customconfiguration自己定制。点击“Next”进入下一步,如图所示:图1-4工程建立第三步图1-5工程建立第六步图1-6工程建立第七步(2)配备编译环境一方面需要设立Platform\setting…对话框选取Retail模式图1-7设立Platform\setting…对话框保证EnableKITL,EnableKernelDebuger,EnableFullKernelMode三项都被选中,如图所示。图1-8设立Platform\setting选项图1-9语言选项(3)编译点击快捷按钮或者选取菜单Build\BuildPlatform编译工程。详细编译时间和你机器配备有很大关系。编译完毕,在系统信息里面会显示编译完毕信息“×errors,×warnings”,并显示生成内核镜像文献,如图所示。图1-10内核镜像文献(4)下载到模仿器配备模仿器:编译成功后,单击"Target"-"ConfigureRemoteConnection",如图2-35。在弹出对话框中找到"Download"下拉框,选取"Emulator-4.20",单击背面"Configure",在弹出对话框中设立辨别率为800X600或640X480。系统内存设立为64MB。单击"OK"后,在"Kernel"下拉框中选取"Emulator-4.20"。单击"OK",如图所示。图1-11配备连接图1-12配备模仿器启动模仿器:单击"Target"-"DownloadInitialize"。在下面对话框点“Yes”。图1-13启动模仿器等待一会,模仿器就出来了。可以看到原则外壳界面,也就是桌面。图1-14初始化下载显示模仿器界面如下图。注意:模仿器在本地PC生成需要占用较大内存和CPU使用,因此应当保证足够可用内存,否则模仿器运营将非常慢。同步,由于PB编译模仿器会产生大量文献,所以必要保证WindowCE.net系统目录所在分区有足够硬盘空间(至少600M),否则在编译过程中会因磁盘空间不够而中断。图1-15模仿器界面七、思考题结合你实验操作想一下,使用模仿器对于嵌入式开发有什么好处?实验二、WindowsCEBOOTLOADER实验一、实验目1、掌握WinCE启动过程,2、掌握WinCEforS3C2410中Bootloader基本工作原理,3、理解普通Bootloader开发办法。二、实验内容学习NETARM2410-S上WinCEBootloader工作原理,理解各级boot功能,结识Bootloader在嵌入式操作系统中普通开发办法。详细环节如下:理解WinCE启动过程,掌握WinCEforS3C2410中Bootloader基本工作原理掌握两级Bootloader不同功能,完毕两级Bootloader烧写编译、链接操作系统内核,生成内核镜像文献NK.bin,通过Eboot下载镜像文献,最后在开发板上引导WINDOWSCE系统三、预备知识C语言基本知识,操作系统体系构造基本知识,Bootloader方面知识。四、实验设备及工具硬件:PC一台P3以上(内存不不大于384MB,安装竣工具硬盘空间不得不大于600M)、ARM9实验箱(包括NETARM2410-S实验板、JTAG仿真器、各种串口线、并口线、网线、光盘等)一台。软件:PC操作系统Win以上、ADS1.2集成开发环境、PlatformBuilder4.2版本、SourceInsight3.0。五、实验原理及环节1、Bootloader概述简朴地说,BootLoader就是在操作系统内核运营之前运营一段小程序。通过这段小程序,可以完毕初始化硬件设备、建立内存空间映射图、和内核镜像建立通讯通道和调试通道等等工作,从而将系统软硬件环境带到一种适当状态,以便为最后调用操作系统内核准备好对的环境。普通来讲,BootLoader是严重依赖于硬件而实现,特别是在嵌入式系统中(有些某些还不可避免使用汇编语言实现)。因而,在嵌入式世界里几乎不也许建立一种通用BootLoader。因此针对特定解决器,必要专门来定制Bootloader,以实现不同功能需求。图2-1bootloader与其他构造关系绝大多数Bootloader实现功能都无外乎两个:启动内核镜像和下载内核镜像。而两者区别在顾客看来是不存在,它们只针对开发人员。因而,Bootloader作用是看起来很不起眼但实则是很重要。启动加载(Bootloading)模式:即Bootloader自动加载系统过程,整个过程并没有开发者和顾客介入。在正常条件下,必要保证这种启动方式有效,特别是在嵌入式产品发布时侯,BootLoader必要直接工作在这种模式下以保证系统正常运营。下载(Downloading)模式:在这种模式下,目的机上BootLoader将通过串口连接或网络连接等通信手段从主机(Host)下载文献,例如:下载内核映像和根文献系统映像等。从主机下载文献普通一方面被BootLoader保存到目的机RAM中,然后再被BootLoader写到目的机上FLASH类固态存储设备中。有系统还将启动各种通讯办法。BootLoader这种模式普通在第一次安装内核与根文献系统时被使用;此外,后来系统更新也会使用BootLoader这种工作模式。工作于这种模式下BootLoader普通都会向它终端顾客提供一种简朴命令行接口,并可以执行简朴交互。如下图2-2所示图2-2BootLoader构造图2、烧写Bootloader2410-S上CE系统和其她RTOS不同,它具备两级Bootloader来引导内核镜像。在Bootloader阶段,比起其她系统Bootloader来讲要复杂多。(1)NbootNboot(NandFlashBootloader)是2410-S上WinCE第一级Bootloader,位于NandFlashBlock0。重要负责初始化Flash,读取TOC,等等工作,最后将Eboot内容拷贝到RAM中,把CPU执行权交给Eboot接管。Nboot可以使用ADS开发,也可以使用其她工具来开发。使用SJF来把Nboot某些Bootloader烧写在第0个block中。用法如下:修改BIOS中计算机并口选项,设立并口为“378”模式。安装Giveio驱动,详细安装请参照Giveio阐明。之后在平台和PC之间连接好JTAG下载线。在命令行运营SJF2410/f:2410loader.bin回车,可以看到如下图界面注:在这里三次选取顺序为000(0120)图2-3选取K9S1208prog,即输入“0”,回车,如图所示。图2-4选取K9S1208Program,即输入“0”,回车,如图2-5所示。图2-5向block0烧写,即输入“0”,回车。之后看到浮现“Epppp……”字样表达正在向相应flash中写入数据。烧写完之后选取“2”Exit退出,如图所示。图2-6图2-7(2)TOCTOC(TableOfContent)是整个NandFlash中存储内容一种列表,这里面储存了关于启动和系统内核某些有关存储信息,需要写在NandFlashblock1中,由Nboot里函数读取。之后Nboot会按照读取内容进行配备和跳转到不同地址。使用文本查看工具可以看到TOC重要组织形式。如图所示:图2-8注:在这里三次选取顺序为001(0120)图2-9图2-10(3)EbootEboot(EthernetBootloader)是一种高档Bootloader,可以理解为一种伪KernelImage,位于从NandFlashBlock2开始某些空间。它重要负责各个设备初始化,内存地址映射,文献系统,网络系统驱动和加载内核镜像有关准备工作,已经是比较复杂Bootloader了。使用Eboot下载内核,Eboot执行完毕之后可以通过控制台来下载真正KernelImage,并跳转到Kernel来执行,这时系统就引导起来了。在执行过程中,Eboot会依照需要变化TOC中内容,这样就记录下来当时状态,例如IP地址,MAC地址,启动信息等等。值得注意是,只有在调试阶段才有使用Eboot必要,当系统设计完毕之后,可以通过修改Nboot来直接跳转执行KernelImage,不再使用Eboot来控制执行。这时,启动速度会有很大提高。BootLoader由两某些构成:OEM启动代码(OEMstartupcode)和主代码(maincode)。OEM启动代码是最先执行某些,它功能是初始化内存寄存器、设立CPU频率、初始化高速缓存等。之后它跳转到主代码中执行。普通OEM启动代码都是用汇编编写。主代码普通用C语言编写,它负责其他所有任务,在执行同步还可以将执行有关信息显示在屏幕上。普通添加公司LOGO或者其他启动LOGO都在此修改。主代码重要由几种某些构成:镜像下载代码,通过并口或者网卡来实现从远程计算机下载nk.bin;串口调试代码,包括对串口读写函数,顾客调用这些函数就可以通过串口在远程计算机和本地计算机之间通信;写flash代码,包括写镜像到flash函数;硬件监控代码。普通BootLoader执行流程见下图:图2-11上图中每个函数功能如下:StartUp():CPU最先执行函数。也就是启动代码。BootLoaderMain():先后调用KernelRelocate、OEMDebugInit、OEMPlatformInit、OEMPreDownload等函数。此函数源码文献途径为%_WINCEROOT%\public\common\oak\drivers\ethdbg\blcommon。OEMDebugInit():初始化串口。OEMPlatformInit():执行特定平台初始化工作,如时钟、某些驱动程序。OEMPreDownload():做下载前准备工作。普通用于反馈给顾客某些信息。DownloadImage():下载操作系统镜像到RAM或者Flash。OEMLaunch():负责启动镜像。OEMReadData():从远程计算机读取数据。OEMMapMemAddr():专用于写Flash时使用。由于写flash速度非常慢,因此此函数将Flash镜像暂时缓冲到RAM中。OEMShowProgress():从函数名就能看出。OEMIsFLashAddr():判断一种地址与否是Flash地址。OEMFinishEraseFlash():判断与否完毕了擦除Flash内容工作。OEMWriteFlash():写镜像到Flash。OEMStartEraseFlash():开始擦除Flash。OEMContinueEraseFlash():继续擦除Flash工作。可以看到,在Eboot中,所关于于网络和系统初始化工作都已经完毕,并作好了下载内核镜像准备,DownloadImage()下载内核镜像,最后执行OEMLaunch()函数,跳转到内核开始地址运营。此后内核就接管了CPU使用权和控制权,Bootloader退出控制。流程图如下图:图2-12Eboot也需要使用sjf2410在命令行中烧写,在命令行里面敲入sjf2410/f:eboot.nb0选取K9S1208,再选取写入Block2.操作与烧写Nboot完全类似注:在这里三次选取顺序为002(0120)图2-13图2-143、控制台使用Bootloader下载好之后,可以运营控制台执行某些操作。控制台负责了关于启动内核基本操作。建立控制台如下图所示:建立超级终端对EBOOT进行配备图2-15图2-16图2-17在这里需要对端口进行设立图2-18进入下画面后单击空格键就会进入EBOOT配备截面(即控制台)图2-19Eboot配备界面图2-20功能解释:1为设备启动IP及子网地址设定;2为boot延时时间设定;3选取与否设立动态IP分派,这一级Boot可以选取IP分派方式;4为重置TOC为缺省设立,各项参数将还原为默认值;5有两个选取,切换DOWNLOADNEW方式和LAUNCHEXIST方式;6选取与否将RAM内image写入到NandFlash中去,如果是Disable,则系统掉电将不能被保存;7选取修改MAC地址,推荐避开主机MAC地址;8选取与否启动KernelDebug功能;9为格式化整片NandFlash为二进制文献系统,这需要大概几分钟时间;B选取与否支持二进制文献系统,如果选取了9,则必要支持二进制文献系统;D下载内核镜像;R读取TOC中实际配备数据;F为低档格式化NandFlash,选取这一项将擦除flash上涉及Bootloader所有内容;L运营NandFlash上已有内核镜像。W将当前配备好数据写到TOC中保存。在这里重要对1、5、6、7、9等进行功能选取(其选项含义在下边有详解)注:1)IP及子网地址设定(注:IP规定同一网段网地址与PC相似)5)第一次下载选取DOWNLOADNEW方式成功后改为LAUNCHEXIST方式6)若不选取ENABLED将不会被写入FLASH中掉电后将会丢失7)修改MAC地址;不要与主机发生冲突(两者设立不同)9)最佳在下载新内核镜像时候先格式化FLASH否则也许会在下载新内核后浮现某些错误4.对编译好镜像内核进行下载:(此镜像是通过PlatformBuilder4.2来完毕;此工具软件可在微软网站下载)(1)一方面在PlatformBuilder4.2上建立一种工程(建立细节参照实验一)(2)然后把NK.bin放在你安装PlatformBuilder4.2盘符下如:C:\WINCE420\PUBLIC\arm2410\RelDir\SAMSUNG_SMDK2410_ARMV4IDebug注:arm2410是建立工程名字(3)在PB中选取菜单中Target/ConfigureRemoteConnection…,弹出如下对话框:选取相应平台之后将“Download:”“Kernel”都选取为“Ethernet”。然后启动实验板,按空格进入控制台,监视超级终端,选取“D”选项下载新内核,然后等待超级终端浮现:“Usingdevicename:'SMDK'+EbootSendBootmeAndWaitForTftpSentBOOTMEto55SentBOOTMEto55或类似字样。图2-21图2-22图2-23选取configure等待选取设备号图2-24图2-25(3)内核编译时间普通较长,如果不想等待太久,可以将光盘中已经编译完毕NK.bin拷贝到系统编译目录%_winceroot%\PUBLIC\NETARM2410-S\RelDir\SAMSUNG_UT2410XARMV4Release或类似目录下(如果已经存在则覆盖之)。使用eboot及PlatformBuilder下载已经编译好NKimage到目的设备上。其中NK.bin在\PUBLIC\NETARM2410-S\RelDir\图2-264、在上面对话框中点”configure…”浮现如下对话框:图2-27在其中选取浮现设备名,之后“OK”。然后拟定。这时会浮现下载进度。等待下载完毕。下载完毕后目的板上WinCE系统会自动运营。图2-28图2-29当WINCE操作系统成功启动后按实验平台复位键重新启动WINCE操作系统并对EBOOT进行重新配备:5)改为LAUNCHEXIST方式6)改为DISABLEw)对修改过选项进行保存六、思考题1、Bootloader在嵌入式操作系统中作用和功能是什么?想一想,WinCE中Bootloader形式和功能各是什么?2、想一想,如何修改nboot代码使nboot直接引导内核镜像启动,不通过eboot阶段。(提示:使用TOC不同内容,可以选取跳转到哪个,TOC已经包括了系统基本信息)实验三、WindowsCE驱动开发一、实验目1、学会使用WinCE操作系统开发工具2、熟悉开发环境3、理解嵌入式系统驱动开发基本思想和开发过程二、实验内容学习使用PlatformBuilder4.2集成开发环境,建立流驱动程序。理解WinCE基本系统体系架构理解WINDOWSCE系统设备驱动基本知识和办法学习使用PlatformBuilder4.2集成开发环境,建立流驱动程序三、预备知识C语言基本知识,设备驱动基本知识和办法,WinCE基本系统体系架构。四、实验设备及工具硬件:PC一台P3以上(内存不不大于384MB,安装竣工具硬盘空间不得不大于600M)、ARM9实验箱(包括NETARM2410-S实验板、JTAG仿真器、各种串口线、并口线、网线、光盘等)一台。软件:PC操作系统Win以上、ADS1.2集成开发环境、PlatformBuilder4.2版本、SourceInsight3.0。五、实验原理及阐明1、WinCE驱动程序架构当前WinCE拥有两种驱动架构模型,一种是本机设备驱动,另一种是流接口设备驱动。其中本机设备驱动已经被Microsoft开发并由系统直接支持,由GWES(图形窗口及事件子系统)统一管理和加载;流驱动则是由WinCE设备管理器来管理。这种组织形式相对于UNIX体系来说是比较复杂。本机设备驱动适合于集成到CE平台设备。例如电源驱动,它们已经成为了GWES一某些,不体现为单个DLL使用。这些驱动程序普通和系统有着较为紧密联系,因此普通是和系统一起加载。流设备驱动由于具备较好可移植性和可扩展性,被设备管理器独立出来管理统筹。在本实验中,将以一种示例流驱动演示程序来讲述简朴驱动工作。下面图3-1中较为清晰显示了单片形式存在驱动和分层方式驱动在WinCE中组织状况。图3-1驱动在WinCE中组织状况2、流驱动程序流驱动程序通过流驱动接口函数和设备管理器进行数据交互,并通过文献形式来组织,这一点和Unix平台是很类似。它以动态链接库形式存在,具备同一组接口并调用同一种函数集。流驱动面向是各种各样外设,重要任务是把外设使用传递给应用程序来使用。在WinCE中设备文献普通是保存在固定途径\Windows目录下,通过注册表机制来完毕特殊命名惯例。虽然流借口驱动程序具备普遍特性,但是咱们仍旧可以使用不同办法来实现它们。例如有些内部设备驱动程序就是使用流接口。此外尽管流接口程序普通是由设备管理器程序加载和卸载,但是有时候应用程序也执行加载和卸载任务。应用程序通过文献系统API来调用流接口函数,然后由流接口驱动程序调用本机驱动或者通过设备管理器与系统内核外围设备通讯交互,最后直接驱动有关硬件执行动作。3、流接口驱动程序普通原则入口流接口驱动程序普通都具备如下函数,具备一种统一操作原则如表3-1所示:表3-1流接口驱动程序函数函数名称描述XXX_Close驱动程序关闭时候调用XXX_Open打开一种设备驱动时调用XXX_Deinit设备管理器或者应用程序卸载驱动时调用XXX_Init设备管理器初始化设备时调用XXX_IOControl上层软件进行IO控制调用XXX_PowerDown系统挂起前调用XXX_PowerUp系统重新启动时调用XXX_Read打开设备时候进行读操作XXX_Write打开设备时候进行写操作XXX_Seek对设备指针进行操作时调用XXX_Reinit设备重复打开时调用其中XXX代表驱动文献名,由驱动类型3个大写字母缩写而成,规则由系统商定。详细规则请参照协助文档和MSDN阐明。理解了这些函数功用,就可以开始着手建立起来一种最简朴流驱动程序。它功能是向缓冲区中读写字符。六、实验环节1、建立模仿器工程运营PlatformBuilder,建立一种基于X86体系模仿器。下面驱动程序建立都可以在仿真器中模仿实现。注意需要在Applications&ServicesDevelopment选项中选取ActiveTempleLibrary(ATL),Clibraries&Runtimes,MessageQueuing(MSMQ),MicrosoftFoundationClasses(MFC),StandardSDKforWindowsCE.net这几种选项,这样可以保证将来调试驱动和调用应用程序具备足够库和服务可以享用。详细建立过程和办法可以仿照实验二里面环节来做,这里不再赘述。2、创立驱动程序工程在PB中新建一种工程,单击菜单中File选取建立NewProjectorFileName…弹出如下图3-2对话框。图3-2新建工程在这里选取Project标签选取WCEDynamic-LinkLibrary即WinCEDLL并在右侧输入工程名和存储位置(会默认)。点击“OK”确认。图3-3生成DLL类型在对话框中选取生成DLL类型,可以选取Anemptyproject来创立一种空dll,也可以选取AsimpleWindowsCEDLLproject,创立一种简朴WinCE动态链接库工程,这个工程只带有简朴DLL入口函数。ADLLthatexportssomesymbols用来生成简朴输出函数。点“Finish”完毕创立。如图3-3。创立完PB主界面上会切换到该工程,如图3-4所示。图3-4工程根目录再次点击File,选取“NewProjectorFileName…”,在向导对话框中选取Files标签,如下图3-5所示。如图3-5选取File选取建立C++SourceFile,同步添加文献名,存储途径并将文献添加到DLL工程中。加入“windows.h”,“tchar.h”头文献和动态链接库入口函数(原则函数)DllEntryPoint(),建立好一种简朴动态链接库架子,添加相应解决。详见各种阐明文档。3、编写驱动程序代码DWORDSTR_Init(DWORDdwContext){DWORDdwReturn=0;RETAILMSG(1,TEXT(“MYSTRINGS:STR_Init\t\n”));memset(achBuffer,0,BUFSIZE*sizeof(WCHAR));dwReturn=1;returndwReturn;}BOOLSTR_Deinit(DWORDhDeviceContext){BOOLbReturn=TRUE;RETAILMSG(1,(TEXT(MYSTRINGS:STR_Deinit\t\n”)));returnbReturn;}DWORDSTR_Open(DWORDhDeviceContext,DWORDAccessCode,DWORDShareMode){DWORDdwReturn=0;RETAILMSG(1,TEXT(“MYSTRINGS:STR_Open\t\n”));dwReturn=1;returndwReturn;}BOOLSTR_Close(DWORDhOpenContext){BOOLbReturn=TRUE;RETAILMSG(1,(TEXT(MYSTRINGS:STR_Close\t\n”)));returndwReturn;}BOOLSTR_IOControl(DWORDhOpenContext,DWORDdwCode,PBYTEpBufIn,DWORDdwLenIn,PBYTEpBufOut,DWORDdwLenOut,PDWORDpdwActualOut){BOOLbReturn=TRUE;RETAILMSG(1,(TEXT(MYSTRINGS:STR_IOControl\t\n”)));returnbReturn;}voidSTR_PowerDown(DWORDhDeviceContext){RETAILMSG(1,(TEXT(MYSTRINGS:STR_PowerDown\t\n”)));}voidSTR_PowerUp(DWORDhDeviceContext){RETAILMSG(1,(TEXT(MYSTRINGS:STR_PowerUp\t\n”)));}DWORDSTR_Read(DWORDhOpenContext,LPVOIDpBuffer,DWORDCount){DWORDdarter=0;RETAILMSG(1,TEXT(“MYSTRINGS:STR_Read\t\n”));DWORDcbBuffer=wcslen(achBuffer);dwReturn=min(cbBuffer,Count);wcsncpy((LPWSTR)pBuffer,achBuffer,dwReturn);returndwReturn;}DWORDSTR_Seek(DWORDhOpenContext,LongAmount,DWORDType){DWORDdwReturn=0;RETAILMSG(1,(TEXT(MYSTRINGS:STR_Seek\t\n”)));ReturndwReturn;}DWORDSTR_Write(DWORDhOpenContext,LPCVOIDpSourcdBytes,DWORDNumberOfBytes){DWORDdwReturn=0;RETAILMSG(1,(TEXT(MYSTRINGS:STR_Write\t\n”)));dwReturn=min(BUFSIZE,NumberOfBytes);wcsncpy(achBuffer,(LPWSTR)pSourceBytes,dwReturn);ReturndwReturn;}拟定编写完毕保存。如果不想编写,也可以直接拷贝光盘中MyDriver.cpp文献到工作目录下。4、准备配备文献Def文献。复制光盘中String.Def文献到工作目录下。Reg文献。复制光盘中StringReg.reg文献到工作目录下。Cec文献。复制光盘中MyDriver.cec文献到工作目录下。Makefile文献和Sources文献。复制makefile和sources文献到工作目录下。这些文献是DLL工程编译必要具备配备文献,它们阐明了关于驱动如何链接,编译路径,和系统注册等等重要工作,在编写新DLL时普通都需要进行改动甚至重写。这里直接拷贝光盘中文献来实现。有兴趣也可以使用文本查看软件(如UltraEdit32,WinHEX等)来打开这些文献,看看文献内部是如何配备。拷贝完毕后,在PB下导入CEC文献。将MyDriver.cec拷贝到PB当前工程目录下(模仿器目录下),打开File菜单,选取ManageCatalogFeatures弹出一种属性对话框,如图3-6。图3-6属性对话框在右侧按钮中点击Import,选中MyDriver.cec导入当前工程目录,然后单击“OK”确认完毕。导入办法和导入平台BSP办法是相似。可以发现驱动被添加到工程组件窗口中,在组件上点击右键,选取AddtoPlatform,完毕系统驱动添加。5、编译内核和实验一编译办法同样,点击来实现编译。特别注意当前是在使用模仿器,因此在编译选项中应当选中“EMULATOR:X86WIN32”编译之前,在BuildOption选项标签中保证“EnableCETargetControlSystem”,“EnableKernelDebugger”,“EnableKITL”被选定,这些选项容许内核向PB传送调试信息。单击“OK”拟定。如图3-7所示:图3-7编译6、加载驱动内核编译完毕后开始在模仿器下加载。单击Target下面选取ConfigueRemoteConnection,弹出对话框如图3-8所示。图3-8加载驱动选取Emulator–4.20,再点拟定,在Target菜单中选取Download/Initialize,就可以看到模仿器开始运营启动,一种模仿WinCE系统在窗口中显示出来,绝大多数操作都可以使用了。此时在PBDebug窗口中可以看到系统启动调试信息。其中可以很清晰看到驱动模块被加载状态,驱动运营成功七、思考题1.想一下WinCE中驱动程序架构和其她系统中有什么不同?2.WinCE中驱动程序中断解决是如何实现?实验四、WindowsCE应用程序开发一、实验目1.学习WindowsCE编程基本办法。2.学习MFC应用。二、实验内容学习在WindowsCE平台下,用EVC编写一种全屏俄罗斯方块游戏。熟悉EVC集成开发环境,理解建立WINCE程序普通办法掌握EVC下惯用开发向导用法纯熟使用远程调试工具三、预备知识1、基本VC编程知识,编写和调试应用程序基本过程。2、理解Windows程序开发流程及基于MFC应用程序开发基本知识。四、实验设备及工具硬件:PC一台P3以上(内存不不大于384MB,安装竣工具硬盘空间不得不大于600M)、ARM9实验箱(包括NETARM2410-S实验板、JTAG仿真器、各种串口线、并口线、网线、光盘等)一台。软件:PC机操作系统Win或以上,EVC4.0开发环境,WinCE420原则SDK,NETARM2410-S平台SDK,VisualC++6.00集成开发环境。五、实验原理及阐明1.ClassWizard(类向导)从广义上讲,ClassWizard与类关系和AppWizard与应用程序关系是相似。ClassWizard通过生成实现CPP文献,以及一种带有适当存根函数头文献,来协助你开始编写新类。用实际代码填充这些函数则是你责任。ClassWizard在四个区域提供协助,它可觉得如下目生成代码:从接受消息或管理控件窗口许多MFC类中一种派生出来新类。解决消息成员函数。nOLE/ActiveX办法、属性和事件触发。用于输入到对话控件中数据互换和验证函数。ClassWizard辨认和支持MFC基类,它们用某种办法与顾客进行交互。除了少数例外类(例如CRecordSet和CHttpServer)之外,基类都是由CCmdTarget派生而来,它们可以对消息作出反映,并可以管理对话框中控件。大概有50个各种MFC基类,你可以使用ClassWizard从这样类中创立一种派生类。访问ClassWizard不能从一种空项目中访问ClassWizard。项目中至少应有一种RC文献,虽然这个RC文献是空。一旦RC文献被附加到项目之中(AppWizard可以自动完毕这项工作),你就可以通过从View菜单中选取ClassWizard命令来调用ClassWizard对话了。关于ClassWizard,有两点不大明显。一方面,它服务完全是可选。你在开发自己项目过程中,如果自己乐意话,从头至尾,都可以不解决ClassWizard。另一方面,你可以使用ClassWizard向MFC项目添加新类,虽然该项目不是由AppWizard创立。ClassWizard编译项目类数据库,并将它存储在与项目同名且扩展名为CLW一种文献之中。如果你始终都是使用ClassWizard为项目创立新类,那么CLW文献可以保持最新。但是,在VisualC++中,你与ClassWizard之间并不是全有或全无关系,你可以自由地编写新类,或者从当前项目之外其她源文献中复制代码。在一种类不是以ClassWizard为来源状况下,有一种简朴办法可以更新CLW数据库。在你使用了Project菜单上AddToProject命令向项目添加新类源文献之后,请删除CLW文献,并再次调用ClassWizard。VisualC++将检测到数据库不存在了,并提供重新创立它服务。ClassWizard对话图(下图)显示了主ClassWizard对话框。之因此叫它为“主”对话,是由于ClassWizard可以在20各种不同对话中显示自己,究竟在哪一种对话中显示需取决于环境。图中对话充当着到ClassWizard主入口角色,将其命名为MFCClassWizard,以便于让你记住它所解决仅仅是MFC类。ClassWizard不能协助你创立从除了支持MFC类之外任何类中派生类;对于带有任何其她基类,你必要使用文本编辑器或Insert菜单上NewClass命令从零开始自己编写代码。图4-1MFCClassWizard对话五个选项卡具备不同用途,对于任何一种特定类,都不是完全需要这五个选项卡。下表可以协助你拟定自己需要哪个(或哪几种)选项卡,这重要取决于你想为自己类做哪些工作。MFCClassWizard对话框五个选项卡选项卡 用途MessageMaps(消息映射) 添加或删除解决消息成员函数MemberVariables(成员变量) 添加或删除附加到使用控件类上成员变量。普通地说,这些是从CDialog,CPropertyPage,CRecordView或CDaoRecordView中派生对话类Automation向支持Automation类(例如ActiveX控件类)添加属性或办法ActiveXEvents 为触发事件(普通是实现ActiveX控件类)添加支持。在开发接受触发事件容器应用程序时,不用该选项卡ClassInfo 关于项目类其她信息在ClassWizard对话中,标为MessageMaps和MemberVariables头两个选项卡将在下两节简介。Automation和ActiveXEvent选项卡讨论推迟到第8章和第9章,这两章将阐述ClassWizard如何在包括ActiveX控件项目开发中起协助作用。在此,咱们只简介MessageMaps(消息映射)选项卡。MessageMaps(消息映射)选项卡是你为自己类指定消息解决函数地方。该选项卡中两个组合框和前两个列表框是这样安排,每个控件都显示逐渐高一级控件详细资料。换句话说,控件内容取决于前面控件中选中某些。ClassName(类名)组合框列出了Project组合框中选中项目类;ObjectIDs框中显示是与ClassName框中选中类有关联标记符,Message框中显示是ObjectIDs框中当前选中某些消息和其她信息。当你在Message框中选中一条消息或虚拟函数时候,将在MFCClassWizard对话底部浮现选中项目简要阐明。如果想理解关于选中项目详细信息,可以像第一章中简介那样切换到MSDN在线协助,然后再搜索索引。按下F1键将显示关于Message框自身普通信息,而不是关于选中项目信息。如果想向选定类添加消息解决程序函数,请双击Message框中消息或虚拟函数。MemberFunctions框包具有当前类函数一种列表,在图6-2中是InitInstance和OnAppAbout。“W”标记符将OnAppAbout作为一种解决带有WM_前缀系统消息函数来标记,在本例中,是包具有ID_APP_ABOUT菜单值WM_COMMAND。“V”用来将InitInstance作为一种超越虚拟函数来标记。对于添加到类每个消息解决程序函数,ClassWizard对该类源文献做三处修改:向头文献添向函数声明。向CPP实现文献添加带有骨干代码函数定义。将代表该函数条目添加到类消息映射。2、游戏设计需求,进行需求分析:在全屏方式下进行游戏,形状不同方块组合从屏幕顶端匀速下落。当某一行被方块填满时则消去这一行,当方块堆积超过最上一行时游戏结束。3、实现原理游戏设计离不开图像图案解决。微软基本类库(mfc)封装了GDI,即“图形设备接口”,包括了各种绘图类及有关绘图函数。而MFCCDC提供了各种与绘图关于函数。运用GDI配合建立CDC对象,就可以按照程序设计者意愿在画布窗口上绘制某些图形。4、俄罗斯方块实现算法4.1俄罗斯方块玩法:老式俄罗斯方块玩法很简朴,随机产生七种形状之一方块从绘图区上部向下落,在下落过程中可以变化它们位置及旋转固定角度。方块落到绘图下方堆积起来,如果任何一行被堆满则自动消去这一行。方块不断产生,直至堆积到绘图区顶端,游戏结束。4.2相应解决算法随机产生方块可以调用rand()函数,此函数返回一种随机整数。程序中将此返回值对7求模,就可得到随机产生在0和6之间整数。每一种整数相应一种形状方块。方块自由下落可以看作是每过一定期间间隔就下移一种单位高度,这个高度是可由程序来控制。这样,咱们就可以通过定期起来完毕每次下移一种单位高度任务。设立定期器使用函数SetTimer,该函数原型为:UINTSetTimer(UINTnIDEvent,UINTnElapse,void(CALLBACKEXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD))其中回调函数不用咱们指定,稍后通过ClassWizard就可以让系统自动完毕。当咱们不想让定期再继续工作时候,可以调用函数KillTimer(intnIDEvent),nIDEvent是定期器标记。方块下落有两种状态:可以继续下落和已经究竟。如果构成方块四个小某些中任意一某些遇到了别方块或是绘图区底部,则以为方块已究竟,不能再继续下落了,如果没有,则还可再下落一种单位高度。方块下落后应当立即判断与否已到顶,如果已到顶,游戏就结束了,否则继续下一循环。如果方块已究竟部,游戏还尚未结束,就要产生下一种新方块,随机判断底部堆积方块中有无可以消去行,如有则消去,随后新产生方块继续下落。在本实验中,所有绘图任务都由myDraw()函数来执行,这样当咱们想要修改程序界面或其她与图形有关任务时候,只要将注意力集中在此函数中就可以了。六、实验环节1、新建工程,运用MFCAppWizard建立一种基于对话框应用程序。2、打开源文献资源,修改对话框,如下图4-2:图4-2(a)源文献资源图4-3(b)修改后对话框外观相应控件ID及caption:3、选取View菜单项,点击ClassWizard,浮现如下界面:图4-4ClassWizard在ClassName项中选取CBrickDlg类,添加消息解决函数,如下图:图4-5选取ClassName创立下图所示消息相应函数:图4-6函数框其中,OnCreate,OnCtlColor,OnTimer相应Windows消息,分别为WM_CREATE,WM_CTLCOLOR,WM_TIMER,OnLeft,OnRight,OnDown,OnUp相应是相应按钮,从对象ID列表框选用,余下消息解决函数清参照源代码添加5.此时,ClassWizard已经帮咱们把程序消息解决框架搭好了,剩余事情就是添加代码:为了节约篇幅,咱们在此只给出brickDlg类头文献和实现文献,别的代码,沿用系统生成即可。brickDlg类头文献://brickDlg.h:headerfile//#if!defined(AFX_BRICKDLG_H__8F782CE1_7832_4364_86DE_2A60573808AE__INCLUDED_)#defineAFX_BRICKDLG_H__8F782CE1_7832_4364_86DE_2A60573808AE__INCLUDED_#if_MSC_VER>=1000#pragmaonce#endif//_MSC_VER>=1000///////////自定义常量///////////////#defineLEFTMARGIN10#defineTOPMARGIN5#defineHIGHLIGHTCOLORRGB(0,128,128)#defineBTNSHADOWCOLORRGB(0,57,57)#defineColorOfCurrentBrickRGB(255,255,0)//方块颜色#defineclrTopLeftRGB(68,71,140)#defineSTOP1210博创科技#defineRUNNING2#definePAUSED3structBrick{intx;inty;};////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CBrickDlgdialogclassCBrickDlg:publicCDialog{//Constructionpublic:CBrickDlg(CWnd*pParent=NULL);//standardconstructor//DialogData//{{AFX_DATA(CBrickDlg)enum{IDD=IDD_BRICK_DIALOG};//NOTE:theClassWizardwilladddatamembershere//}}AFX_DATA//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CBrickDlg)public:virtualBOOLPreTranslateMessage(MSG*pMsg);protected:virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport//}}AFX_VIRTUAL///////////自定义成员/////////////////protected:///////////数据成员///////////////////COLORREFColorOfMatrixOfBricks[20][10];BOOLEraseALine,BrickAtBottom;intMatrixOfBricks[20][10];intGameState;BrickCurrentBrick[5],LastPositionOfBrick[4];intTimerInterval;//定期器间隔intLevel;intWIDTHOFBRICKS;intHEIGHTOFBRICKS;CFontStaticFont;///////////////////////////////////////////////////函数成员/////////////////////voidmyDraw(void);//绘制新图voidGenerateABrick();//启动游戏,调用myDraw()刷新voidCanEraseALine();//voidIsGameOver();intIsbottom();//intIsOutOfRect(intw);//voidRotateBrick(void);//voidRefreshBricks(void);//voidInitBricks();voidRefreshAll(void);voidPutMessage(intGameLevel);voidStop(void);voidPause(void);voidStart(void);voidExit(void);voidOnKey(UINTnChar);//解决输入信息函数控制方块运动voidCreateNumber();//获取随机数据voidDrawNextBrick();//绘制下一种方块以提示/////////////////////////////////////////Implementationprotected:HICONm_hIcon;//Generatedmessagemapfunctions//{{AFX_MSG(CBrickDlg)virtualBOOLOnInitDialog();afx_msgvoidOnGameOver();afx_msgvoidOnGameStart();afx_msgvoidOnUp();afx_msgvoidOnDown();afx_msgvoidOnLeft();afx_msgvoidOnRight();afx_msgvoidOnPause();afx_msgvoidOnTimer(UINTnIDEvent);afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);afx_msgvoidOnPaint();afx_msgHBRUSHOnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor);//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}//MicrosofteMbeddedVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.#endif//!defined(AFX_BRICKDLG_H__8F782CE1_7832_4364_86DE_2A60573808AE__INCLUDED_)下面是实现文献某些代码://brickDlg.cpp:implementationfile//#include"stdafx.h"#include"brick.h"#include"brickDlg.h"UINTnChar;intn=0;//记录分数,即消行数intNumber[2];//随机数据用于获取方块#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CBrickDlgmessagehandlersvoidCBrickDlg::OnKey(UINTnChar){{switch(nChar){caseVK_NUMPAD1://左方向if(!(IsOutOfRect(1)==2)){RefreshBricks();for(inta=0;a<4;a++)//a为循环用变量CurrentBrick[a].y--;//Y表达是横向坐标,左起为0,向左移动Y减小}break;caseVK_NUMPAD3://右方向if(!(IsOutOfRect(2)==1)){RefreshBricks();for(inta=0;a<4;a++)CurrentBrick[a].y++;//右移动Y增长}break;caseVK_NUMPAD7://下落OnTimer(1);break;caseVK_NUMPAD9://旋转RefreshBricks();RotateBrick();break;}myDraw();}}voidCBrickDlg::OnTimer(UINTnIDEvent){//TODO:Addyourmessagehandlercodehereand/orcalldefaultswitch(nIDEvent){case1:if(GameState==RUNNING){if(Isbottom())//如果未究竟{RefreshBricks();//刷新for(inti=0;i<4;i++)CurrentBrick[i].x++;//方块下降X增长}else//如果究竟了{IsGameOver();CanEraseALine();//消去一行DrawNextBrick();//绘制下一种方块以提示GenerateABrick();//生成新方块Number[0]=Number[1];CreateNumber();//获取随机数据}myDraw();}break;}CDialog::OnTimer(nIDEvent);}voidCBrickDlg::OnPaint(){CPaintDCdc(this);//devicecontextforpainting//TODO:Addyourmessagehandlercodeheredc.FillSolidRect(180,50,100,60,RGB(0,0,255));EraseALine=TRUE;myDraw();//DonotcallCDialog::OnPaint()forpaintingmessages}//////////////如下为自定义函数////////////////////////voidCBrickDlg::InitBricks(){for(inti=0;i<20;i++)for(intj=0;j<10;j++)MatrixOfBricks[i][j]=0;RefreshAll();}//旋转方块voidCBrickDlg::RotateBrick(){inti,j;//循环变量intIndexOfCenter=0;//旋转轴方块序号BrickCenterBrick;//用于存储中间方块位置BrickTempBrick[4];//用于存储当前方块位置,一旦旋转后出界,则用此恢复CenterBrick.y=0;CenterBrick.x=0;if(CurrentBrick[4].x==0)return;for(i=0;i<4;i++){TempBrick[i].x=CurrentBrick[i].x;TempBrick[i].y=CurrentBrick[i].y;}if((CurrentBrick[0].x==CurrentBrick[1].x==CurrentBrick[2].x==CurrentBrick[3].x)||(CurrentBrick[0].y==CurrentBrick[1].y==CurrentBrick[2].y==CurrentBrick[3].y)){//如果是长棒,则以第二块为轴心,否则以第一块为轴心CenterBrick.x=CurrentBrick[2].x;CenterBrick.y=CurrentBrick[2].y;IndexOfCenter=2;}else{CenterBrick.x=CurrentBrick[1].x;CenterBrick.y=CurrentBrick[1].y;IndexOfCenter=1;}for(i=0;i<4;i++){if(i!=IndexOfCenter){//逆时针旋转CurrentBrick[i].x=TempBrick[i].y-CenterBrick.y+CenterBrick.x;CurrentBrick[i].y=CenterBrick.x-TempBrick[i].x+CenterBrick.y;if((MatrixOfBricks[CurrentBrick[i].x][CurrentBrick[i].y]==2)||//如果碰底(CurrentBrick[i].y>9)||//如果右出界(CurrentBrick[i].y<0)||//如果左出界(CurrentBrick[i].x>19)||//如果下出界(CurrentBrick[i].x<0))//如果上出界{//如果已出界,则不能旋转,用备份方块还原for(j=0;j<4;j++){CurrentBrick[j].x=TempBrick[j].x;CurrentBrick[j].y=TempBrick[j].y;}break;}}}}//判断与否究竟intCBrickDlg::Isbottom(){BrickAtBottom=TRUE;for(inta=0;a<4;a++){if(CurrentBrick[a].x==19)//如果当前方块已经到了最底端,X是纵向坐标{for(intc=0;c<4;c++)MatrixOfBricks[CurrentBrick[c].x][CurrentBrick[c].y]=2;//2表达不再自由下落return0;//究竟了}if(MatrixOfBricks[CurrentBrick[a].x+1][CurrentBrick[a].y]==2)//如果当前方块遇到了别方块{for(intc=0;c<4;c++)MatrixOfBricks[CurrentBrick[c].x][CurrentBrick[c].y]=2;//2表达不再自由下落return0;//究竟了}}BrickAtBottom=FALSE;return1;}//消行,判断与否游戏结束voidCBrickDlg::CanEraseALine(){intflagover=0;//inti=1;//用于对级别进行判断TCHARm_strValue[200];for(inta=19;a>=0;a--){flagover=0;//////////////////////////////////////判断与否有一行可消去/////////////////////////////////////////for(intb=0;b<10;b++){if(MatrixOfBricks[a][b]==2){flagover++;}}//////如果可消去////////////////if(flagover==10){EraseALine=TRUE;for(intt=a;t>0;t--)//方块下移{for(b=0;b<10;b++){MatrixOfBricks[t][b]=MatrixOfBricks[t-1][b];//标记移位MatrixOfBricks[t-1][b]=0;//本位置置空}}n++;//如果可以消一行,则n值增长1a=a+1;//重新判断这一行}}switch(n){case5:Level=1;break;case10:Level=2;break;case15:Level=3;break;case20:Level=4;break;case25:Level=5;break;case30:Level=6;break;case35:Level=7;break;case40:Level=8;break;case45:Level=9;break;}//对级别进行计数判断TimerInterval=5000/20-Level*25;//重新设定期间间隔以适合不同级别SetTimer(1,TimerInterval,NULL);//重新定义记时器_itow(n*100,m_strValue,10);SetDlgItemText(IDC_STATIC_NUM,m_strValue);//显示分数_itow(CBrickDlg::Level,m_strValue,10);SetDlgItemText(IDC_LEVEL,

温馨提示

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

评论

0/150

提交评论