




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
—预装WINCE使用说 如何启动 如何浏览网 触摸屏校 在WINCE和桌面系统之间建立连 安装驱 使用微软ActiveSync同步传输工具进行通讯连 如何动态修改液晶分辨 应用程序的运 WINCE开 安装WINDOWSCE.NET开发环 安装基于OK2440的BSP 更新开发环境 新建工 内核制 添加鼠标键盘支 添加U盘支 添 表保存功 添 浏览 添加MP3MP4支 建立应用程序开发环 导出 安装eMbeddedVisualC++ 安装 安装 WINCE应用程序开发示 附录一CE下物理地址的方 附录二WINDOWSCE.NET高级内存管 52系统内存映 WINDOWSCE应用程序内存映 限制因 分配大型内存 加载问 DLL加 组合 将DLL代码转移到应用程 定义DLL加载顺 附录三WINDOWSCE.NET中的中断体系结 概 中断体系结 OALISR处 可安装的 IST中断处 中断初始 IST-中断服务例 导致延迟的因 ISR延 IST延 小 附录四如何在WINDOWSCE5.0中开发和测试设备驱动程 第一部分:建立设备驱动程 第二部分:测试流驱动程序测试代 第三部分:检验驱动程 第四部分:使用WindowsCETest 第五部分:创建自定义CETK测 第六部分:确定谁拥有流驱动程 小 附录五WINDOWSCE.NET中的文件系统体系结 —Wince设备操作系统。它是精简的Windows95。WindowsCE的图形用户界面相当出色,其中CE中的C(Compact)、消费(Consumer)、通信能力(Connectivit)和伴侣(Companion);E代表电子产品(Electronics)。Windows95/98、WindowsNTWindowsCE操作系统,其操作界面虽来源于Windows95/98WindowsCE是基于Win32API重新开发的、新型的信息设备平台。WindowsCEWin32WindowsCE不仅继承了传统的Windows图形界WindowsCE平台上可以使用Windows95/98的编程工具(如VisualBasic、Visual++等)、使用同样的函数、使用同样的界面风格,使绝大多数的应用软件只需简单的修改和移植就可以在WindowsCE平台上继续使用。 (objectstore)技术,包括文件系统、 PC、内部网以及Internet的连接,还提供与 gx/NT的最佳集成和通信。WindowsCEAPIWin32API1500Win32APIAPI,足可以编写任何复杂的应用程序。当然,在WindowsCE系统中,所提供的API也可以随具体应用的需求而定。在掌上型电脑中WindowsCE包含如下一些重要组件:PocketOutlook及其组件、语音机、移动频道、拨号、世界时钟、计算器、多种输入法、GBK字符集、中文TTF字库、英汉双向词典、袖珍测览器、电子邮件、PocketOffice、系统设置、WindowsCEServices软件。另外可通过修改参数1的值来改变启动延时:如何使用SD使用WindowsMediaPlayerMP3和。置框进行网络设置,然后就可以用IE1.51.5第一次使用触摸屏的时候需要先校准一下,因为预装的winceWINCE可以使用微软公司提供的一些工具,并在进行了一些必要的设置后,就可以在安装了WINCE操作系统的移动设备和windows桌面系统之间进行通讯连接,从而可以实现文件上传,调试等功能。WINCEUSBUSBDEIVCEPCUSB如果以前没有安装WINCE动,这时插USB线后,在计算机端会出现“发现新硬件”的提示,这时就需要安装驱动了,驱动的位置在wince的BSP包里(WINCE500/platform/ok2440/DRIVERS/USB/FUNCTION),安装好USB驱动,就可以进行下面注意:该驱动和2.1.1章节所说的驱动是不一样的。需要首先安装前者,wince成功启动后再安装后者ActiveSyncActiveSyncFile|ConnectionSettingsActiveSyncWINCEUSBOK2440USBUSBOK2440wince【网络和拨号连接】-》点击【新建连接】,在“新建连接”设 框中,选择连接类型为“直接连接改改名输入“我的usb连接”,点击“下一步”,在出现的“选择设备”下拉列表中选择“S3C2440WINCEFile|ExploreWINCE 在弹出 框中添加一个新设备,设备名可以取为“OK2440”,如下一步使用到PB程序的“Tools”菜单项里面的许多工具。例如点击PB的Tools|Remotezoom-in菜单,以运行缩放工具,在弹出 框中添加一个新设备,设备名可以取为“OK2440”,如下在ActiveSync成功连接后,点击PB的Tools|RemoteRegistryEditor菜单,以运行表首先在弹出的选择设 框中选择我们上一节新建的设备,点击‘OK’接下来就可以查看或编辑wince 针对这个问题,OK2440为您解决后顾之忧。该开发板同时支持两种分辨率320*240640*480,操作步界面选择5来启动wince。当起来后,液晶会显示大家都很熟悉的桌面,类似windows2ScreenControl的快捷方式,双击它会弹出相应的,这时你可以用辨率的LCD,而不改了高分辨率,这时候只有换块大屏或是重装内核才能修改回来EVCEVB编译了自己编写的WINCE用程序,并点击在“tools”菜单的“Configureplatform也可以利用sync工具的explorer将编译好的程序上传到OK2440上运行。二Wince开发目标硬件平台的工具――平台建立器(PlatformBu目标硬件平台的工具――平台建立器(PlatformBuilde5.0WINCE5.0PlatformBuilder5.0。首先运行SETUP.EXE,输入串号。在出现安装选项时选择ARMV4,ARMV4I OK2440的BSPPlatformBuilder5.0PlatformBuilder,并对它进WINCE500的安装路径下的PLATFORM文件夹中去(笔者这里为E:\WINCE500\PLATFORM\),并解压, 下出现一个新的文件夹OK2440(E:\WINCE500\PLATFORM\OK2440),WINCE500的BSP工作点击“Import” PlatformBuilder点击“Import” 导入之后,在PB 更新开发环境更新开发环境 注:若要wince支持.net2.0,必须安装该更新程序。接着出现“NewPlatformWizardStep2”框,在nameOK2440(可输入其他名字)“Next”按钮,如下图:“NewPlatformWizardStep3”框,您可看到“OK2440:ARMV4I”BSP出现“NewPlatformWizard–Step4” 框,在“Availabledesigntemplates”列表中选择“MobileHandheld”,点击“Next”按扭,如下图:接着出现“NewPlatformWizard–Step6”框,选择您需要的“Networking&Communications”,再点击“Next”按钮,您将看到“CompletingtheNewPlatformWizard” PBPlatform|SettingPlatformSettings”设置框的“BuildOptions”页,配置如下: AddtoOSDesign即可。添加U添加SD 添加MP3MP4编译生成WindowsCEBuildOS|Sysgen编编译完成后,就生成了OK2440的二进制image:“nk.bin”和“nk.nb0”,一般而言,这两个文件导出启动PlatformBuilder5.0,打开已创建好的OK2440从“Platform”菜单上,选择“SDK”,然后选择 SDK...”命令,出现如下图所示界面单击“下一步”按钮,在“Product单击“下一步”按钮,在“ProductCompaceFramework”的所有支持。单击“下一步”,单击“Finish单击“下一步”,单击“Finish”按钮完成SDK选择菜单“Platform-->SDK-->BuildSDK始创SDK。成功后,创建的SDK为:E:\WINCE500\PBWorkspaces\OK2440\SDK文件夹下的OK2440_SDK.msi文件。这是一个标准的Windowsinstaller安装文件,双击鼠标即可安装。安装eMbeddedVisualCeMbeddedVisualC++简称eVC,是用于创建WindowsCE应用程序的一个集成开发环境,目前它的最新版本为eMbeddedVisualC++4.0+ServicePack4(从VisualStudio.NET2005开始,微软不再更新eMbeddedVisualC++,所有WindowsCE的应用程序开发都将在VisualStudio可开发的WindowsCEeMbeddedVisualC++WindowsCEeMbeddedVisualC++WindowsCE.NETeMbeddedVisualC++4.0+WindowsCE.NETeMbeddedVisualC++4.0+WindowsCE.NETeMbeddedVisualC++4.0+WindowsCE安装安装安装安装建立好应用程序开发环境之后,打开EVC4.0,点击filenew新建一个基于MFC的应用程序。其改为点击OK点击“tools”菜单的“Configureplatformmanager”菜单项进行平台管理器的配置: 附录一CE下物理地址的方嵌入式设备与桌面PC的一个显著不同是它的应用程序中通常需要直接某一段物理内存,这在驱址。因此,与桌面版本Windows相比,WindowsCE提供了相对简单的物理内存方式。无论是驱动程序还是应用程序都可以通过API某一段物理内存。WindowsCEPHYSICAL_ADDRESSWindowsCEceddk.h中定义了PHYSICAL_ADDRESS,它其实是LARGE_INTEGER类型,其定义如下://in//inwinnt.hDWORDLo LONGLONG}可见,WindowsCE64个Bit来代表物理地址,对于大多数32位的CPU而言,只需要把它的如果要直接某一个地址的物理内存,WindowsCE提供了VirtualAlloc()VirtualCopy()函数,VirtualAlloc负责在虚拟内存空间内保留一段虚拟内存,而VirtualCopy负责把一段物理内存和虚拟内存绑定,这样,最终对物理内存的还是通过虚拟地址进行。它们的如下://LPVOIDLPVOIDlpAddressDWORDdwSizeDWORDflAllocationType,//申请类型,分为ReserveCommitDWORDflProtect//权限//BOOLLPVOIDlpvDest,//虚拟内存的目标地址LPVOIDlpvSrc,//物理内存地址DWORDcbSize,//要绑定的大小DWORDfdwProtect// VirtualAlloc对虚拟内存的申请分为两步,保留MEM_RESERVE和提交 MIT。其中MEM_RESERVE只是在进程的虚拟地址空间内保留一段,并不分配实际的物理内存,因此保留的虚拟内存并不能被应用程序直接使用。MIT阶段才真正的为虚拟内存分配物理内存。下面的代码显示了如何使用VirtualAlloc和VirtualCopy来物理内存。因为VirtualCopy负责把一段物理内存和虚拟内存绑定,所以VirtualAlloc的时候只需要对内存保留,没有必要提交。FpDriverGlobals=VirtualAlloc(0,if(FpDriverGlobals==NULL)}else{(PAGE_READWRITE|PAGE_NOCACHE)))}}CEDDK还提供了函数MmMapIoSpace用来把一段物理内存直接映射到虚拟内存。此函数的如下PVOIDPVOIDPHYSICAL_ADDRESSPhysicalAddress,//起始物理地ULONGNumberOfBytesBOOLEANCacheEnable//其实,MmMapIoSpace函数内部也是调用VirtualAlloc和VirtualCopy函数来实现物理地址到虚拟地址的映射的。 函数的原代码是公开的,我们可以 得到。MmMapIoSpace的实现我们也可以看出VirtualAlloc和VirtualCopy的用法PVOIDMmMapIoSpaceINULONGNumberOfBytes,INBOOLEAN){ULONGSourceSize;BOOLbSuccess;SourceSize=NumberOfBytes+(PhysicalAddress.Lort&(PAGE_SIZE-if(pVirtualAddress!=NULL){bSuccess=PAGE_PHYSICAL|PAGE_READWRITE|(CacheEnable?0:if(bSuccess) rt&(PAGE_SIZE-}elsepVirtualAddress=NULL;}}return}此外,WindowsCE还供了AllocPhysMem函数和FreePhysMem函数,用来申请和释放一段连续的物理内址。这对于DMA设备尤为有用。在这里就不详细介绍了,读者可以参考WindowsCE的联机文档。WindowsCE.NET_WindowsCE的优点之一是它的Win32_应用程序编程接口(API)支持。无数Win32APIMFCWindowsCE。WindowsCEAPIAPIWindowsCEWindowsXPWindowsCEWindowsCEWin32内存管理是WindowsCEWindowsXP之间在实现方面存在很明显差异的地方之一。虽然WindowsCE支持几乎每个Win32内存管理函数(除了我们不赞成对它使用全局堆函数),但是这些内存管理API的实现是完WindowsCEWindowsWindowsCEWindowsXPWindowsCE324GBWindowsXP2GB2GB1.WindowsXP,WindowsCE2WindowsCE2GB为很多区域。该区域的大多数(几乎一半空间)(LargeMemoryArea)。该区域用来分在大型内存区域的下面是另一个大型区域,本文称为保留区域一个4MB4B2MB2.WindowsCEWindowsCE64MBWindowsCE3WindowsXP0x10000在为代码保留的区域上面,页是为只读和读/写静态数据区域保留的。此外,还为本地堆和应用程序中运行的RAMRAM(也叫作基于RAM的DLL)是指那些从对象区加载的DLL、从ROM解压缩的DLL或从外部文件系统(例如CompactFlash卡)加载的DLL。应用程序虚拟内存空间中靠上位置的32MB仅用于XIPDLL。3WindowsCE.NETVirtualAllocAPIWindowsCERAM32MBXIPDLL32MB任何基于RAM的DLL都必须能够放进应用程序的32MB内存空间中。这个32MB限制“框”不是WindowsCE程序员所的很大问题,因为它是一个可被克服的。要了解这个看似很大的内存空间有些什么限制性,必须了解VirtualAllocAPI的操作原理。VirtualAlloc是 Win32操作系统中最基础的内存分配调用。它在页级别分配内存;页是可以被CPU分配或释放的最小的内存单位。WindowsCE.NETCPU的页大小是1024或4096字节,这取决于CPU。最广泛使用的是4KB页大小。显示了VirtualAlloc函数的原型。LPVOIDVirtualAlloc(LPVOIDlpAddress,DWORDDWORDflProtect);VirtualAlloc的第一个参数是要分配的内存区域的虚拟地址。使用VirtualAlloc提交先前保留的内存块lpAddressNULL,flAllocationType参数指定分配的类型。可以指定以下标志的组合: MIT和MEM_RESERVE。 MIT标志进行了另一个VirtualAlloc调用为止。 唯一用于WindowsCE并且很好用,但它不是本文的。因此,要使用VirtualAlloc来分配可使用的RAM,应用程序必须调用VirtualAlloc两次,一次保留内存空MEM_RESERVE和 MIT标志。组合保留和提交标志方式所使用的代码更少,并且更快、更简单。该技术通常用在WindowsXP应用程序中,但用在WindowsCE应用程序中不是很好。以下代码片段演示了存在的问题。INTPVOIDfor(i=0;i<512;i++)pMem[i]=VirtualAlloc(0,PAGE_SIZE,MEM_RESERVE| }5121WindowsCE在任何Win32操作系统(包括WindowsCE.NET)上,当一个虚拟内存空间区域被保留时,它会将保留区域64KB51264KBWindowsCE应用程序的问题是它们必须位于32MB虚拟内存空间的范围在整个应用程序内存空间中该空间的大小只有通常,在对VirtualAlloc进行大约470次调用之后上面的代码片段将失败。上述问题的解决方案是首先保留足够用于整个分配的较大区域,然后在需要时提 RAM,如下所示INTPVOIDpBase,pBase=VirtualAlloc(0,512*PAGE_SIZE,MEM_RESERVE,for(i=0;i<512;i++)pMem[i]=VirtualAlloc(pBase+(i*PAGE_SIZE),MIT,}WindowsCE512WindowsCE.NET32MB32MB8、1632MbRAM才能分配该内存?回答是应用首先用在WindowsCE.NET早期版本中针对驱动程序的一个修复程序。有了WindowsCE.NETVirtualAlloc2MB将不会保留在32MB的限制大小中。该内存块将保留在大型内存区域(LargeMemoryArea)域位于全局内存空间中,正好在2GB系统保留空间的下面。VirtualAlloc32MB64MBPVOIDptrVirt,ptrVirt=VirtualAlloc(0,1024*1024*64,MEM_RESERVE,if(!ptrVirt)returnptrMem=VirtualAlloc MIT,if(!ptrMem)VirtualFree(ptr,0,MEM_RELEASE);return0;}returnAPI所具有的一个特性。这就是您可以创建大型稀疏数组,而不会消RAM。在上面的代码中,64MBRAMRAM第二次调用VirtualAlloc以提交页时使用的一个页(4096字节)。目前,有很多在PocketPC2002WindowsCE程序员。有一个重要问题会影响PocketPC2002程序员,这个问题与应用程序加载DLL有关,尽管对WindowsCE.NET内存体系结构所作的更改修复了这个问WindowsCE.NETWindowsCE3.0WindowsCE如何加载和管理DLL之间存在的一个主要差异。WindowsCE.NET的新功能之一是将应用程序的虚拟地址空间从WindowsCE早期版本的32MB扩展到64MBXIPDLL32MBWindowsCE3.0。因此,运行在基于WindowsCE3.0XIPDLL32MB4WindowsCE3.04WindowsCE3.04WindowsCE3.0PocketPC2002WindowsCE3.0DLLXIPDLLWindowsCEWindowsCENET32MBWindowsCEDLLWindowsCENETXIPDLL32MB搜索技术确保了将系统中的每个DLL加载在唯一、非的地址中。中。通过用唯一的地址加载每个不同的DLL,内核可以确保如果应用程序想加载由另一个进程先前加载的DLLDLLDLL5DLLDLLA2DLLC,后者位于比进1DLLBDLLACDLLADLLD。注意,在每个进程中,相同的DLL加载在相同的地址中,而每个不同的DLL则加载在唯一的地址中。5.DLL2DLLC(6)3.exe2DLLC3DLL。很显然,如果3DLL,它很可能遇到麻烦。该示例有点故意设计的成分,因为DLLC必须具有难以置信的大小,或者进程2必须加载大量DLL,之后该问题才会自然发生。6DLL2DLLXIPXIPDLLOEMROM时,每个现场执行DLL都将被定址在一个唯一地址上。以这种方式,所有XIPDLL就能在相互不发生的XIP,DLLROM址空间。XIPDLL在被进程加载时不能再定址到另一个地址,因为更改基址将涉及修改只读代码。内核在为非XIPDLL查找可用的虚拟地址时,它会从最低定址XIPDLL的下面开始搜索可用的虚拟地址。这不是应用程序已加载的最低定址XIPDLL,而是整个系统中的最低定址XIPDLL,无论它是否是由任何应用程DLLPocketPC2002WindowsCE.NETDLLPocketPC2002WindowsCENETWindowsCE3.0多个ROM。该功能允许在系统中使用多个ROM,即使它们没有连续的物理地址。,DLLXIPDLLDLL的任何其他DLL发生。XIPDLLXIPXIP不会,必须将第二个ROMDLLROMDLL用了其他ROM,则这些XIP区域中的DLL还必须定址到比前一个ROM更低的地址。由于其他原因,使用多个ROM镜像很容易。如果OEM或 想更新WindowsCE镜像的一部分,它们可以为具体ROM发出更新,而不必更新整个系统。为了保证一个ROM的更新不需要有对另一个ROM的更改,鼓励不要将定址于较低镜像中的DLL定址到前一个镜像中最低DLL的地址,而应当定址在比它更DLLDLL负责PocketPC2002(基于WindowsCE3.0)的 大多数PocketPC实现都有五个或个XIP区域。问题是区域之间的空隙太大。PocketPC2002镜像中的最低定址XIPDLL通常定址在0x以下。因为WindowsCE将基于RAM的DLL放在最低XIPDLL的下面,所以可供基于RAM的DLL、应用程序代码、它的堆和堆栈使用的空间没有限制在32MB虚拟地址空间的范围内,而是在最低XIPDLL下面的空间中(小于16MB)。7PocketPC2002XIPDLLXIPPocketPC2002意基于RAM的DLL的加载;A、B、C和D位于虚拟地址空间中低很多的位置。7PocketPC2002DLLXIPDLL数据库引擎被实现为DLL,而它通常很大。在上面的示例中,数据库DLL是制造麻烦的DLLCPocketPC200216MB,RAMDLL,这使得很多开发人员发现他们的应用程序将由于缺少空间而无法运行—不是缺少RAM,而是虚拟内存空间。PocketPC2002DLLDLLDLLDLL64KB4DLL20KB,则DLL使用的总计内存空间是256KB。通过组合四个DLL,所得到的大型DLL将仅消耗64KB虚拟内60KB64KBDLL(但不超过)64KBDLLDLLDLLDLL加载问题。DLLPocketPC2002DLLDLL32MB虚拟空间中。但是,这里的关键是要使某些代码成为不需要大型的、基于RAMDLL的大型应用程序,而使其他代码成为加载和使用基RAMDLLDLLDLLDLL,并DLLDLLDLL些DLL的位置,从而冲击其他应用程序。DLL,DLL制执行DLL加载顺序的问一个方式是对应用程序套件中不同进程的启动顺序进行排但这有时会有问题。另一个定义DLL加载顺序的方式是编写一个运行于主要应用程序之前的小型应用程序,让它通过重复调用Win32LoadLibraryRAMDLL。DLLCreateProcessCreateProcessDLL最后全部都要由其他进程来加载。PocketPC2002DLLPocketPC发PocketPC2002产品的开发人员来说,及时解决问题是关键的。WindowsCEWindowsCEDLLPocketPC2002PocketPC解决了该问题,WindowsCE.NET(OEMOEM(OAL)(ISR)处理;提供了可安装ISR(OEMOEM(OAL)(ISR)处理;提供了可安装ISRWindowsCE.NET中断体系结构的第一步是定义中断过程中硬件、内核、OAL态。次低层是中断服务过程中的内核交互。OAL描述了主板支持软件包(BSP)的职责。最顶层阐述了WindowsCE.NET拥有共享中断的新能力。ISR与硬件交互,禁用所有处理器上的所有具有相同和较低优先级的中断(ARMStrongARM体系结构除外)。然后,内核推进到已为该特定中断的OALISR。此后,OALISR既可以直接处理NKCallIntChainISRISRISR随后执行任意工作,并且为该设备返回名为SYSINTR的映射中断。如果该ISR确定其相关设备没有导致该中该ISR将返回SYSINTR_CHAIN,这会使NKCalIntChain()遍历ISR列表以到达链中的下一个中断。ISR按照它们的安装顺序调用(它们在安装时会在调用列表上创建一个优先级)。ISRISR中断不与设备的任何已ISR关联。内核启用所有其他中断中断与已知的已ISR和设备关联OSSYSINTRISR完成,内核将重新启用处理器上除已识别的中断之外的所有中断。然后,内核将通知与SYSINTR值关联的事件。IST将能够运行(假设它是准备好运行的最高优先级线程)。IST将与相关设备通讯,并从完成它的中断交互的设备中所有必要的数据。然后,IST用关联的SYSINTR值SYSINTRInterruptDone时,将重新启用指定的中断。只有从这时开始,才能接这只是对WindowsCE.NET内部活动的中断序列的一个粗略介绍。现在,详细研究上述每个组OALISROALISRX86ISRILTiming支持已被删除。X86ISRWindowsCE的平台的代表。它演示了能够处理系统中所有中断的单个ISR。ISRISRSYSINTR号。ISRPICGetCurrentInterrupt(PIC)更新OSCurMSecISRNKCallIntrChain 映射当前硬件中断(OEMTranslateIRQ)OEMInitOEMTranslateIRQSYINTRPICISRSYSINTR_NOP—ISRSYSINTR_RESCHEDSYSINTRISRSYSINTR_RTC_ALARMULONG{ULONGULONGulRet=UCHARucCurrentInterrupt=if(ucCurrentInterrupt==INTR_TIMER0)CurMSec+=CurTicks.QuadPart+=if((int)(CurMSec-dwReschedTime)>=ulRet=}//Checkifarebootwasif{}}elseif(ucCurrentInterrupt=={UCHAR//ChecktoseeifthiswasanalarminterruptcStatusC=CMOS_Read(RTC_STATUS_C);if((cStatusC&(RTC_SRC_IRQ))==(RTC_SRC_IRQ))ulRet=SYSINTR_RTC_ALARM;}elseif(ucCurrentInterrupt<=INTR_UM)//WehaveaphysicalinterruptID,returna//CallinterruptchaintoseeifanyinstalledISRshandle////ulRet=if(ulRet==SYSINTR_CHAIN)ulRet=OEMTranslateIrq(ucCurrentInterrupt);if(ulRet!=-1)ulRet=}elsePICEnableInterrupt(ucCurrentInterrupt,}}if(ucCurrentInterrupt>7||ucCurrentInterrupt==-2)asmmoval,;Nonspecificout0A0h,}}asmmoval,020h ;NonspecificEOIout020h,al}return}ISROALOEMInitHookInterruptISR将返回适当的SYSINTR值。ISTISROALOEMInitHookInterrupt3.0OALISR的那一刻,所有具有较高优先级的中就像ISR执行时间一样,中断被关闭的这一时间将增加平台的情形延迟。ISRSYSINTRIST醒来。处理驱动程序或应用程序内部代码的IST中断负责结束中断交互。ISRWindowsCENET为嵌入式空间带来的开放性而创建的。OEM再也不必完必须说服该OEM将ISR添加到该平台。ISRLoadIntChainHandlerISRDLLISRSYSINTR_OALISRLoadIntChainHandler函数将ISR动态库(DLL)加载到内核的地址空间中。这意味着代码不能DLLEntryIOControl—KernelLibIOControlISTISRHandler—LPVOID){ifLPVOID){if(dwReason==DLL_PROCESS_ATTACH)if(dwReason==DLL_PROCESS_DETACH)return}//Thecompilergeneratesacalltomemcpy()forassignmentsof//SincethislibraryisnotlinkedtotheCRT,defineourowncopyvoidInfoCopy(PVOIDdst,PVOIDsrc,DWORDsize{while(size--)*((PBYTE)dst)++=}}BOOLIOControl( LPVOIDpInBuf, LPVOIDpOutBuf, LPDWORDpBytesReturned){switch(IoControlCode)case////YourI/OCodereturnTRUE;//Invalidreturn}return} ISRHandler(DWORDInstanceIndex{BYTEValue=READ_PORT_UCHAR((PUCHAR)IntrAddress//Ifinterruptbitset,returncorrespondingSYSINTRif(Value&0x01){return}{return}}ISR处理程序代码使用端口I/O调用来检查设备的状态。您的方案可能要求复杂得多的询问。如果该设备不是中断源,则返回值SYSINTR_CHAIN回值告诉NKChainIntr函数该设备不是中断源ISRISRSYSINTRNKChainIntr将立即返回并且不调用列ISRISR被首先加载到该列表中(或具有该首先安装链中具有最高优先级的可安装ISR。IST其次,IST必须等待中断事件以响应内核中的中断。ISTISTIROInterruptInitializeIRQ ISTInterruptInitialize失败,因为该事件已经处于被等VoidSetupInterrupt(void{//Createang_hevInterrupt=CreateEvent(NULL,FALSE,FALSE,NULL);if(g_hevInterrupt==NULL){}//HavetheOALTranslatethe}//HavetheOALTranslatetheIRQtoasystem=KernelIoControl(sizeof(dwIrq),sizeof(g_dwSysIntNULL//Createathreadthatwaitsforg_fRun==CreateThread(NULL,////NoStackThreadIST,//Interrupt//CREATE_SUSPENDED,//CreateSuspended&dwThreadID//ThreadId//Setthethreadpriority–arbitrarilym_nISTPriority=if(!CeSetThreadPriority(g_htIST,m_nISTPriority{RETAIG(1,(TEXT("DEMO:FailedsettingThreadPriority.\r\n")));}////Initializetheif(!InterruptInitialize(g_dwSysInt,g_hevInterrupt,NULL,0){ G(1,(TEXT("DEMO:InterruptInitializefailed!!!\r\n")));}//GetthethreadResumeThread(g_htIST}InterruptInitializeSYSINTRISTISTIST二OS三执行任何必要的板级中断处理以完成中断。在该示例中,确认该中断四五CELOGDATAKernelTracker六g_fPRRunningg_hevPRStart七七InterruptDone() InterruptDone之前,OSIRQ八DWORDWINAPIThreadIST(LPVOIDlpvParam{DWORDdwStatus;BOOLfState=TRUE;//Alwayschectherunningwhile(g_fRun{dwStatus=WaitForSingleObject(g_hevInterrupt,//Checktoseeifweareif(!g_fRun)return//Makesurewehavetheif(dwStatus==WAIT_OBJECT_0{//Doallinterruptprocessingtocompletethe//withtheboardsowecanreceiveanotherif(!(READ_REGISTER_ULONG(g_pBoardRegister)&{RETAIG(1,(TEXT("DEMO:g_dwInterruptCount}//Finish//FinishtheInterruptDone(g_dwSysInt}}return}ISTISTInterruptDoneISTISTFIFOWindowsCENET中的中断体系结构示意图中,可以了解硬件、内核、OAL与驱动程序/应用程序线程之间的交互。已经提供了多种工具(包括ILTiming、CEBench和KernelWindowsCENETISRIST延迟的因素,有助于ISR正如您在本文前面的中断体系结构示意图中可以看到的,ISROALISR首次执行之间的时间。因为当中断被关闭时,中断不会在处理器中异常,所以第一个导致延迟的因素是符串移动指令,则会锁定中断,从而造成第二个延迟源,即总线锁定处理器的时间量。第三个因素是OALISRISR延迟的因素ISROALISRIST本文前面的体系结构示意图中显示,IST延迟是从中断发生到执行IST中的第一行代码之间的时间量。这与WindowsCE.NET中的 工具将IST延迟定义为从OALISR执行结束到IST开始之间的时间。因为标准的ISR花费的时间很少,您需要将ISR延迟和度量工具所得到的IST延迟加起来,才能获得“中断体系结构示意图”中所定义的IST延迟。导致IST延迟的第一个因素是本文前面定义的ISR延迟。第二个因素是ISR执行时间。根据共享中断 WindowsCE中的内核函数(如计划程序)KCALLKCALL执行期间,将设置一个软ISROSIST的KCALLIST延迟的第三个因素。最后,内核必须调度IST。这一上下文切换是导致延迟的最后一个因素。总之,导致IST延迟的因素包括:ISROALISROSKCALLISTWindowsCEWindowsCEOSWindowsCENETWindowsCENETCE.NET中的中断结构定义完善且易于理解。简而言之,“它不是魔术!”WindowsCE5.0中开发和测试设备例如,串行设备是用UniversalAsynchronousReceiver/Transmitter(UART)实现的还是用field-programmablegatearray(FPGA)WindowsAPI),他们不需要知道物理硬件的COMxCreateFile((xCOM11),WriteFile(CloseHandle((也不管您运行的是哪个Windows操作系统),API都会以同样的顺序执行。相同的情况也适用于其他API:如果您希望在显示表面画一条线,那么您只需调用PolyLine()、处调用的API将返回显示表面的维数、颜色深度等等。APIAPITabletPC1024×7681600×1200的分辨率运行,公开的任何接口。通常,父进程通过调用LoadLibrary(LoadDriver(LoadDriverDLLDLL“pagedout”DLLAPIGetProcAddress(DLLhInstance。如果函数存在,调用返回该函数指针;如果没有从DLL公开该函数,则返回NULL。从设备中字节流。因此,面使用的串行端口示例中,您可能希望从您的驱动程序公开如下函数集:和DeInit。您可以将现有的操作系统映像用于模拟器平台(BasicLabMyPlatform)。然后,您就可以将DLL/驱动程序项目添加到该平台了。 使用File菜单上的PlatformBuilderNewProjectorFile命令创建一个 WindowsCEDLL。创建用于公开函数或资源的DLL与创建用作驱动程序的DLL之间没有什么不同;唯一的不同之处在于DLL公开哪些函数,以及如何在平台上 或使用DLL。此外,一种创建应用程序的方法是,首先创建包含一组语言字符串、框和资源的基本应DLL,其中每个都包含针对特定区域设置的框、字符串和资源。然后,应PlatformBuilderMyPlatformFileNewProjectorFileWCEDynamic-LinkLibrary,给它一个合适的名称(例如,StreamDrv)OK,如下图55AsimpleWindowsCEDLLproject您将使用WindowsCEStreamDriverWizard创建您的主干流驱动程序。路径。或者使用“browse”按钮定位到PlatformBuilder安装中的PBWorkspaces 同的名称,以确保改写在PlatformBuilder中创建的原始文件。在编写完驱动程序之后,您需要为开发人员提供一种测试它的方法。WindowsCE附带了WindowsCETestKit(CETK),它提供了用于各种驱动程序类型的驱动程序测试,包含网络连接、蓝牙、串行端口以TuxTuxDLLTuxPlatformBuilderFileNewProjectorFileWCETUXDynamic-LinkLibraryTuxTestWorkspaceProject,然后单击OK,如下图所示(实际上,您可以选择任意一个项目类型;对于本文,单击WorkspaceReleaseTypeCETK,如下图所示。该选项关闭了某些二进制的优化,以提高调试工作效率。单击Finish。66View|FileView,Projectstuxft.htuxDLLTuxStreamTest.cppDLLMainProcTux.exeTuxDLLCodeClipTux_Custom_Test|TuxCodeCodeClipTestProc为StreamDrv的驱动程序。您需要修改源代码以加载您的StreamDrv.dll驱动程序。Test.cppLoadLibraryDemo.dll称修改为StreamDrv.dll。在PlatformBuilder文件视图中,右键单击TuxTest项目,然后单击BuildCurrentProject。 中添加WindowsCETestKit组件。在DeviceDrivers下,找到该 中WindowsCETestKit组件的位置,然后选择AddtheWindowsCETestKit,将该组件添加到您的平台中。添加到buildrelease文件夹中。您可以从Platform添加到buildrelease文件夹中。您可以从PlatformClientsidePlatformBuilderBuildOS|Sysgen51FileView,StreamDrvSourcefiles3DllMainswitch4F95Target|Attach您会看到以下调试输出,断点将启用。注意,在加载操作系统的用户接口(UI)之前,这早就发生了PID:23f767b6TID:23f767e60x83fa6800:>>>Loadingmodulestreamdrv.dllataddress0x01ED0000-0x01ED5000LoadedsymbolsforswitchF9使用系统信息(RemoteSystemInformation)工具检验驱动程法是查看从该驱动程序公开的函数。WindowsCE为 令行工具,可以用于检验导入应用程序或模块的内容,或者从DLL(或驱动程序)导1PlatformBuilderBuildOS|OpenReleaseDirectorybuildreleaseCommandPrompt2dumpbinexports的(通过该项目的.def文件)。3ExitCommandPromptLIBRARYPlatformBuilderTools|RemoteSystemInformation22WindowsCEDefaultPlatform|DefaultDevice,OK,PlatformBuilderTargetControlgimod)View|DebugWindows|andSymbolsWindowsCETestWindowsCETestKit包含设备端组件和桌面组件。设备端组件叫做Clientside.exe,通过从 作区中并没有将任何文件添加到最终操作系统映像中,但它却将应用程序到buildrelease文件夹工具)的原因在于,CETK(零售)设备(PocketPC)1WindowsCETestKit2WindowsCETestKitPlatformBuilderToolsWindowsCETestKitWindowsCETestKitWindowsCE附带的大多数工具都使用KernelIndependentTransportLayer(KITL),一种将工具从基础通信硬件中抽象出来的传输,以便这些工具可以运行在以太网、串行端口、1394、USB或者其他传输上。虽然对于WindowsCE5.0,WindowsCETestKitWindowsCETestKitConnection|StartClient这一步显示DeviceConnection框,其中您可以选择是通过套接字连接还是通过KITL连接UseWindowsSocketsfortheclient/servercommunicationConnect在(KITL)WindowsCEDefaultPlatform|DefaultDeviceOK,上支持的设备,并禁用CETK中不支持的设备。IRPort和Modem。CETKWindowsCE(x86SerialPortSerialPortDriverTest,QuickStart405910PID:83d4ee4aTID:83ea5a8a***TestName: SeteventmaskandwaitforthreadtoclosecommporthandlePID:83d4ee4aTID:83ea5a8a***TestPID:83d4ee4aTID:83ea5a8a***LibraryPID:83d4ee4aTID:83ea5a8a***CommandPID:83d4ee4aTID:83ea5a8a***PID:83d4ee4aTID:83ea5a8a***RandomPID:83d4ee4aTID:83ea5a8a***Thread1PID:83d4ee4aTID:83ea5a8a***Execution405930PID:83d4ee4aTID:83ea5a8aCETKUI(如下图所示),那么失败可能不是由于每个测试SerialPortDriverTest[Failed],然后单击ViewResults10SetandverifytimeoutCETKPlatformBuilderUser-DefinedTestWizardCETKCETKCETKTests|UserDefined33AddaNewTestNextNameofTestCustomStreamDriver在TuxModule(DLL)框中,定位到 ,然后选择test.dll或TuxTest.dll(这依赖于您在PlatformBuilder中所使用的Tux测试的名称)。CommandLineProcessorCopythefilestothedirectoryforuser-definedtests,Next您需要将自定义驱动程序测试(您的DLL) 33WindowsCEx86RedetectPeripherals目时,您只能看到CustomStreamDriverTest。C:\ProgramFiles\WindowsCE2CustomStreamDriverTest,QuickStartPlatformBuilderPID:3c92032TID:3efe3ea***TESTPID:3c92032TID:3efe3ea***PID:3c92032TID:3efe3ea***TestName:PID:3c92032TID:3efe3ea***TestID:PID:3c92032TID:3efe3ea***LibraryPath:PID:3c92032TID:3efe3ea***CommandLine:PID:3c92032TID:3efe3ea***RandomSeed:PID:3c92032TID:3efe3ea***ThreadSample10PID:3c92032TID:3efe3ea***PID:3c92032TID:3efe3eatest:SProc(SPM_BEGIN_TEST,...)calledPID:3c92032TID:3efe3ea BEGINTEST:"Sampletest",Threads=0,Seed=26648PID:3c92032TID:3efe3ea CustomStreamDriverTestStartingPID:3c92032TID:3efe3ea CustomDriverTest-LoadingDemo.DLLPID:3c92032TID:3efe3ea0x83d3dc28:>>>Loadingmodulestreamdrv.dllataddressPID:3c92032TID:3efe3eaStreamDrv-PID:3c92032 CustomDriverTest-LoadedDemo.DLLPID:3c92032TID:3efe3eaStreamDrv-PID:3c92032TID:3efe3ea0x83d3dc28:PID:3c92032TID:3efe3eaStreamDrv-PID:3c92032TID:3efe3ea0x83d3dc28:<<<Unloadingmodulestreamdrv.dllataddressPID:3c92032TID:3efe3eatest:S Proc(SPM_END_TEST,...)calledPID:3c92032TID:3efe3ea ENDTEST:"Sampletest",PASSED,Time=0.180PID:3c92032TID:3efe3ea***PID:3c92032TID:3efe3ea***TESTCOMPLETEDPID:3c92032TID:3efe3eaPID:3c92032TID:3efe3ea***TestName: SampletestPID:3c92032TID:3efe3ea***TestID: PID:3c92032TID:3efe3ea***Library -Checking-DEM_Open-Checking-DEM_Close-Checking-DEM_Read-Checking-DEM_Write-Checking-DEM_Init-Checking-DEM_Deinit-Checking-DEM_PowerUp-Checking-DEM_PowerDown-Checking-DEM_IOControl-Checking-DEM_SeekPID:3c92032TID:3efe3ea***CommandLine:PID:3c92032TID:3efe3ea***Result: PID:3c92032TID:3efe3ea***RandomSeed:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消保知识培训内容课件
- 2025湖南邵阳市隆回县公开招聘高中职业中专教师40人考前自测高频考点模拟试题及一套答案详解
- 安全培训行业发展前景
- 2025年杭州市临安区中医院医共体招聘合同制员工11人模拟试卷及参考答案详解
- 2025年金华义乌市中心医院招聘护理全日制本科岗位10人考前自测高频考点模拟试题(含答案详解)
- 2025届春季特区建工集团校园招聘正式启动考前自测高频考点模拟试题完整参考答案详解
- 安全培训范兴臣课件
- 2025年黄山市祁门文化旅游发展集团有限公司招聘5人模拟试卷及答案详解(考点梳理)
- 2025海南软件职业技术学院考核招聘事业编制专任教师15人考前自测高频考点模拟试题及完整答案详解
- 2025河南商丘市实达国际人力资源合作有限公司招聘辅助人员30人模拟试卷及1套参考答案详解
- 养老院电器安全知识培训课件
- 《煤矿安全质量标准化标准》
- 2025年马鞍山和县安徽和州文化旅游集团有限公司招聘5人考试历年参考题附答案详解
- 学习型班组汇报
- 西藏介绍课件
- 新高考地理备考策略
- 会务理论考试题及答案
- 《陆上风电场工程概算定额》NBT 31010-2019
- 锦囊工程(修订版)
- CT图像伪影及处理
- SF∕T 0111-2021 法医临床检验规范
评论
0/150
提交评论