ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:191.33KB ,
资源ID:8063276      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8063276.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验二线程同步调试实验.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验二线程同步调试实验.docx

1、实验二线程同步调试实验实验十一 驱动程序实验实验目的1、了解驱动程序的原理和功能;2、掌握流式接口驱动程序的结构;3、掌握编写流式接口的驱动程序的方法4、熟悉EVC和VS.Net的开发环境;实验仪器1、装有Platform Builder、EVC和VS.Net开发平台的PC机一台2、XSBase270实验开发平台一套实验原理1、硬件接口电路分析 XSBase目标板LED和七段数码显示接口电路如图6-1所示,74HC574为D锁存器,在时钟信号CLK作用下,该锁存器将输入信号进行锁存,即xQxD(x=18)。从电路图中可以看出,LED和八段数码显示电路将74HC574的时钟信号输入端作为片选信号

2、,其中LED显示的片选信号为LED_CS4、七段数码显示的片选信号为LED_CS1(另外还有一组七段数码显示未画出,参考原理图)。在七段数码显示电路中,数据的高位(D7、D15:即数码管的小数点dp段)用作七段数码的公共选通信号,通过控制PNP三极管来控制数码管的显示。图6-1 LED和七段数码显示接口电路 显示电路中的片选信号LED_CSx(x=1-4),由XSBase270目标板系统的处理器PXA270x 的地址信号BA22BA20通过3-8译码器LC138产生(如图2-2所示)。图 6-2 片选信号产生电路由3-8控制功能可知,当BA22、BA21、BA20101时产生LED显示电路的片

3、选信号LED_CS4,当BA22、BA21、BA20010、011、100时分别产生七段数码显示电路的片选信号LED_CS1、LED_CS2、LED_CS3(另外2组八段显示电路参考系统提供的总电路图)。根据分析,可以得出七段数码管和LED的片选信号为:LED_CS10x10200000、LED_CS20x10300000、LED_CS30x10400000,LED_CS4=0x10500000。2、流式接口驱动程序简介 驱动程序是对底层硬件的抽象。应用程序开发者不需要真正理解底层驱动的工作原理,他们只需要通过Windows CE提供的API函数,就可以直接与硬件进行交互。 WinCE的流式接

4、口驱动程序以动态链接库的形式存在,由设备管理器(通常是device.exe或者gwes.exe)统一加载、管理和卸载。与具有单独目的的内部设备驱动程序相比,所有流式接口驱动程序都是用同一接口并调用同一个函数集。 每个流式接口驱动程序必须实现一组标准的函数,用来完成标准的文件I/O函数和电源管理函数,这些函数提供给WinCE操作系统的内核使用。这些函数通常叫做流式接口驱动程序的DLL接口,如表11-1所示:(详细介绍参考实验三)表11-1 流式接口驱动程序要实现的DLL接口:函数名称描述XXX_Close在驱动程序关闭时应用程序通过CloseHandle函数调用这个函数XXX_Deinit当设备

5、管理器卸载一个驱动程序时调用这个函数XXX_Init当设备管理器初始化一个具体设备时调用这个函数.XXX_IOControl上层的软件通过DeviceIoControl函数可以调用这个函数XXX_Open在打开一个设备驱动程序时应用程序通过CreateFile函数调用这个函数XXX_PowerDown在系统调用前调用这个函数XXX_PowerUp在系统从新启动前调用这个函数XXX_Read在一个设备驱动程序处于打开状态时由应用程序通过ReadFile函数调用XXX_Seek对设备的数据指针进行操作,由应用程序通过SetFilePointer函数调用XXX_Write在一个设备驱动程序处于打开状

6、态时由应用程序通过WriteFile函数调用. 3、LED流式接口驱动程序的实现 由于在WinCE中流式接口驱动程序以DLL的形式存在,是运行在用户模式的动态链接库,所以既可以使用微软提供的EVC编写流式接口驱动程序,也可以使用Platform Builder(PB)来进行编写。为了方便调试,通常采用PB来开发流式驱动程序。下面具体介绍LED驱动程序为例介绍采用PB编写流式接口设备驱动程序的方法和步骤。3.1 流式驱动程序的创建步骤:(1)打开Platform Builder。在Platform Builder中选择“File”-“New Project or File”,创建一个“Windo

