WindowsCE指南学习课件_第1页
WindowsCE指南学习课件_第2页
WindowsCE指南学习课件_第3页
WindowsCE指南学习课件_第4页
WindowsCE指南学习课件_第5页
已阅读5页,还剩209页未读 继续免费阅读

下载本文档

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

文档简介

WindowsCE指南WindowsCE简介WindowsCE特性与桌面版OS比较与其他嵌入式OS比较WinCE能做什么:手机WinCE能做什么:PDA便携式多媒体设备WinCE能作什么:汽车电子BMWCitroënClarionCo.Ltd.DaimlerChryslerFiatSubaruHondaHyundaiMitsubishiToyota…WinCE能做什么:其它工业控制机顶盒医疗设备银行ATM系统放映机和大屏幕显示器VoIP设备…WindowsCE发展历史1996年发布WindowsCE1.0WindowsCE.NET4.x被广泛应用最新版WindowsCE6.0~7.0WindowsCE特点与桌面版本比较:硬件平台桌面版WindowsOnlyrunsonx86architectureWindowsCEARM/XscaleMIPSPowerPCSparcx86WindowsCE特性WindowsCE支持在多种不同的CPU硬件平台上运行与桌面版本比较:镜像大小桌面WindowsWindows3.x:2-5MBWindows98:400MBWindowsXP:1.5GB越来越大Win7、Win8…不能定制WindowsCE最小:200KB网络部分大约800KBGWES,ShellandApps大约4MB

InternetExplorer大约3MBWindowsCE特性组件化200多个可选组件快速方便地针对特定应用系统定制OS与桌面版比较:实时性桌面Windows不具有实时性WindowsCE线程优先级256级中断嵌套每个线程都有独立的时钟嘀嗒处理优先级反转WindowsCE特性:WindowsCE支持实时性与桌面版比较:电源管理桌面Windows电源管理实现差WindowsCE电池供电/AC供电各设备的电源使用状况关闭不必要的设备WindowsCE特性:WindowsCE提供电源管理器,用来管理设备供电系统,增加电能的使用效率WindowsCE能够减少设备的能量损耗,在系统复位、开启、休眠和挂起状态,维持和保护RAM上的文件系统与桌面版比较:编程接口桌面WindowsASCII/UNICODE丰富的API强有力的硬件平台WindowsCE只支持UNICODE部分Win32API,MFC等有限的硬件资源WindowsCE特性:WindowsCE只支持UNICODECHAR->TCHAR/WCHARstrlen->wcslen部分API功能受限运行WindowsCE的系统通常资源受限与桌面版比较:共享源代码桌面Windows商业软件,源代码是微软的一级机密WindowsCE开放CE6.0的核心源代码用户可以对它进行修改WindowsCE特性:源代码共享用户可以在“%_WINCEROOT%\private”

文件夹中找到公开的源代码与其它嵌入式OS比较:多媒体支持其它嵌入式OS:对音视频支持有限没有商业的网站浏览器WindowsCE友好的用户界面WindowsMediaPlayer9,支持mp3,wav,avi,wmv…InternetExplorer6&PocketIEWindowsCE特性:友好的用户界面强大的多媒体支持与桌面版windows相兼容PocketWord,Excel,PowerPoint,adobereaderPocketMSNmessengerPocketIE,WindowsMediaPlayerSQLServerCEeditionACDSee…

…与其它的嵌入式OS比较:编程接口OtherEOS:不同的编程接口常用的C/C++&j2meWindowsCEWin32APIMFC,ATL,STL…COM,ActiveX.NETCompactFrameworkJavaVMEVB,EVC…WindowsCE特性:对于Windows程序员来说容易上手支持多种编程语言与其它的嵌入式OS比较:

镜像大小和实时性其它嵌入式OS:RTLinux,µC/OS-II支持硬实时Vxworks最小:8kµC/OS-II最小:2kWindowsCE非硬实时系统对于一些特殊的应用镜像可能过大WindowsCE优点:丰富的可选组件和功能定制方便易使用与桌面版windows编程接口类似具有丰富的微软及第三方应用支持WindowsCE系统结构和功能WindowsCE的结构概述系统架构NK.EXEFILESYS.EXEDEVICE.EXEGWES.EXESERVICES.EXEThreadMigration微内核微内核是一个小型的操作系统核心,它为模块化扩展提供基础。微内核的基本原理:只有最基本的操作系统功能才能放在内核中。不是最基本的服务和应用程序在微内核之上构造,并在用户模式下执行。微内核单体内核操作系统(UNIX)微内核结构(WindowsCE)微内核结构用一个水平分层的结构代替了传统的纵向分层的结构。在微内核外部的操作系统部件被当作服务器进程实现,它们可以通过微内核传递信息来实现相互之间的交互。

