您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 145-嵌入式软件开发导论
嵌入式软件开发导论同济大学软件学院20066.WindowsCE系统架构概述系统架构NK.EXEFILESYS.EXEDEVICE.EXEGWES.EXESERVICES.EXEThreadMigrationWindowsCE系统架构Application(s)COREDLLNK.EXEOALGWES.EXEFILESYS.EXEObjectStoreTouchDisplayKeyboardROMFSStorageManagerDEVICE.EXESERVICES.EXEFTPHTTPDTELNETDRAMROM/FLASHTimerINTCCPUHARDWARESerialUSB(Function)PCCard...DevMgr.DllBlockDeviceSerialCustomNK.EXENK.LIB+OAL.LIB=NK.EXE内核是硬件体系结构无关但是是处理器相关的OAL越小越好微软提供了预先编译的NK.LIB库文件NK.lib的大多数代码都是公开的通过高级代码共享,可以得到更多代码提供:内存管理调度管理系统调用转发实现了一些基本的Win32函数NK.EXEOALRAMROM/FLASHTimerINTCCPUProtectedServerLibraries(PSL)实现API的系统函数把操作系统的功能放在多个进程的机制PSLCallsrunthroughtheKernel(NK.EXE)不对最终用户开放你不能创建一个PSLGWES.EXE图形窗口事件系统(GWES)管理所有的图形界面处理以及用户输入桌面的USER32+GDI32作为一个单独的进程GWES.EXETouchDisplayKeyboardHARDWAREDEVICE.EXE设备管理器电池驱动已经被从GWES中拿走了大多数功能都放在了devmgr.dll中。提供所有的与驱动相关的函数实现在启动的时候通过注册表加载驱动程序DEVICE.EXEHARDWAREDevMgr.DllBlockDeviceSerialCustomServices.EXE所有服务的宿主进程与Device.exe分开FTP,TELNET,HTTPD(Web),UPnP,SMB,其它…用户可以添加服务提供命令行工具来启动、关闭服务提供API管理服务SERVICES.EXEFTPHTTPDTELNETD文件系统所有与文件系统相关的函数都在FileSys.exe中实现单根“\”,没有像“C:\”一样的盘符有三个组件:对象存储存储管理器ROM文件系统文件系统概述目标存储被FileSys.exe管理的一个堆包括:RegistryDatabaseRAM文件系统RAM文件系统通常位于根目录Ex:“\myfile.txt”存在于RAM中ROM文件系统被映射成“\Windows”目录“\Windows”目录中所有的文件都是只读的通常是nk.bin或nk.nb0中的文件存储管理负责:StoragedevicedriverPartitiondevicedriverFileSystemdevicedriverFileSystemfilter线程迁移Application(s)COREDLLNK.EXEOALGWES.EXEFILESYS.EXEObjectStoreTouchDisplayKeyboardROMFSStorageManagerDEVICE.EXESERVICES.EXEFTPHTTPDTELNETDRAMROM/FLASHTimerINTCCPUHARDWARESerialUSB(Function)PCCard...DevMgr.DllBlockDeviceSerialCustomCreateFile(…)概述进程线程虚拟内存WindowsCE内核特征多进程可以支持最多32个进程多线程支持256个线程优先级Fibers只能被应用程序手工调度的执行单元同步对象CriticalSections,Mutexes,Semaphores,Events,MessageQueues内存模型Virtualmemory,CodesectionsPaged,NobackingstoreforDatasections进程静态上下文,线程的容器进程不被执行,线程被执行系统中同时最多只能有32个进程:对大多数嵌入式系统来说都已经足够。推荐用多线程而不是多进程迎合一些体系结构的支持WindowsCE使用与WindowsXP一样的加载/卸载模型(与其它桌面Window一样)支持命令行程序但是与桌面Win32API不一样调用CreateProcess()启动进程线程Win32的执行的单元按照优先级调度高优先级的线程会抢占低优先级的线程同样的优先级使用Round-Robin算法默认的时间片是100毫秒,OEM可以在OAL中重新设置线程调度线程A拥有最高的优先级,他会一直执行直到结束或阻塞线程B和C使用Round-Robin算法运行在round-robin每个线程都运行一个固定的时间,叫做时间片优先级数字越小,优先级越高线程优先级分布图(例)PriorityComponent0-19Open–RealTimeAboveDrivers20GraphicsVerticalRetrace99PowermanagementResumeThread100-108USBOHCIUHCI,Serial109-129IRSIR1,NDIS,Touch130KITL131VMini132CxPort145PS2Keyboard148IRComm150TAPI248PowerManagement249WaveDev,Mouse,PnP,Power250WaveAPI251Normal252-255Open-Applications优先级反转AvoidpriorityinversionbykeepingallthreadswaitingforsameresourceatthesamepriorityThread3HighPriorityMediumPriorityLowPriorityThread3ResourceOwner:Thread2Thread1Thread1PriorityInversionPreemptPreemptBlockedPriorityRestoredThread3Example:Thread1blockedwaitingforresourceownedbyThread3,causingPriorityInversionThread3BlockedThread1Thread2BlockedThreadAPI线程创建CreateThread–创建一个普通优先级的线程线程优先级GetThreadPriority–当前线程的优先级SetThreadPriority–改变当前线程的优先级(251)CeGetThreadPriority–得到实时线程的优先级CeSetThreadPriority–改变实时线程的优先级线程睡眠Sleep(0)–放弃剩余的时间片Sleep(n)–睡指定的毫秒Sleep(INFINITE)SleepTillTick–睡到下一个系统嘀嗒SuspendThread–增加休眠的引用计数ResumeThread–减少休眠的引用计数进程&线程WindowsCE进程不支持环境变量_wfopen(L“%WINDOWS%\\a.txt”,L“w”);//errorWindowsCE进程不支持当前目录_wfopen(L“a.txt”,L“w”);//error,firstsearchrootdirectory,thensearch\Windowsdirectory.同步对象线程需要同步对象在某些时候进行同步操作。同步对象类型CriticalSectionMutexSemaphoreEvent也可以使用子增函数或者点对点消息队列同步(CriticalSections)概览允许多个线程共享访问同一块数据使用互斥访问保护数据其他线程会block直到占有者放弃临界区每个CS都是OS提供的一个数据结构,只能在同一个进程内部使用,比MUTEX要高效。函数InitializeCriticalSection分配CRITICAL_SECTION结构EnterCriticalSection调用着在占有CS的人调用LeaveCriticalSection之前会阻塞TryEnterCriticalSectionEnterCriticalSection的非阻塞版LeaveCriticalSection释放CriticalSection的所有权DeleteCriticalSection释放InitializeCriticalSection分配的资源同步对象(Mutexes)概览同一时刻只有一个线程可以拥有mutex全局名称的Mutex可以跨进程使用。在没有线程拥有它时处于signal状态被线程拥有的时候处于非signal状态函数CreateMutex创建一个有名或无名的Mutex对象WaitForSingleObjectorWaitForMultipleObject调用着在占有Mutex的人释放之前会阻塞ReleaseMutex释放对Mutex对象的占有CloseHandle删除Mutex对象同步对象(Semaphores)概览限制占有共享资源的数量全局名称的Semaphores可以跨进程使用。引用计数大于零时处于signal状态引用计数小于等于0时处于非signal状态函数CreateSemaphore创建一个有名或无名的Semaphore对象WaitForSingleObjectorWaitForMultipleObject调用者在计数是非0之前阻塞ReleaseSemaphore增加Semaphore的引用计数CloseHandle删除Semaphore对象同步对象(Events)概览全局名称的Event可以跨进程使用。事件发生时处于Signal状态时间未发生时处于非signal状态函数CreateEvent–创建一个有名或无名的事件对象SetEvent–把事件对象设置为signal状态ResetEvent–把事件设置为非signal状态PulseEvent–把事件设置为signal状态,然后在释放一定量的线程之后,转回非signal状态WaitForSingleObjectorWaitForMultipleObject–调用者阻塞直到某一事件达到signal状态CloseHandle–销毁事件对象同步(InterlockedFunctions)概览对多个线程对同一个变量的共享访问保护提供原子操作函数InterlockedIncrement–对一个变量进行原子加1操作InterlockedDecrement-对一个变量进行原子减1操作InterlockedExchange–对两个变量进行交换值操作InterlockedTestExchange–如果变量符合,则交换两个变量的值InterlockedCompareExchange–基于比较,交换两个变量的值同步(PTP消息队列)概述允许拥有多个用户定义的消息队列的使用者存在高优先级和报警消息函数CreateMsgQueue–创建或打开一个消息队列OpenMsgQueue–对一个现存的消息队列打开一个句柄CloseMsgQueue–关闭一个打开的消息队列ReadMsgQueue–从消息队列中读一个消息WriteMsgQueue–向消息队列写一条消息GetMsgQueueInfo–返回有关一个消息队列的信息内存管理
本文标题:145-嵌入式软件开发导论
链接地址:https://www.777doc.com/doc-5479351 .html