7、ws CE Dynamic link library”项目,项目的名称填写“LedDriver”(如图11-1所示)图 11-1 WinCE 驱动创建项目界面(2)按OK按钮,在DLL的类型界面中(如图11-2所示)选中A Simple Windows CE DLL projects,Platform Builder将生成DLL框架代码。图 11-2 驱动程序的DLL类型选择3.2 LED流式驱动程序的源代码分析:(1)变量定义#define LED_IOCTL_SET 0x00000001 /IO控制接口代号码#define Light_IOCTL_Set 0x00000002#define

8、 Light_IOCTL_LShift 0x00000003#define Light_IOCTL_RShift 0x00000004#define Light_IOCTL_LRShift 0x00000005#define Light_IOCTL_ShiftStop 0x00000006#define Light_IOCTL_SetTime 0x00000007#define LED_BASEADDR1 0x10200000 /七段数码的物理地址#define LED_BASEADDR2 0x10300000#define LED_BASEADDR3 0x10400000#define pL

9、ightIoBaseAddress 0x10500000 /Led 物理地址#define BIT7 (0x17)#define BIT15 (0x18),0x400,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL) VirtualFree(PVOID)pLightReg,0,MEM_RELEASE); pLightReg = NULL; RETAILMSG(1,(TEXT(VirtualCopy() failed!rn); return FALSE; if (!v_pLEDBaseAddr|!pLightReg) DEBUGMSG(1,(TEXT(Virt

10、ual copy Error ,Error code=%urn),GetLastError(); return (FALSE); WRITE_PORT_USHORT(v_pLEDBaseAddr0,0xffff); WRITE_PORT_USHORT(v_pLEDBaseAddr1,0xffff); WRITE_PORT_USHORT(v_pLEDBaseAddr2,0xffff); *pLightReg =black; return TRUE;(3)驱动程序卸载函数DEM_Deinit:当设备管理器卸载一个驱动程序时调用驱动程序卸载函数XXX_Deinit,该函数完成对系统资源的回收。BOO