WindowsCE系统架构WindowsCE属于比较典型的微内核操作系统。在内核中仅仅实现进程、线程、调度及内存管理等最基本的模块,而把图形系统、文件系统及设备驱动程序等等都作为单独的用户进程来实现。WindowsCE系统架构NK.EXENK.LIB+OAL.LIB=NK.EXE微软提供了预先编译的NK.LIB库文件,它的代码与CPU指令体系结构相关而与具体的外设无关。OAL.LIB是OEM层中的OAL代码编译后的输出。提供:处理器调度内存管理进程创建加载系统内的通信机制中断处理为其他部分提供核心调用例程NK.EXEOALRAMROM/FLASHTimerINTCCPUGWES.EXE图形窗口事件系统(GWES)管理所有的图形界面处理以及用户输入桌面的USER32+GDI32作为一个单独的进程DEVICE.EXE设备管理器负责加载、卸载和管理所有不被GWES.EXE管理的驱动程序。大多数功能都放在了devmgr.dll中。提供所有的与驱动相关的函数实现在启动的时候通过注册表加载驱动程序Services.EXE所有服务的宿主进程与Device.exe分开,负责加载系统服务的进程(FTP,TELNET,HTTP)用户可以添加服务提供API管理服务FILESYS.EXE文件系统和所有与文件相关的API都是通过FileSys.exe进程来管理的。有三个组件:对象存储存储管理器ROM文件系统进程和线程与调度进程线程调度进程概述进程(process)定义:是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。它是系统进行资源分配和调度的一个独立单位。进程通常由三部分组成:程序、数据集合、进程控制块PCB(ProcessControlBlock)进程特点:动态性独立性并发行结构化进程概述进程与程序的联系:程序是构成进程的组成部分之一。一个进程的运行目标是执行它对应的程序。进程与程序的区别:程序是静态的,进程是动态的。进程有创建、执行及撤销而消亡的生命周期,程序只是一个文件,存在于某种介质上。一个程序可对应多个进程,但是一个进程只能对应一个程序。WindowsCE进程WindowsCE(5.0)最多只支持32个进程同时运行。每个进程占据32MB的虚拟地址空间,也被称为一个Slot。在系统启动的时候,默认会启动四个进程,NK.EXE,FILESYS.EXE,GWES.EXE及DEVICE.EXE。WindowsCE进程WindowsCE的进程也不支持环境变量(EnvironmentVariable)和当前目录。如果没有明确指明可执行文件的路径,那么WindowsCE会按照如下的顺序搜索:首先查找“\Windows”目录查找根目录(“\”)OEM所指定的搜索目录(“HKEY_LOCAL_MACHINE\Loader\SystemPath”)例如:如果MyApp.exe的同一目录中存在MyFile.txt,那么下面的代码都是不正确的。

_wfopen(L”%WINDOWS%\\MyFile.txt,L”w”);_wfopen(L”MyFile.txt”,L”w”);WindowsCE进程一种解决方案

TCHARszBuf[MAX_PATH];DWORDdwPathLen;//得到当前程序可执行文件的完整路径

dwPathLen=GetModuleFileName(NULL,szBuf,MAX_PATH);if(!dwPathLen){return-1;}//除去文件名

while(szBuf[--dwPathLen]!=‘\\’);szBuf[dwPathLen+1]=NULL;//拼接文件

_tcscat(szBuf,TEXT(“MyFile.txt”));//如果当前文件位于/Temp,则此时szBuf的内容为”/Temp/MyFile.txt”WindowsCE进程创建进程的API如下:

BOOLCreateProcess(LPCWSTRlpApplicationName,//可执行文件的路径和名字,不能为NULLLPWSTRlpCommandLine,//传递启动参数(必须为Unicode字符串)

LPSECURITY_ATTRIBUTESlpProcessAttributes,//不支持,设置为NULLLPSECURITY_ATTRIBUTESlpThreadAttributes,//不支持,设置为NULLBOOLbInheritHandles,//不支持,设置为FALSEDWORDdwCreationFlags,//进程加载后的初始状态

PVOIDlpEnvironment,//不支持,设置为NULLLPCWSTRlpCurrentDirectory,//不支持,设置为NULLLPSTARTUPINFOWlpStartupInfo,//不支持,设置为NULLLPPROCESS_INFORMATIONlpProcessInformation,//返回的进程相关的信息

);//整个函数返回值为BOOL型,当成功创建进程后,返回值为真(TRUE),否则返回假(FALSE).WindowsCE进程终止进程最好是由WinMain()或者其他主函数返回调用ExitThread()函数使进程的主线程退出从而终止进程直接调用ExitProcess()函数在当前进程终止另一个进程可以使用TerminateProcess()线程概述线程(Thread)定义:有时称轻量级进程,进程中的一个运行实体,是一个CPU调度单位。线程特点:是进程的一个实体,可作为系统独立调度和分派的基本单位。不拥有系统资源(只拥有从属进程的全部资源,资源是分配给进程)一个进程中的多个线程可并发执行。(进程可创建线程执行同一程序的不同部分)系统开销小、切换快。(进程的多个线程都在进程的地址空间活动)线程概述线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。WindowsCE线程线程是WindowsCE中最小的可执行单元。WindowsCE的调度系统只识别和调度线程。一个进程可拥有的线程数理论上是没有限制的,只与当前可用的内存有关。线程的上下文:线程占用的内存以及其他资源(如:处理器的寄存器、自己独立的栈等),这些资源构成了线程的上下文。线程可运行在:核心态:线程可访问操作系统所有的资源(可访问核心态的2GB虚拟地址空间)。一般来说,操作系统线程和中断服务例程运行在核心态。用户态:应用程序和设备驱动程序的中断服务线程运行在用户态。WindowsCE线程创建线程的API如下:HANDLECreateThread(

