欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载
     

    第十三讲驱动程序概述及模型课件.ppt

    • 资源ID:1547674       资源大小:156.50KB        全文页数:55页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第十三讲驱动程序概述及模型课件.ppt

    2022/12/4,北京理工大学珠海学院 计算机教研室,1,第五章 驱动程序设计,北京理工大学珠海学院 计算机教研室,2,2022/12/4,教学目的,Windows CE5.0驱动程序设计的基本概念;掌握Windows CE5.0动态链接库的编制方法;掌握Windows CE5.0动态链接库的静态加载方法,北京理工大学珠海学院 计算机教研室,3,2022/12/4,项目9:驱动程序的编制,本节课程主要知识点驱动程序模型动态链接库动态链接库的特点与实现(重点)动态链接库的加载动态链接库的静态加载(难点),北京理工大学珠海学院 计算机教研室,4,2022/12/4,教学重点驱动程序的基本概念动态链接库教学难点动态链接库的编制及静态加载方法,北京理工大学珠海学院 计算机教研室,5,2022/12/4,5.1驱动程序基本知识,5.1.1 驱动程序的功能驱动程序是操作系统与硬件交互的方式,是连接硬件与操作系统之间的桥梁;独立的“黑盒子”,定义好的编程接口,隐藏设备工作的细节;驱动程序的作用是实现这组接口,并映射到具体的对硬件的某项操作上。,驱动程序接口,北京理工大学珠海学院 计算机教研室,6,2022/12/4,应用程序,操作系统,网卡驱动程序1,网卡驱动程序2,网卡1,网卡2,Send(),SendPackage(),MySendPackage1(),MySendPackage2(),系统调用,驱动程序接口,硬件操作,图5.1 驱动程序模型,北京理工大学珠海学院 计算机教研室,7,2022/12/4,5.1.2 何时编写驱动程序操作系统没有内置支持的硬件扩展已有驱动的功能提供软件层面的服务伪驱动(Pseudo Driver):所谓的伪驱动,就是不是真正意义上的驱动;而挂着驱动的名号,却又是因为和底层驱动有着千丝万缕的联系. 5.1.3 驱动程序模型为简化驱动程序的编写,把驱动程序分层提取某一类外设的共性,作为独立的一层,并提供通用的代码和库,北京理工大学珠海学院 计算机教研室,8,2022/12/4,5.1.4 编写驱动程序的几个要素了解驱动程序所针对的硬件(Datasheet)了解目标操作系统下驱动的工作机制驱动程序的加载和卸载;驱动程序的初始化工作;外设I/O的访问;中断的处理;DMA的处理;内存的使用以及异步操作的进行方式等。了解驱动程序的模型不同的操作系统会提供不同的驱动模型,北京理工大学珠海学院 计算机教研室,9,2022/12/4,5.2 Windows CE驱动程序,5.2.1 Windows CE驱动程序开发简介驱动程序的两种形式.LIB库文件,随操作系统的启动和关闭进行加载和卸载;操作系统启动后对硬件进行延迟加载。Windows CE的所有驱动程序都以用户态下的DLL文件形式存在,运行在用户态。,北京理工大学珠海学院 计算机教研室,10,2022/12/4,驱动程序作为用户态DLL的优点:给操作系统和驱动程序带来了很大的灵活性,动态加载所需的驱动程序,可实现外设的即插即用;增强系统的稳定性;给驱动开发人员提供便利。5.2.2 Windows CE驱动程序的宿主DLL无法单独被加载和运行,必须先有一个EXE进程将DLL加载到自己的地址空间Windows CE中有3个系统进程会加载和执行驱动程序的DLL,分别是Device.exe,GWES.exe,FileSys.exe,北京理工大学珠海学院 计算机教研室,11,2022/12/4,Device.exe,网卡,电池,声卡,串口,NLED,USB HOST,HID,Printer,rNDIS,Mass Storage,PCMCIAHost,ATADisk,SerCard,GWES.exe,鼠标驱动,键盘驱动,触摸屏驱动,打印机驱动,显示驱动,FileSys.exe,文件系统驱动,图5.2 系统进程与其加载的驱动程序,北京理工大学珠海学院 计算机教研室,12,2022/12/4,Device.exe在Windows CE中称做设备管理器。负责加载和管理Windows CE下绝大多数的设备驱动程序,包括网卡驱动、电池驱动、声卡驱动、串口驱动、USB设备驱动及PCMCIA驱动等;GWES.exe通常是一些与图形界面相关的I/O设备驱动。例如鼠标键盘驱动、显卡的驱动及触摸屏驱动等。FileSys.exe在系统中负责管理Windows CE中的对象存储和文件系统。故FileSys.exe须负责加载所有的文件系统驱动程序。如FAT文件系统驱动和CDFS文件系统驱动等。,北京理工大学珠海学院 计算机教研室,13,2022/12/4,5.2.3 分层驱动程序与单体驱动程序,GWES,DDI函数,DDI函数,分层驱动程序,MDD,DDSI函数,PDD,单体驱动程序,硬件,图5.3 单体驱动程序与分层驱动程序,北京理工大学珠海学院 计算机教研室,14,2022/12/4,5.2.3.1 单体驱动程序即所有的驱动程序代码(包括中断处理、I/O操作及硬件控制等)都被放在一起。会暴露DDI接口(Device Driver Interface)给操作系统。DDI函数是操作系统与驱动程序交互的接口协议。5.2.3.2 分层驱动程序分两层:上面一层是模型设备驱动(Model Device Driver,MDD),下面一层是平台相关驱动(Platform Dependence Driver,PDD)MDD层包含某一类型的驱动程序所通用的代码;PDD层包含特定的硬件或平台专用的代码。操作系统访问硬件时,MDD层会调用特定的PDD函数PB会自带某类型驱动的MDD代码,无须修改;只须修改PDD层的代码。,驱动程序代码相对紧凑,对于效率要求较高的场合,可以选择。同时此模型相对清晰,北京理工大学珠海学院 计算机教研室,15,2022/12/4,给驱动程序分层后,MDD和PDD之间还需要一个接口协议。故分层驱动中有两类接口函数:操作系统与MDD之间的DDI与MDD和PDD之间的DDSI(Device Driver Service provider Interface)通常,MDD层的代码与PDD层的代码被编译成独立的静态LIB库,然后进行链接,形成可执行的驱动程序。MDD与PDD的划分只是在源代码逻辑层面,在驱动程序的二进制可执行代码中不存在分层概念MDD的特性:包含某一类驱动程序所通用的代码;调用PDD层访问硬件设备;与PDD层代码进行链接,定义PDD层必须实现的DDSI函数,并在代码中使用这些函数;对于操作系统实现DDI函数,供操作系统与驱动程序交互;,北京理工大学珠海学院 计算机教研室,16,2022/12/4,MDD的特性:进行中断处理;对于同一类型的驱动程序,代码可重用;编译后生成的lib库可与不同的PDD库进行链接;通常无须改动;中断处理线程IST通常位于这一层。PDD层的特性:包含与某款硬件相关的代码;对于不同的硬件产品或标准有不同的实现;只能与某一类MDD协同工作;实现MDD所需要的DDSI函数。在PB中自带的驱动程序中,声卡驱动程序的代码是典型的分层驱动程序例子。 %_WINCEROOT%PUBLICCOMMONOAKDRIVERSWAVEDEV目录下,北京理工大学珠海学院 计算机教研室,17,2022/12/4,5.2.4 Windows CE驱动程序的分类(P202)5.2.5 示例驱动程序代码PB自带了大量的驱动程序代码Production-Quality Device Driver(P205)特性不经修改就可在总线工作;尽量减少驱动程序在不同的硬件平台上移植所作的改动对于特定的驱动技术,实现尽量多的功能;在PB IDE的Catalog View中要有对应的可选项;对硬件设备所依赖的总线不作任何假设;对源代码有充分的注释;尽量使用Windows CE5.0的特性;尽量减少PDD的代码,使驱动程序更加方便移植;对于资源的分配,尽量使用注册表进行配置;提供可重用平台无关的库。,北京理工大学珠海学院 计算机教研室,18,2022/12/4,大部分驱动程序的代码放在目录%_WINCEROOT%PUBLICCOMMONOAKDRIVERS下,这些驱动程序都是与平台无关的。在BSP目录中也有一些驱动程序的代码,在目录%_WINCEROOT%PLATFORMSRCDRIVERS中,这些驱动都是与平台相关的。,北京理工大学珠海学院 计算机教研室,19,2022/12/4,EXE文件,比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,常常将所有模块的源代码都静态编译到整个应用程序EXE文件中。,北京理工大学珠海学院 计算机教研室,20,2022/12/4,EXE文件的软肋,源代码都静态编译到整个应用程序EXE文件中,会产生一些问题。一是增加了应用程序的大小,占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费。另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。,北京理工大学珠海学院 计算机教研室,21,2022/12/4,Windows CE中如何解决问题?,Windows CE中内存资源更少,甚至都没有硬盘,资源问题更为突出。Windows系统平台上提供了一种有效的编程和运行环境,你可以将独立的程序模块创建为较小的文件,并可对它们单独编译和测试。这些较小的模块就是动态链接库DLL。,北京理工大学珠海学院 计算机教研室,22,2022/12/4,Windows CE中的DLL,在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。Windows自己就将一些主要的系统功能以DLL模块的形式实现。,北京理工大学珠海学院 计算机教研室,23,2022/12/4,动态链接库(Dynamic Link Library),动态链接库缩写为DLL。DLL是一些编译过的可执行程序模块、数据或其他资源,可以被应用程序或其他DLL调用。DLL的应用非常广泛,可以实现多个应用程序的代码和资源共享。,北京理工大学珠海学院 计算机教研室,24,2022/12/4,动态链接库的组成,DLL是一种磁盘文件,以dll、DRV、FON、SYS和许多以EXE为扩展名的系统文件都可以是DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。,北京理工大学珠海学院 计算机教研室,25,2022/12/4,动态链接库的几点注意,DLL中包含各种导出函数,用于向外界提供服务。DLL有自己的数据段,但没有自己的堆栈,使用与调用它的程序相同的堆栈。一个DLL在内存中只有一个实例。DLL的编制与具体的编程语言及编译器无关。,北京理工大学珠海学院 计算机教研室,26,2022/12/4,动态链接库的特点,北京理工大学珠海学院 计算机教研室,27,2022/12/4,共享资源,共享代码、资源和数据。DLL不仅可以包含可执行的代码,还可以包括数据和各种资源等,扩大了库文件的使用范围。,北京理工大学珠海学院 计算机教研室,28,2022/12/4,方便应用程序的扩展,由于DLL能被应用程序动态载入内存。所以,应用程序可以在需要时才将DLL载入到内存中,这让程序的可维护性变得很高。比如微软的操作系统经常需要升级,微软的程序员不必将操作系统代码都重写一遍,只需将需要升级的相关DLL文件重写即可。,北京理工大学珠海学院 计算机教研室,29,2022/12/4,DLL与语言无关,一个小组成员共同完成一个软件项目。每个人所使用的编程工具并不同,每人负责的部分所使用的编程语言都不同,如何合作完成项目呢?使用DLL就可以解决这个问题,程序员提供自己完成代码的DLL即可,主程序调用这些DLL即可。,北京理工大学珠海学院 计算机教研室,30,2022/12/4,节省内存,如果多个应用程序调用的是同一个动态链接库,那么这个DLL文件不会被重复加载到内存中,而是由这些应用程序共享同一个已载入内存的DLL。在一个办公室中,一般大家会共用一个网络打印机,不会为每一个员工配置一台打印的。 在嵌入式系统中更有意义。,北京理工大学珠海学院 计算机教研室,31,2022/12/4,隐藏程序的细节,在某些情况下,用户可能想隐藏程序的源代码,就可以采用DLL来实现,DLL的例程可以被应用程序访问,而不显示其中代码的细节。可以有效地保护自己的知识产权。,北京理工大学珠海学院 计算机教研室,32,2022/12/4,节省内存,如果多个应用程序调用的是同一个动态链接库,那么这个DLL文件不会被重复加载到内存中,而是由这些应用程序共享同一个已载入内存的DLL。在一个办公室中,一般大家会共用一个网络打印机,不会为每一个员工配置一台打印的。 在嵌入式系统中更有意义。,北京理工大学珠海学院 计算机教研室,33,2022/12/4,动态链接库的实现,北京理工大学珠海学院 计算机教研室,34,2022/12/4,DLL入口函数,每一个DLL必须有一个入口点,DLLMain是一个缺省的入口函数。DLLMain负责初始化(Initialization)和结束(Termination)工作,每当一个新的进程或者该进程的新的线程访问DLL时,或者访问DLL的每一个进程或者线程不再使用DLL或者结束时,都会调用DLLMain。,北京理工大学珠海学院 计算机教研室,35,2022/12/4,DLLMain的函数原型,int WINAPI DLLMain(HINSTANCE hinstance,DWORD fdwReason,PVOID pvReserved )switch(fdwReason) case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:return TRUE;,北京理工大学珠海学院 计算机教研室,36,2022/12/4,DLLMain的函数的参数,hinstance是动态库被调用时所传递来的一个指向自己的句柄。fdwReason是一个说明动态库被调原因的标志。当进程或线程装入或卸载动态连接库的时候,操作系统调用入口函数,并说明动态连接库被调用的原因。它所有的可能值为DLL_PROCESS_ATTACH 进程被调用DLL_THREAD_ATTACH 线程被调用DLL_PROCESS_DETACH 进程被停止DLL_THREAD_DETACH 线程被停止lpReserved是一个被系统所保留的参数。,北京理工大学珠海学院 计算机教研室,37,2022/12/4,动态链接库的加载,北京理工大学珠海学院 计算机教研室,38,2022/12/4,动态链接库的加载,动态链接库的加载分为即静态加载方式和动态加载方式。静态加载方式是在编译程序代码时即完成对DLL的加载,应用程序结束时卸载DLL。动态加载方式是使用用API函数来加载和卸载DLL的。,北京理工大学珠海学院 计算机教研室,39,2022/12/4,动态链接库的静态加载,北京理工大学珠海学院 计算机教研室,40,2022/12/4,动态链接库的静态加载,静态加载方式由编译系统完成对DLL的加载。应用程序完成对DLL的卸载。加载方法简单,但不够灵活。,北京理工大学珠海学院 计算机教研室,41,2022/12/4,LIB文件用来做什么?,在生成一个DLL文件时,链接程序会自动生成一个与之对应的LIB文件。LIB文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。,北京理工大学珠海学院 计算机教研室,42,2022/12/4,编译应用程序,把生成动态连接库时生成的LIB文件和DLL文件加入到应用程序的工程中。通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件作为DLL的替代文件被编译到应用程序工程中。,北京理工大学珠海学院 计算机教研室,43,2022/12/4,DLL中函数的调用(1/2),当应用程序运行过程中需要加载DLL文件时,Windows CE根据LIB中的信息发现并加载DLL。然后通过符号名或标识号实现对DLL函数的动态调用。,北京理工大学珠海学院 计算机教研室,44,2022/12/4,DLL中函数的调用(2/2),所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载在到内存中。可执行程序直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。,北京理工大学珠海学院 计算机教研室,45,2022/12/4,DLL如何共享?,DLL静态加载后,系统会建立对该DLL的调用记录。如还有其它程序使用该动态链接库,则Windows CE对DLL的应用记录减1,直到所有相关程序都结束对该DLL的使用时才释放它。,北京理工大学珠海学院 计算机教研室,46,2022/12/4,DLL静态加载实例,利用PB或VS2005生成动态链库wcedll.dll和wcedll.lib文件。利用EVC创建一个测试工程wcetest,用以测试动态链接库的静态加载。,北京理工大学珠海学院 计算机教研室,47,2022/12/4,设置依赖关系,将两个库文件wcedll.dll和wcedll.lib拷贝到当前测试工程wcetest所在的文件夹下。选择Projects菜单,选择Setting,进入Link标签,在Category下拉框中找到Input,在Object/library modules编辑框中添加wcedll.lib一项内容。,北京理工大学珠海学院 计算机教研室,48,2022/12/4,运行测试代码,编译并下载wcetest.exe,保证代码没有错误。在目标平台上找到wcetest.exe应用程序,双击它,让其运行起来。通过EVC的Remote Process Viewer就可以看到wcetest.exe已经运行,而且wcedll.dll已经加载。,北京理工大学珠海学院 计算机教研室,49,2022/12/4,动态链接库的动态加载,北京理工大学珠海学院 计算机教研室,50,2022/12/4,动态链接库的动态加载,动态调用方式是由程序员编程使用API函数来加载和卸载DLL。使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。是一般常见的动态链接库的加载方法。在嵌入式系统中更为常见。,北京理工大学珠海学院 计算机教研室,51,2022/12/4,如何实现DLL动态调用?,在应用程序中用LoadLibrary显式的将自己所做的动态连接库调进来。用GetProcAddress()获取想要引入的函数。如同本应用程序自定义的函数一样来调用该引入函数。在应用程序退出之前,用FreeLibrary释放动态连接库。,北京理工大学珠海学院 计算机教研室,52,2022/12/4,DLL动态加载实例,利用EVC创建一个测试工程wcetest1,用以测试动态链接库的动态加载。与静态调用DLL相比,程序中增加以下代码添加wcedll动态链接库工程的实现函数的定义。利用LoadLibrary API函数动态加载动态链接库,利用GetProcAddress API函数获取需要引用的函数。,北京理工大学珠海学院 计算机教研室,53,2022/12/4,测试程序的源代码,#include typedef void (*printH) (void);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR szCmdLine,int iCmdShow) HANDLE hModule=LoadLibrary(TEXT(“wcedll.dll”); if(hModule=NULL) return 0; else printH PrintHello= (printH) GetProcAddress(hModule,TEXT(PrintHello); PrintHello(); FreeLibrary(TEXT(wcedll.dll); return 0;,北京理工大学珠海学院 计算机教研室,54,2022/12/4,运行测试代码,编译并下载wcetest1.exe,保证代码没有错误。在目标平台上找到wcetest1.exe应用程序,让其运行起来。通过EVC的Remote Process Viewer就可以看到wcetest1.exe已经运行而且wcedll.dll已经加载。,北京理工大学珠海学院 计算机教研室,55,2022/12/4,Windows CE如何定位DLL,定位DLL的搜索顺序包含EXE文件的目录 进程的当前工作目录 Windows CE系统目录 Windows CE目录列在Path环境变量中的一系列目录,

    注意事项

    本文(第十三讲驱动程序概述及模型课件.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开