11、L DEM_Deinit(DWORD hDeviceContext) UINT i=0; RETAILMSG(1,(TEXT(DEM_Deinitrn); for(i=0;i3;i+) MmUnmapIoSpace(v_pLEDBaseAddri,0); v_pLEDBaseAddri = NULL; if (pLightReg) MmUnmapIoSpace(pLightReg,0); pLightReg = NULL; if(m_hShiftEvent) CloseHandle(m_hShiftEvent); return TRUE;(4)驱动程序的读写操作DEM_Read、DEM_Wri

12、te:当一个流式接口驱动程序已经打开后,可以使用ReadFile()函数和WriteFile()函数对这个设备进行读写操作。该驱动程序的读操作完成将LED的亮灭的情况输出,应用程序通过ReadFile()函数,写操作函数对四个七段数码管进行点亮。具体实现函数如下:DWORD DEM_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) UINT temp; temp=(UINT)ShiftData; RETAILMSG(1,(TEXT(LED_Read rn hOpenContext=%d;*pBuffer=%d; Count=%drn),

13、hOpenContext,temp,Count); *(UINT*)pBuffer=temp; return TRUE;DWORD DEM_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes) INT buf=*(INT*)pSourceBytes; USHORT Data; RETAILMSG(1,(TEXT(DEM_Writern hOpenContext=%d;*pSourceBytes=%d;NumberOfBytes=%drn),hOpenContext,buf,NumberOfBytes); buf

14、=buf%10000; Data=NumDatabuf/1000; buf=buf%1000; Data|=NumDatabuf/1008; WRITE_PORT_USHORT(v_pLEDBaseAddr1,(Data|BIT7|BIT15); buf=buf%100; Data=NumDatabuf/10; buf=buf%10; Data|=NumDatabuf8; WRITE_PORT_USHORT(v_pLEDBaseAddr2,(Data|BIT7|BIT15); return TRUE;(5)IO控制函数DEM_IOControlXXX_IOControl通常用于向设备发送一个命

15、令,应用程序使用DeviceIOControl函数来通知操作系统调用该函数。LED驱动程序的DEM_IOControl函数主要完成对八个LED发光二极管的流水左移、流水右移、流水循环、流水停止、点亮设置、流水移动时间间隔进行控制,采用线程完成流水操作。BOOL DEM_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIN, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) char Data; HANDLE m_hShiftThread=NULL; R

16、ETAILMSG(1,(TEXT(LED_IOControlrn hOpenContext=%d;dwCode=%drn),hOpenContext,dwCode); m_hShiftThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)LedShiftThread,NULL,0,NULL); switch(dwCode) case Light_IOCTL_LShift: m_ShiftDir=1; SetEvent (m_hShiftEvent); break; case Light_IOCTL_RShift: m_ShiftDir=2; Se

17、tEvent (m_hShiftEvent); break; case Light_IOCTL_LRShift: m_ShiftDir=3; SetEvent (m_hShiftEvent); break; case Light_IOCTL_Set: Data=*(char*)pBufIn; *pLightReg=Data; break; case Light_IOCTL_ShiftStop: m_bStop=TRUE; break; case Light_IOCTL_SetTime: ShiftTime=*(UINT*)pBufIn; break; CloseHandle(m_hShiftT

18、hread); return TRUE;INT WINAPI LedShiftThread(void) UINT i=0; WaitForSingleObject(m_hShiftEvent,INFINITE); while(1) switch(m_ShiftDir) case 1: ShiftData=0x01; for(i=0;i8;i+) *pLightReg=ShiftData; Sleep(ShiftTime); ShiftData=ShiftData1; if(m_bStop) *pLightReg=0xff; m_bStop=FALSE; return 0; break; cas

19、e 2: ShiftData=0x80; for(i=0;i1; if(m_bStop) *pLightReg=0xff; m_bStop=FALSE; return 0; break; case 3: ShiftData=0x01; for(i=0;i8;i+) *pLightReg=ShiftData; Sleep(ShiftTime); ShiftData=ShiftData1; if(m_bStop) *pLightReg=0xff; m_bStop=FALSE; return 0; ShiftData=0x80; for(i=0;i1; if(m_bStop) *pLightReg=

20、0xff; m_bStop=FALSE; return 0; break; default: m_bStop=FALSE; return 0; break; return 0; 其他实现函数如:DEM_Open、DEM_PowerDown、DEM_PowerUp、DEM_Seek、DEM_Close参考提供的源代码文档。(6)添加导出函数的定义。在Platform Builder菜单中,选择File-New Project or File - File Tab -Text File,文件名叫“LedDriver.def”,内容如下:LIBRARY LedDriverEXPORTS DEM_In

21、it DEM_Deinit DEM_Open DEM_Read DEM_Write DEM_PowerDown DEM_PowerUp DEM_Seek DEM_IOControl DEM_Close(7)编译驱动程序项目。结束后选择“Build OS”-“Open Build Release Directory”,然后输入命令:dumpbin /exports LedDriver.dll,确保输出结果如图11-3,表示驱动程序的DLL函数被正确导出。图 11-3 驱动程序的函数导出图3.2 LED流式驱动程序的加载:(1)选择“Build OS”-“Open Build Release Di

22、rectory”,利用文本编辑器notepad修改平台的注册文件platform.reg,在文件最后添加如下内容:HKEY_LOCAL_MACHINEDriversBuiltInLedDriver Dll = LedDriver.Dll Prefix = DEM Index = dword:1 Order = dword:0 FriendlyName = LED Driver 这段注册表信息告诉系统,在系统启动的时候把LedDriver.dll加载到device.exe,驱动的前缀是DEM,下标索引是1,这样,应用程序中可以使用CreateFile(LDEM)这样的方式来访问驱动程序了。(2)

23、驱动程序固化选择“Build OS”-“Open Build Release Directory”,利用文本编辑器notepad修改平台的配置文件platform.bib,将驱动程序LedDriver.dll文件固化到映像文件中在文件,在platform.bib文件中具体添加内容如下:LedDriver.dll $(_FLATRELEASEDIR)LedDriver.dll NK SH、生成映像文件选择“Build OS”-“Make Run-Time Image”生成映像文件,然后下载到目标板中。4、LED流式接口驱动程序的应用测试利用VS.net编写一个驱动程序的应用测试程序DriverA

24、pp。具体实现如下: 打开设备void CDriverAppDlg:OnBnClickedbtnopendevice() TCHAR FileName10=TEXT(DEM1:); m_hFile=CreateFile(LPCTSTR)&FileName,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(m_hFile=NULL) MessageBox(_T(打开LED设备失败!),_T(系统信息),MB_OK|MB_ICONINFORMATION); LED流水灯左移void CDriverAppDlg:OnBnClickedbtnlshift() if(m_hFile) if(!DeviceIoControl(m_hFile,Light_IOCTL_RShift,NULL,0,NULL,0,NULL,NULL) MessageBox(_

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1