LPSECURITY_ATTRIBUTESlpsa,

//不支持,设为NULL

DWORDcbStack,//线程栈的大小,通常被设置为NULL,使用默认值

LPTHREAD_START_ROUTINElpStartAddr,//指向线程的执行函数的指针

LPVOIDlpvThreadParam,

//向线程中传递一个参数

DWORDfdwCreate,

//控制线程创建的附加参数

LPDWORDlpIDThread

//返回新创建线程的ID);如果线程创建成功,那么函数返回新创建线程的句柄;否则函数返回NULL。WindowsCE线程结束线程最好是从线程的执行函数返回在线程中调用ExitThread()函数可以使线程结束执行在当前线程中终止另一个线程调用TerminateThread()函数WindowsCE调度WindowsCE是一个抢占式多任务(PreemptiveMultitasks)操作系统。调度程序使用基于优先级的时间片算法对线程进行调度。WindowsCE中每个线程都有一个优先级,WindowsCE调度系统根据线程的优先级进行调度。WindowsCE将线程分为256个优先级。0表示优先级最高,255表示优先级最低。

0~96优先级高于驱动程序的实时程序使用

248~255基于Windows

CE的驱动程序

153~247优先级低于驱动程序的实时程序使用

248~255非实时的普通应用程序线程优先级分布图(例)PriorityComponent0-19Open–RealTimeAboveDrivers20GraphicsVerticalRetrace99PowermanagementResumeThread100-108USBOHCIUHCI,Serial109-129IRSIR1,NDIS,Touch130KITL131VMini132CxPort145PS2Keyboard148IRComm150TAPI248PowerManagement249WaveDev,Mouse,PnP,Power250WaveAPI251Normal252-255Open-ApplicationsWindowsCE调度获取和设置线程的优先级GetThreadPriority–

当前线程的优先级SetThreadPriority–

改变当前线程的优先级(248~255)CeGetThreadPriority–

得到当前线程的优先级CeSetThreadPriority–

改变当前线程的优先级WindowsCE调度时间片大小(Quantum):在线程获得处理器后,会执行特定的一段时间,然后重新调度,这段时间称做时间片大小。默认的时间片是100毫秒,OEM可以在OAL中重新设置获得时间片大小的APIDWORDCeGetThreadQuantum(

HANDLEhThread);此函数以线程的句柄为参数,返回值是一个32位无符号整数,代表线程的时间片大小。WindowsCE调度线程的状态运行(Running)

线程正在处理器上执行。就绪(Ready)

线程可以执行,但是此刻没有占用处理器。如果就绪的线程被调度程序选中,则占用处理器就进入运行状态。挂起(Suspended)

创建线程时指定了CREATE_SUSPENDED参数或者调用SuspendThread()函数都可导致线程挂起。

睡眠(Sleeping)

调用Sleep函数可使线程进入睡眠状态,处于睡眠状态的线程不能占有处理器。当睡眠时间结束后,线程转入就绪态。阻塞(Blocked)

如果线程申请的共享资源暂时无法获得,那么线程就进入阻塞状态,处于阻塞状态的线程不能占有处理器。终止(Terminated)

线程运行结束。WindowsCE调度线程的状态转换图就绪终止阻塞睡眠运行挂起运行结束睡眠结束得到资源ResumeSuspend得到CPU上下文切换Sleep(n)WindowsCE调度线程A拥有最高的优先级,他会一直执行直到结束或阻塞线程B和C使用时间片轮转算法(Round-Robin,RR)运行线程的调度WindowsCE调度WindowsCE调度系统的特点具有高优先级的进程如果处于就绪状态,则总是会被调度系统选中执行如果系统中存在多个优先级相同的就绪进程,这些进程以时间片轮转算法调度如果线程的时间片大小被设置为0,那么它会一直占用处理器运行,直到线程结束或者进入阻塞、挂起及睡眠状态WindowsCE调度优先级反转(PriorityInversion):系统中有一些资源是由多个线程共享的,如果具有高优先级的线程申请的资源正在被低优先级线程占用,那么此时高优先级别的线程就阻塞在低优先级的线程上,反而使具有中优先级的线程先于高优先级的线程执行,这就是所谓的优先级反转。WindowsCE调度WindowsCE中解决优先级反转的方法单级方法:在这种方法中,操作系统只会激活导致高优先级线程阻塞的一个低优先级线程上台执行,直到释放共享资源。优先级反转AvoidpriorityinversionbykeepingallthreadswaitingforsameresourceatthesamepriorityThread3HighPriorityMediumPriorityLowPriorityThread3ResourceOwner:Thread2Thread1Thread1Priority

InversionPreemptPreemptBlockedPriority

RestoredThread3Example:Thread1blockedwaitingforresourceownedbyThread3,causingPriorityInversionThread3BlockedThread1Thread2BlockedThreadAPI线程创建CreateThread–

创建一个普通优先级的线程线程优先级GetThreadPriority–

当前线程的优先级SetThreadPriority–

改变当前线程的优先级(251)CeGetThreadPriority–

得到当前线程的优先级CeSetThreadPriority–

改变当前线程的优先级线程睡眠Sleep(0)–

放弃剩余的时间片Sleep(n)–

睡指定的毫秒Sleep(INFINITE)–

使当前线程一直睡眠SleepTillTick–

睡到下一个时钟嘀嗒SuspendThread–

增加线程的挂起计数ResumeThread–减少线程的挂起计数同步对象线程需要同步对象在某些时候进行同步操作。同步对象状态未通知(Non-signaled)通知(Signaled)同步对象类型MutexSemaphoreEventCriticalSection同步对象等待函数DWORDWaitForSingleObject(HANDLE

hHandle,//同步对象的句柄

DWORDdwMilliseconds//等待的ms数

);DWORDWaitForMultipleObjects(

DWORDnCount,//lpHandles中的同步对象个数

CONSTHANDLE*lpHandles,//同步对象句柄的数组

BOOL

fWaitALL,//是否等该lpHandles中所有的内核对象

DWORDdwMilliseconds//等待的ms数

);

同步对象(Mutex)概览同一时刻只有一个线程可以拥有Mutex对象全局名称的Mutex可以跨进程使用。在没有线程拥有它时处于通知状态被线程拥有的时候处于非通知状态函数创建一个Mutex同步对象HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,//不支持,设置为NULLBOOLbInitialOwner,//是否为创建该Mutex的线程所拥有

LPCTSTRlpName//可选,该Mutex的名字);释放对Mutex的占用BOOLReleaseMutex(HANDLEhMutex//Mutex的句柄);同步对象(Mutex)实例——使用Mutex对象对共享的全局变量i进行访问

HANDLEhMutex;INTi=0;//创建Mutex对象和线程

VOIDInit(){hMutex=CreateMutex(NULL,FALSE,NULL);CreateThread(NULL,NULL,ThreadProc1,NULL,NULL,NULL);CreateThread(NULL,NULL,ThreadProc2,NULL,NULL,NULL)}DWORDWINAPITHreadProc1(LPVOIDlpParameter){WaitForSingleObject(hMutex,INFINITE);//获得Mutex对象

i++;

//访问共享资源

ReleaseMutex(hMutex);

//释放同步对象

return0;}DWORDWINAPITHreadProc2(LPVOIDlpParameter){WaitForSingleObject(hMutex,INFINITE);//获得Mutex对象

i--;

//访问共享资源

ReleaseMutex(hMutex);

//释放同步对象

return0;}同步对象(Semaphore)概览限制占有共享资源的数量(如果一个Semaphore带有记数n,这表示同时最多可以有n个线程占有该Semaphore)全局名称的Semaphores可以跨进程使用。引用计数大于零时处于通知状态引用计数小于等于0时处于非通知状态函数创建一个Semaphore对象HANDLEWINAPICreateSemaphore(

LPSECURITY_ATTRIBUTESlpSemaphoreAttributes,//不支持,设为NULL

LONGlInitialCount,//初始计数

LONGlMaximumCount,

//最大支持的线程数

LPCTSTRlpName

//可选,Semaphore的名字);释放SemaphoreBOOLReleaseSemaphore(

HANDLEhSemaphore,

//要释放的Semaphore句柄

LONGlReleaseCount,

//释放的引用个数

LPLONGlpPreviousCount

//返回释放前的Semaphore计数);同步对象(Event)概览全局名称的Event可以跨进程使用。事件发生时处于通知状态事件未发生时处于非通知状态函数创建Event同步对象HANDLEWINAPICreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,//不支持,设为NULLBOOLbManualReset,//是否需要人工重置

BOOLbInitialState,

//初始状态,TRUE为通知状态

LPCTSTRlpName

//可选,Event的名字);把Event同步对象设置为通知状态BOOLSetEvent(HANDLEhEvent//Event的句柄);把Event同步对象设置为未通知状态

BOOLResetEvent(HANDLEhEvent//Event的句柄););同步对象(Event)实例——使用Event对象对共享的全局变量i进行访问

HANDLEhEvent;INTi=0;//创建一个自动重置,初始状态为通知的Event对象。创建线程

VOIDInit(){hEvent=CreateEvent(NULL,FALSE,TRUE,NULL);CreateThread(NULL,NULL,ThreadProc1,NULL,NULL,NULL);CreateThread(NULL,NULL,ThreadProc2,NULL,NULL,NULL);}DWORDWINAPIThreadProc1(LPVOIDlpParameter){WaitForSingleObject(hEvent,INFINITE);//等待事件发生

i++;

//访问共享资源

SetEvent(hEvent);

//让事件再次发生

return0;}DWORDWINAPIThreadProc2(LPVOIDlpParameter){WaitForSingleObject(hEvent,INFINITE);//等待事件发生

i--;

//访问共享资源

SetEvent(hEvent);

//让事件再次发生

return0;}用户态下的同步方法

用户态下的同步方法CriticalSection互锁函数同步(CriticalSection)概览允许多个线程共享访问同一块数据使用互斥访问保护数据其他线程会block直到占有者放弃临界区每个CS都是OS提供的一个数据结构,只能在同一个进程内部使用,比MUTEX要高效。函数InitializeCriticalSection分配CRITICAL_SECTION结构EnterCriticalSection调用着,在占有CS的线程调用LeaveCriticalSection之前会阻塞TryEnterCriticalSectionEnterCriticalSection的非阻塞版LeaveCriticalSection释放CriticalSection的所有权DeleteCriticalSection释放InitializeCriticalSection分配的资源同步(CriticalSection)CRITICAL_SECTIONcs;INTi=0;//初始化临界区

VOIDInit(){InitializeCriticalSection(&cs);CreateThread(NULL,NULL,ThreadProc1,NULL,NULL,NULL);CreateThread(NULL,NULL,ThreadProc2,NULL,NULL,NULL);}DWORDWINAPIThreadProc1(LPVOIDlpParameter){EnterCriticalSection(&cs);//进入临界区

i++;

LeaveCriticalSection(&cs);//离开临界区

return0;}DWORDWINAPIThreadProc2(LPVOIDlpParameter){EnterCriticalSection(&cs);//进入临界区

i++;

LeaveCriticalSection(&cs);//离开临界区

return0;}同步(InterlockedFunction)概览对多个线程对同一个变量的共享访问保护提供原子操作函数InterlockedIncrement–

对一个变量进行原子加1操作InterlockedDecrement-对一个变量进行原子减1操作InterlockedExchange–

对两个变量进行交换值操作InterlockedTestExchange–

如果变量符合,则交换两个变量的值InterlockedCompareExchange–

基于比较,交换两个变量的值同步(InterlockedFunction)实例——使用互锁函数对共享的全局变量i进行访问

INTi=0;//创建线程

VOIDInit(){CreateThread(NULL,NULL,ThreadProc1,NULL,NULL,NULL);CreateThread(NULL,NULL,ThreadProc2,NULL,NULL,NULL);}DWORDWINAPIThreadProc1(LPVOIDlpParameter){InterlockedIncrement(&i);return0;}DWORDWINAPIThreadProc2(LPVOIDlpParameter){InterlockedDecrement(&i);return0;}进程间通信常用的两种方法文件映射点对点消息队列进程间通信——文件映射概览通过文件映射文件可在进程的共享虚拟地址空间内保留一个地址空间的区域,同时将文件所在的物理内存映射到此区域。在WindowsCE中,内存映射文件总是会被映射到4GB虚拟地址空间的0x42000000~0x7FFFFFFF的进程共享区域。函数CreateFileForMapping

创建一个文件,用于内存映射

CreateFileMapping–

创建内存映射文件对象

MapViewOfFile–把内存映射文件映射到进程共享地址空间

UnmapViewOfFile–删除内存映射文件进程间通信——PTP消息队列概览消息队列通常是一个先进先出的队列结构,当一个进程把消息写入队列,需要此消息的其他进程,就可从队列中取得消息。消息队列还可用来进行同步。消息是没有优先级的,对于同一个队列,所有的消息都严格按照先进先出的方式进出。WindowsCE中的消息队列是基于点对点操作的,它不能用来进行广播。函数CreateMsgQueue–

创建或打开一个消息队列OpenMsgQueue–

对一个现存的消息队列打开一个句柄CloseMsgQueue–

关闭一个打开的消息队列ReadMsgQueue–

从消息队列中读一个消息WriteMsgQueue–

向消息队列写一条消息GetMsgQueueInfo–

返回有关一个消息队列的信息内存管理WindowsCE采用层次化的结构PhysicalMemory*StorageDeviceVirtualMemoryLogicalMemory(Heap,stack)CRuntime(mallc,new…)Application内存结构物理内存在内部或外部总线上可访问的实际的RAM/ROM虚拟内存通过内存管理单元MMU把虚拟地址映射到物理地址允许代码在需要的时候再换入概述虚拟内存模型静态映射的虚拟内存进程模型进程内存进程堆栈虚拟内存模型虚拟内存一个32-bit(4Gigabyte)虚拟内存地址空间提供了被保护物理内存的有效使用虚拟地址内存管理单元(MMU)“拥有”

物理内存MMU将虚拟地址转换为物理地址一个有效的虚拟地址必须被映射到一个物理地址虚拟地址的静态和动态映射物理地址在上电时,在MMU有效之前只被CPU使用虚拟内存模式特权模式在内核模式和用户模式间的虚拟内存split所有的进程共享同一个平板式虚拟内存地址空间

通过MMU内核模式管理用户模式进程保护内核空间只被特权访问的内核模式代码使用(Kmode)大多数是静态虚拟地址映射(不会有页内错误)用户空间每32MB由64个slots组成大多数是动态虚拟地址映射虚拟内存模式KernelSpaceUser

SpaceKernelAddresses:KPAGE,TrapArea,OthersSlot97:NK.EXEUnusedStaticallyMappedVirtualAddresses:Un-CachedStaticallyMappedVirtualAddresses:CachedSlot0–CurrentProcessSlot1–XIPDLLcodeSlots2-32-ProcessesSlots33-63ObjectStoreand

Memory-MappedFilesFFFFFFFFE0000000C4000000C2000000C0000000A0000000800000007FFFFFFF42000000040000000200000000000000Total4GBVirtual

Space2GB2GBKernelSpaceUserSpaceUnused静态映射虚拟地址2GB

User512MB

Uncached512MB

Cached32MBFlashPhysicalMemoryVirtualMemory040000008200000080000000A0000000C00000000000000064MBRAM0000000064MBRAM32MBFlash64MBRAMFFFFFFFFAddress

Translation32MBFlashKernelSpaceUser

SpaceProcessModel虚拟地址Slots每个slot是32MB(225bytes)虚拟地址空间Slot空间被进程,DLLs,和虚拟分配共享在进程slot间快速进行上下文切换(交换页表)当前线程执行在slot0上管理粒度虚拟地址空间以64KB的粒度被分割物理地址以4KB的粒度被页进行管理分配规则DLL分配从高地址开始向下增长进程分配从低地址开始向上增长Lesson:ProcessMemorySlot30Slot31Slot32...01FFFFFF000100000000000032MBProcessSpaceCurrentProcessXIPROMDLLsnk.exefilesys.exeshell.exedevice.exegwes.exeC4000000C2000000FreeVirtualSpaceSlot63...ResourceDLLsSlot2Slot3Slot4Slot5Slot1Slot00A0000003E0000003C000000400000004200000000000000040000000200000006000000080000000C000000...Slot97800000007E000000堆用法以字节为粒度来分配内存独立于处理器(隐藏了内存分页)自动的分配内存和按要求提交页不可变更(当整个堆被释放时进行页面回收)使用首次适应算法(first-fitalgorithm)通过堆列表进行管理使用相同大小对象分配时效率最高局部堆在装载处理时保留192KB虚拟内存可用函数GetProcessHeap()得到默认堆栈用法存储在一个函数中使用的临时数据存储在执行处理过程中的处理器寄存器的状态为每一个线程创建时分配默认的栈按要求提交大小依赖于CPU默认的栈大小在编译程序时,可使用编译器选项/STACK决定默认线程的栈大小默认情况,一个进程的所有线程拥有相同的栈大小系统API调用机制Coredll.dll定位每一个进程slot的头地址从用户模式的线程实现对系统API的调用直接实现一些系统API的调用引起一个例外(陷阱)转递到系统API的请求上内核捕获系统API请求的异常陷阱分配一个系统exe去执行请求用户模式的线程切换到系统exe进程空间用户模式的线程继承当前进程的访问权限系统API调用机制UsermodethreadWin32APIThunksFunctionCallCoredll.dllApp.exeKernel

TrapWin32APIDispatchNk.exeJumpFunctionCodesystemEXEKernel

CallReturn

Call文件系统所有与文件系统相关的函数都在FileSys.exe中实现单根“\”,没有像“C:\”一样的盘符有三个组件:对象存储存储管理器ROM文件系统文件系统概述对象存储被FileSys.exe管理的一个堆从逻辑上讲包括:RAM文件系统Registry(注册表)Database(CE数据库)RAM文件系统通常位于根目录Ex:“\myfile.txt”

存在于RAM中ROM文件系统被映射成“\Windows”

目录“\Windows”

目录中所有的文件都是只读的通常是nk.bin或nk.nb0中的文件注册表用来保存应用程序、驱动程序和用户的设定以及其他一些配置信息。具有层次化的组织结构,由若干个键以及值组成注册表类型基于RAM的注册表(适用于没有外部存储)

基于Hive的注册表(适用于有永久存储并且须经常冷启动的设备)WindowsCE数据库提供了与关系型数据库类似的数据结构化存储和访问CE数据库最上层是数据库卷标(Volume)

一个Volume可包含一个或多个数据库数据库是一系列记录的集合存储管理负责:管理所有的外部设备StoragedevicedriverPartitiondevicedriverFileSystemdevicedriverFileSystemfilter用户界面与图形系统图形系统为WindowsCE提供图形界面服务,它是由GWES.EXE实现的。有三个组件:图形系统(Graphic)窗口系统(Windows)事件系统(Event)图形系统WindowsCE中使用图形设备接口来处理程序的图形输出。以设备上下文(DeviceContext,DC)的对象的句柄为参数,调用各种GDI函数实现各种文字或图形的输出。窗口系统创建窗口的步骤应用程序调用RegisterClass()向系统注册一个窗口类应用程序调用CreateWindow()以某个已注册的窗口类为模板创建窗口事件系统Windows应用程序是以事件为驱动、消息机制为基础的。Windows程序所做的一切都是响应发送给窗口过程的消息。事件系统WindowsCE中,消息定义如下:

typedefstructtagMSG{HWNDhwnd;//接收该消息的窗口的句柄

UINTmessage;//消息的类型

WPARAMwParam;//与具体消息类型相关的附加数据

LPARAMlParam;//与具体消息类型相关的附加数据

DWORDtime;//发送消息时的时间

POINTpt;//发送消息时的鼠标位置}MSG,*PMSG,NEAR*NPMSG,*LPMSGWindowsCE嵌入式系统应用程序开发目录工具和技术常规的应用开发步骤WindowsMobile开发PocketPCSmartphone模拟器概述什么是应用程序开发在特定的WindowsCE平台下使用该平台的编程接口实现各种功能平台的价值依赖于运行在其上的应用程序WindowsCE应用程序开发工具PlatformBuilderEmbeddedVisualC++VisualStudio.NETPlatformBuilderPlatformBuilder支持WinCEApp/DLL/Lib,使用Win32API开发应用程序将被链接到OS内核中一旦修改代码,必须再重新编译镜像容易调试OS内核,不容易调试应用程序首先必须创建一个debug版的OSEmbeddedVisualC++EmbeddedVisualC++支持WinCEApp/DLL/COM/LibusingWin32API,MFC,ATLandSTL与VisualC++6.0具有相似的工程管理模式和用户界面易于调试和测试必须安装相应的为特定平台开发的SDK,从而开发相应的应用程序VisualStudio.NETVisualStudio.NET2003开发基于.NETCompactFramework1.0和.NETCompactFramework2.0的托管代码,也可以使用C/C++语言来开发本机代码可使用C#,VB.NET...VS.NET具有完整的开发环境目标平台上需要安装.NETcompactframework易于调试和测试NativeApplicationModelManagedApplicationModelVisualStudio.NET2005C#orVB.NET.NETCompactFrameworkRuntimeCorC++Win32ApplicationsCompiledPlatformBuilderWindowsCEOperatingSystemCorC++Win32ApplicationseMbeddedVisualC++应用程序开发选择相关技术

你有哪些选择?Win32MicrosoftFoundationClass(MFC).NETCompactFrameworkWin32Win32API是微软32位Windows平台的应用程序编程接口。使用Win32API编写的应用程序可在不同的Windows平台之间基本实现代码级的兼容。一个标准的Win32源程序=源代码文件+资源文件MFCMFC是一个基于C++语言的面向对象的程序设计框架,它大大简化了Windows编程工作。优点:MFC提供了一个标准化的结构,开发人员可从一个较高的起点编程,从而节省大量的时间提供了大量的代码程序的控制主要由MFC框架完成。与桌面MFC的异同:WindowsCE中的MFC对桌面的MFC做了一定的改动。增加了一些WindowsCE特有的类,并且删除了对其他一些类的支持。ATLATL(ActiveXTemplateLibrary),它是一套C++模板库。优点:ATL能够快速地开发高效、简洁的代码,同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。.NETCompactFramework.NETCompactFramework是.NET战略的重要部分,是为了在智能设备和嵌入式系统上运行托管代码而设计的。优点:简化了在智能设备上开发应用程序的过程。.NETCompactFramework两个组件:公共语言运行时.NETCompactFramework类库相关技术

对大小的影响RuntimeSize(Byte)SizeIncrementWin329,805,2310MFC10,234,415429,184.NETcompactframework11,201,4591,396,228相关技术

开发和执行时间Developtimeperformanceruntimeperformance.NETCompactframeworkMFCWin32API相关技术

结论

确定使用何种模式取决于你是否使用了Win32/MFC/C#/VB来开发程序,以及系统对操作系统镜像大小的要求,同时还要考虑其他因素,如应用程序开发速度以及系统的可靠性和兼容性等。常规的应用开发步骤:获得特定WindowsCE平台的SDK。在WindowsCE模拟器上编辑和调试代码。在实际目标平台上,编译、运行程序,

如果需要在设备上调试程序,可以通过ActiveSync。第一步:获得SDKSDK是用于在EVC和VisualStudio下开发应用程序的获得SDK的两种方法微软或第三方提供为自己的平台导出SDKMicrosoft提供:StandardSDK(CommonSDKdev)WindowsMobileSDK(PocketPC…)PB下的SDK向导它是一个工具,用来产生和导出特定平台的SDK(softwaredevelopmentkit)。被导出的SDK由头文件、库文件、运行文件、平台的外延和帮助文件等组成。应用程序开发人员可以利用这个SDK去关联MicrosoftembeddedVisualC++4.0或MicrosoftVisualStudio.NET,为特定平台开发应用。

Platform->ConfigureSDKPlatform->BuildSDKPB、SDK和开发工具间的关系图提示:只在StandardSDK不能满足需求时才使用自己的导出SDK用Platform->Configure

SDK

来配置SDK从控制面板中卸载SDK第二步:在模拟器下编程和调试与VisualC++6.0andVisualC++.NET类似取决于你的WindowsProgramming知识平台管理器(PlatformManager)

它是一种通讯机制,用来管理宿主机和目标机之间的通讯。平台管理器允许宿主机上的开发工具以介质无关的方式下载和连接目标机,PB,EVC4.0,和Microsoft.NETCompactFramework使用平台管理器下载诸如应用、MSActiveX控件、实时运行库和远程客户端工具等到目标机上。WorkstationCEDeviceTCP/IPKITLActiveSyncPlatformManager远程工具你可以在宿主机上远程执行位于目标机上的各种程序不同的平台支持不同的远程工具位于PB和EVC的Tools

菜单下开发者可以使用相应的接口和APIs产生新的远程工具工具名称描述RemoteCallProfilerProvidesprofilingandanalysistoolswithinagraphicaluserinterface(GUI)thatenableyoutoidentifyalgorithmicbottlenecksinyourapplications.RemoteFileViewerDisplaysahierarchicalviewofthefilesystemonatargetdevice.RemoteHeapWalkerDisplaysinformationaboutheapidentifiersandflagsforprocessesthatarerunningonatargetdevice.RemoteKernelTrackerDisplaysarepresentationoftheexecutionoftheoperatingsystem(OS)onatargetdevice.RemotePerformanceMonitorMeasurestheperformanceofatargetdevice.RemoteProcessViewerDisplaysalistofprocessesandthreadsrunningonatargetdevice.RemoteRegistryEditorDisplaystheregistryforatargetdeviceandenablesyoutomanagetheregistry.RemoteSpyDisplaysalistofwindowsopenedonatargetdeviceandmessagesgeneratedbythosewindows.RemoteSystemInformationDisplayssystemsettingsandpropertiesforatargetdevice.RemoteZoom-inDisplaysanimagefromthescreenofatargetdevice.第三步:在目标机上的运行和调试根据目标机使用的CPU编译程序下载这个可执行文件到目标机上,然后运行该可执行文件

如果需要,使用ActiveSync一步一步调试程序介绍ActiveSync

ActiveSync提供了一种支持,用来同步基于桌面Windows系统和基于CE.NET的便携式系统间的数据,它使用时间标记(stamps)和用户参数来跟踪两个系统间的数据改变,并传送相应的数据使得每个系统上的数据都是最新的,过时的或者冗余的数据会被删除。

ActiveSync支持USB,红外,调制解调器,以及Ethernet等多种连接。

ActiveSync不支持CE设备间的数据同步,也不支持CE设备和服务器间的数据同步。使用ActiveSync调试安装ActiveSync(从Microsoft网站获得)宿主机和目标机间提供至少以下一种连接SerialUSBInfraredModemEthernet在EVC下选择“WindowsCEDevice”inEVC,调试运行在目标机上的程序介绍WindowsMobileWindowsMobile是微软为PocketPCs和Smartphones开发的软件平台Windows移动延伸到微软的桌面系统和个人设备Windows移动家族PocketPCSmartphoneWindows汽车电子SmartphonePocketPC为什么要开发Windows移动移动设备的市场越来越大截止2008,将会有超过10亿集成设备和2亿的移动手机用户(IDC,2004).PocketPC已经是PDA市场的龙头,超过PalmSmartphone的快速发展WindowsMobile的特点Microsoft提供了平台和SDKOEMs提供硬件开发人员不能修改Platform特性Windows移动开发

第一步:下载和安装SDKsURL:/mobility/downloads/sdks/default.aspxSDK能被用在EVC和VisualStudio.NET2003上Windows移动开发

第二步:开发、调试,运行参考前面的部分你需要知道什么1.只能使用Unicode字符集a.ANSI是一个字节,UNICODE是两个字节b.声明:CHAR->WCHARorTCHARc.字符串函数:strlen()->wcslen()strcmp()->wcscmp()你需要知道什么2.注意内存的使用减少静态和全局变量的使用注意函数的递归注意图片、视频文件的大小检查动态内存的分配情况概述

仿真器是一个用来模拟支持WindowsCE平台的硬件行为的工具。使用仿真器,你不需要硬件就可以设计、建立和测试一个CE平台,它是用软件的形式来实现对硬件平台的模拟。用软件模拟硬件。在模拟器上映射一个目录

使用模拟器,你可以将一个宿主机上的目录映射到仿真器上,就好像这个目录是安装在模拟器上的一个驱动设备。在模拟器的文件里,这个映射到模拟器上的目录现在处于根目录下,名字是StorageCard,模拟器一次只能映射一个目录。在模拟器上映射一个目录映射一个目录到模拟器上在模拟器上,运行一个WindowsCE系统,它可以支持宿主机目录映射到模拟器上在模拟器窗口里,从模拟器菜单中选择文件夹共享选择共享文件夹选择一个目录共享,然后点OK删除映射目录在模拟器窗口里,从模拟器菜单中选择文件夹共享在共享文件夹中选择目录的路径选择不共享模拟器的限制—通讯和网络模拟器要运行在NAT(NetworkAddressTranslation,网络地址转换)连接上拨号连接不支持模拟器不能建立RemoteDesktopProtocol(RDP)不支持:IrDABluetooth802.11模拟器的限制—硬件限制Universalserialbus(USB)设备PCCard设备存储设备,包括CF卡和硬盘文件系统驱动,包括fileallocationtable(FAT),compactdisc(CD),anddigitalvideodisc(DVD)driversIEEE1394devices仿真器的限制—多媒体限制不支持对多媒体的硬件加速DirectXWindowsMediaDVD-VideoAPIDigitalrightsmanagement(DRM)VoiceoverIP(VoIP)Multiple-screensupportPlatformBuilder集成开发环境PlatformBuilder主界面目录(Catalog)BSPsCoreOS设备驱动器平台管理器第三方特性

BSP:BoardSupportPackagesCoreOS:ApplicationsandServicesDevelopmentApplications-EndUserCommunicationServicesandNetworkingCoreOSServicesDeviceManagementFileSystemsandDataStoreFontsInternationalInternetClientServicesMultimediaTechnologiesSecurityShellandUserInterfaceVoiceoverIPPhoneServicesWindowsCEErrorReportingDeviceDriversPlatformManager目录(Catalog)项Feature选项显示备选feature信息Feature图标图标描述该Feature是BSPCoreOSdesign特性组,在它下面的特性只能从多个中选择一个RequiredCatalogitem.必选的

温馨提示

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

评论

0/150

提交评论