WinCE驱动开发问题精华集锦_第1页
WinCE驱动开发问题精华集锦_第2页
WinCE驱动开发问题精华集锦_第3页
WinCE驱动开发问题精华集锦_第4页
WinCE驱动开发问题精华集锦_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、如何让系统加载自己写的驱动程序? 两种办法: 1、在HKEY_LOCAL_MACHINEDriversBuiltIn下添加注册键。 2、在应用程序中调用ActivateDeviceEx。 在一些文件中用分号来表示注释,例如下面的内容 ;CESYSGENIFSERVERS_MODULES_HTTPD ;CESYSGENENDIF 在“CESYSGEN.”前加了“”,有没有什么特别的含义? 在WINCE的一些文件中,用“;”作为注释并在注释文字中用CESYSGEN作为标记,后面接条件语句。Cefilter.exe工具负责按照条件来筛选文件内容,所以不要轻易地删除包含CESYSGEN的注释语句。 通

2、过串口建立ActiveSync联接,串口线用三线的可以吗? 不可以,因为用串口同步时要用到其余口的状态。 WINCE是否支持MAPI? 不支持。WINCE自带的pmail.exe软件也不是很好用。建议自开发邮件收发软件。如果需要购买WINCE下邮件收发软件可以联系我。 如何旋转屏幕显示的内容? 例子代码如下(前提是显示驱动程序支持旋转): DEVMODEdevmode=0; devmode.dmSize=sizeof(DEVMODE); devmode.dmDisplayOrientation=DMDO_90;/垂直模式 devmode.dmFields=DM_DISPLAYORIENTATI

3、ON; ChangeDisplaySettingsEx(NULL,&devmode,NULL,0,NULL);/改变显示的设置 CRectrcWorkArea(0,0,320,240);/整个屏幕尺寸 /设置客户区大小并广播消息,这样所有软件也就随之更改显示 SystemParametersInfo(SPI_SETWORKAREA,0,(void*)&rcWorkArea,SPIF_SENDCHANGE); 请问如何修改字形缓存的容量? HKEY_LOCAL_MACHINESystemGDIGLYPHCACHE limit=dword:0400 如何得到从WINCE启动开始到现在的时间? 调用

4、APIGetTickCount,得到的值为32位整数,单位为毫秒。 如何调用WINCE的软键盘? 调用APISipShowIM(SIPF_ON),前提是内核加入了软键盘组件。 基于HIVE的注册表,如何在系统关闭前保存注册表的数据到文件system.hv? 调用APIRegFlushKey函数。 使用VirtualAlloc和VirtualCopy的时候需要注意哪些事项? 1、VirtualAlloc的作用是申请虚拟地址空间,这肯定不是最终的目的,最终目的可能是申请物理内存、映射寄存器、提交文件等。没有一个目的会在意虚拟地址空间的位置,所以尽量传递参数1为0,也就是让WINCE自动分配虚拟地址

5、空间。VirtualAlloc分配地址空间实际上是以64KB为单位,所以要指定申请的虚拟空间的首地址的话,参数1应该为64KB的整数倍,申请的长度也应该为64KB的整数倍,即使你不需要那么大。 2、VirtualCopy的主要作用是映射物理地址空间,如果参数2为物理地址,那么最后一个参数要添加PAGE_PHYSICAL,参数2必须是256的整数倍。如果参数2为虚拟地址(0x以上),那么最后一个参数就不要添加PAGE_PHYSICAL,WINCE内核会根据这个虚拟地址找到对应的物理地址。 驱动程序和应用程序之间传递数据时何时调用MapPtrToProcess? 因为设备管理器负责加载驱动程序DL

6、L,这意味着当应用程序调用驱动程序接口函数的时候,WINCE内核会将调用驱动程序接口函数的线程转移到设备管理器的进程空间然后执行具体的驱动程序代码,应用程序和设备管理器处于两个进程空间,这就造成设备管理器无法访问应用程序传递的指针(虚拟地址),所以当我们在应用程序中传递指针给流驱动程序接口函数时,WINCE内核从中作了一个地址映射,例如ReadFile、WriteFile、DeviceIoControl函数的参数凡是指针都经过了映射才传递给驱动程序,所以很多驱动程序开发者并不了解其中的奥秘就可以编程了。但是如果参数是一个指向一个结构体的指针,而结构体里包括一个或多个指针,那么WINCE内核并不

7、负责映射,所以就需要开发者在驱动程序接口函数中调用API函数MapPtrToProcess来映射地址。例如:pPointer_retval=MapPtrToProcess(pPointer,GetCallerProcess(); 如何判断可插拔的设备是否存在? 1、通过查找注册表的值。凡是由APIActivateDeviceEx加载的驱动程序都在HKEY_LOCAL_MACHINEDriversActive键下有注册键,通过查找“name”或者其它键值就能够找到。设备管理器就调用这个API。如果是PCI设备,在注册表HLMDriversBuiltInPCIInstance下查找关键字,例如HL

8、MDriversBuiltInPCIInstanceWaveDev1,说明音频驱动已经加载。 2、调用驱动程序接口函数,根据返回值或者执行结果来判断。 如何做到通过串口过来的一个信号启动自己开发的应用程序? 创建一个线程负责等待串口过来的信号,调用APISetCommMask设置要等待的信号种类,具体可以等待的信号种类参见参数2的说明。然后再调用APIWaitCommEvent函数等待这个信号,接收之后再调用APICreateProcess启动应用程序。 在WINCE中如何只能启动应用程序的一个实例? 常用的两种办法: 1、如果应用程序实例创建了窗口,可通过APIFindWindow函数通过窗

9、口类名和窗口标题名称来查找,前提是系统内不会出现窗口名称重复的情况。 2、应用程序初始化的时候创建一个事件或互斥等内核对象,因为内核对象是由内核创建,名称在系统内唯一。 能不能自己编辑一个数字签名文件导入到手机上,这样就可以用这个签名签自己的程序了? WINCE的内核签名机制的用途是限制非法的可执行模块EXE、DLL等在设备上运行。要求内核的加载模块用公钥验证请求加载的EXE、DLL的签名是否合法,而这个公钥是在定制内核的时候加进去的,所以除内核的定制者以外的人无法修改这个验证机制。 我按照版主的文章加密WINCE系统里操作,提示错误如下: ErrorduringCryptSignHash1!

10、 Errorsigninghash 这是因为传递了无效的钥容器名称,使CryptoAPI调用失败。应该在使用signfile工具之前创建一个钥容器,在桌面Windows中调用APICryptAcquireContext创建一个指定名称的钥容器,接着再创建一个签名密钥对,这时再使用signfile工具就可以了。我在文章里写成-kfulinlin是因为我创建钥容器的时候没有指定名称,系统就采用当前登录的用户名为容器名。 编译错误:CVTRES:fatalerrorCVT1102:outofmemory;42bytesrequired? 多数情况下出现这种错误是因EVC的bug而起,应该在安装EVC

11、之后就立刻安装EVC的SP补丁。另外为了避开BUG,使用EVC编程应该养成一些习惯,比如定期备份工程所有文件,每次编译时采用Clean+RebuildAll,正调试时不要关闭模拟器等等。 在WINCE下是否能够得到某一进程使用的物理内存总量? 目前没发现有这样一个API能够得到指定进程使用的物理内存总量。只有GlobalMemoryStatus能够得到整个系统使用的物理内存总量。 应用程序如何控制lcd的亮度?如何获得电池的电量? 从常见的平台如Geode、三星ARM系列来看,的确在驱动方面没有统一的控制LCD或者其它种类屏幕亮度的接口函数,所以只能根据具体平台提供的接口来做。从帮助文档来看微

12、软的带有DirectDraw功能的显示驱动程序的确有标准的增加亮度的接口函数,关于背景光参见标题为“EnablingaBacklight”的帮助文档。 获得电池电量有标准的接口函数GetSystemPowerStatusEx,前提是驱动程序和硬件都要支持。 WINCE的socket函数好像不支持发送/接收超时? 是的,最早版本的WINCE支持选项SO_RCVTIMEO、SO_SNDTIMEO,后来却不支持了。 WINCE下如何设置窗口最大化和最小化? WINCE的帮助文档在介绍APIShowWindow函数的参数时指出SW_MAXIMIZE,SW_MINIMIZE,SW_RESTORE,SW_

13、SHOWDEFAULT,SW_SHOWMAXIMIZED,SW_SHOWMINIMIZED,SW_SHOWMINNOACTIVE都不被支持,但实际上并不完全是这样,具体来说: SW_MAXIMIZE比原来窗口大,但不是最大化 SW_MINIMIZE编译成功,但是不起作用 SW_SHOWMAXIMIZED最大化 SW_SHOWMINIMIZED编译出错 SW_RESTORE能恢复 SW_SHOWDEFAULT编译出错 SW_SHOWMINNOACTIVE编译出错 SW_HIDE能够隐藏 如何用程序调用控制面板的触摸屏校对程序? 两种办法: 1、调用APITouchCalibrate函数 2、调用

14、CreateProcess,参数1为Lwindowsctlpnl.exe,参数2为Lcplmain.cpl,9。 如何获得U盘或者其它类型的存储器总容量和剩余可用容量? 调用APIGetStoreInfo得到扇区数、每扇区字节数,相乘即是总容量。调用APIGetDiskFreeSpaceEx得到剩余可用容量。 三星2440头文件定义#defineIIC_BASE0xB/,datasheet是,那么怎么转成0xB? 物理地址映射方法分为两种,一种静态映射另一种为动态映射。在OEMAddressTable中定义了物理地址与虚拟地址的映射关系属于静态映射,用VirtualCopy映射属于动态映射,采

15、用哪种办法都可以。问题中提到的属于静态映射,2440的BSP在map.a文件中定义了IIC控制寄存器的物理起始地址和对应的虚拟地址如下: DCD0x,0x,1; 在OEMAddressTable中定义的虚拟地址范围在0x800000000x9FFFFFFF,这部分可缓存,适合内核程序和应用程序使用,同时WINCE内核在0xA00000000xBFFFFFFF中映射了另一份,指向了同样的物理地址,这部分不可缓存,适合驱动程序使用。三星ARM处理器带有L1级高速缓存,可缓存会提高执行效率。对于特殊的设备寄存器适合映射到不可缓存的虚拟地址。 当驱动程序调用VirtualCopy对0xB地址读写时,W

16、INCE自动将这个地址减去0x20000000,也就是0x,对应的物理地址就是0x,也就是IIC控制寄存器的物理起始地址。 基于RAM的注册表如何保存数据? 调用APIRegCopyFile备份注册表。调用APIRegRestoreFile恢复注册表,然后调用KernelIoControl热启动使恢复生效。 如何隐藏和显示winCE下标准外壳的任务栏? HANDLEhTaskBar=FindWindow(LHHTaskBar,NULL); ShowWindow(hTaskBar,SW_HIDE); ShowWindow(hTaskBar,SW_SHOWNORMAL); 如果能让WINCE的IE

17、浏览器播放flash动画? 播放flash需要MacromediaFlashPlayerSDK,参见 WINCE下内核模式和用户模式有什么区别? 为了使读者能够详细了解WINCE的地址映射原理还有两种模式,在这里我分几个部分说明: 1、WINCE内核nk.exe的任务是管理操作系统核心功能。按照OEMAddressTable的映射要求,所有物理地址都映射到0x以上,所以对于内核程序nk.exe和内核模式下的线程来说,只要访问0x以上的有效虚拟地址经MMU就能够访问物理地址,无需再映射是内核模式的一个特点。内核模式的第二个特点是没有地址访问限制,内核模式线程可以访问任何有效虚拟地址,所谓有效虚拟

18、地址是指有实际事物对应。 2、用户模式线程只能访问0x以下的虚拟地址空间,WINCE6.0之前版本的内核为每个进程划分32MB的地址空间,在不调用特殊函数的情况下不能相互访问,这样的设计使得WINCE系统更安全、更稳定,限制访问地址是用户模式的第一个特点。第二个特点就是需要多一层映射,如果线程要访问物理内存的话需要先映射到0x以上,再经MMU访问物理内存地址。 WINCE的线程具有转移性(参考APIGetCallerProcess的说明,有一个很好的例子),当应用程序的线程调用API或者调用驱动程序接口函数时,该线程会转移到gwes.exe、device.exe、filesys.exe等进程中

19、执行,转移是由WINCE内核操作的,它会修改线程的上下文,记录线程的当前进程、调用者进程、拥有者进程三个值。 3、如果在定制内核的时候选择了“FullKernelMode”,那么在这个内核上运行的所有线程都处于内核模式,即使调用SetKMode(FALSE)后线程仍然具有内核模式的特点,能够访问任何有效的虚拟地址。假设现有一个64MBRAM的WINCE产品,RAM映射从0x到0x,如果线程处于内核模式,它就直接可以访问这个范围的虚拟地址: 在OnButton1()中编写 DWORDoldMode=SetKMode(FALSE); volatileint*piTemp=(volatileint*

20、)(0x+0x-0x);/或者(0x-0x) *piTemp=12345; 在OnButton2()中编写 DWORDoldMode=SetKMode(FALSE); volatileint*piTemp=(volatileint*)(0x+0x-0x);/或者(0x-0x) intiTemp=*piTemp; 先只执行OnButton1()然后关闭程序,再重启程序然后执行OnButton2(),iTemp仍然等于12345。结果说明了两点:内核模式线程可以直接访问0x以上的有效虚拟地址;我们写到RAM中的数据没有丢失,说明虚拟地址有效。 如果在定制内核的时候没有选择“FullKernelMo

21、de”,那么在这个内核上运行的所有线程都处于用户模式。可以调用SetKMode(TRUE)使调用线程暂时处于内核模式,还是原来的假设环境,我再举个例子: 在OnButton1()中编写 DWORDoldMode=SetKMode(TRUE); volatileint*piTemp=(volatileint*)(0x+0x-0x);/或者(0x-0x) *piTemp=12345; 在用户模式下,如果不调用SetKMode(TRUE),那么执行*piTemp=12345一定会弹出对话框,提示地址访问非法,如果调用SetKMode(TRUE)就不会提示地址访问非法,而且在OnButton2()中仍

22、然能得到12345这个值。 通过这两个例子我相信读者能够完全了解两种模式的区别了。 4、WINCE提供了两个函数SetKMode和SetProcPermissions,其中SetKMode能够把调用线程切换到内核模式,还可以切换回用户模式。SetProcPermissions+GetCurrentPermissions添加当前进程访问权限给调用线程,SetProcPermissions(0xFFFFFFFF)能让调用线程访问所有进程空间,但是调用线程仍然处于用户模式。SetKMode和SetProcPermissions函数使得用户模式的特点不那么明晰。 如上所说一个应用程序的线程可能转移到其

23、它两个进程地址空间中读写数据,而每一个线程在被创建的时候只有访问创建它的进程地址空间的权限,所以驱动程序开发者必须在驱动程序读写数据前调用SetKMode或者SetProcPermissions增加调用此函数的线程访问其它进程空间的权限。如果一个应用程序的线程只转移到一个进程地址空间,一般为设备管理器进程device.exe,这种情况下不必增加线程访问其它进程空间的权限,但如果驱动程序本身创建了一个线程,那还是要调用SetKMode或者SetProcPermissions增加新的线程访问其它进程的权限的,因为驱动程序创建线程时,当前进程为设备管理器,所以新线程只具有访问设备管理器进程空间的权限

24、,而不具备访问应用程序进程空间的权限。 5、可能一个编写过简单的流驱动的初学者会很疑惑,因为开发一个简单的流驱动程序根本不需要调用这些函数,也没有调用过MapPtrToProcess,那是因为如果标准流驱动接口函数的参数为指针(ReadFile、WriteFile、DeviceIoControl参数都有指针),WINCE内核会自动映射指针包含的地址,但仅此而已,其余任何情况都要求开发者自行处理,比如流接口函数的参数是一个指向结构体的指针PA,而结构体中包括指针PB,PB指针就必须在流接口函数中映射,映射后才能访问,否则就会造成地址访问非法。所以结构体中每个指针都要映射。 为了让读者能了解其中的

25、原因,我举个例子: 假设设备管理器被加载到Slot4,应用程序A被加载到Slot8,A只有一个主线程T,T开始执行,按照WINCE的规定,正获得CPU的进程必须映射到Slot0,那么在执行代码的时候A的所有虚拟地址都被减去一个偏移值,也就是80x,A调用DeviceIoControl,传递一个指向一个结构体的指针B,而这个结构体中包含一个指针C,指针C包含的地址假设为0x,当执行DeviceIoControl时WINCE把设备管理器的进程地址空间映射到Slot0,因为放在注册表HKLMDriversBuiltIn下的驱动程序是由设备管理器加载的,自然驱动程序的代码段被加载到设备管理器进程空间,

26、但是线程仍然是T,此时T的当前所在进程为设备管理器(CurrentProcess),A变成了T的调用者进程(CallerProcess),T自动具有了访问调用者进程空间的权限。这时访问Slot0中的虚拟地址其实质就是访问设备管理器的进程地址空间,要把地址加上一个偏移值,也就是40x,所以DeviceIoControl访问指针C包含的地址时本应该加上80x,却加上40x,结果地址并不是设备管理器的合法区域,系统就会提示地址访问非法。而如果做了一个映射,指针C包含的地址就会被加一个正确的偏移值,使地址处于A的地址空间Slot8中,T此时具有访问A进程空间的权限,访问到正确的虚拟地址当然会得到正确的

27、数据了。 为什么WINCE目录下的例子用build+sysgen能够编译成EXE文件,而我添加的例子就不能编译呢? 如果这个例子是一个应用程序,那么肯定包括代码文件(.h.c.cpp)和资源文件(.rc和其它资源文件),build工具根据source文件内容把代码文件编译成lib文件,资源文件编译成.res文件,sysgen工具根据makefile文件内容将source文件中列出的需要链接的各个库文件合并成一个EXE文件。所以说关键在于makefile文件,WINCE目录下凡是能够用build+sysgen编译的都在makefile中有如何链接的设置,而我们添加的例子当然没有在makefile

28、中找到如何链接的设置,nmake工具就会提示不知道如何创建。 pcienum.exe干什么用的? 如果你要开发某一个PCI设备的驱动程序,首先要知道这个PCI设备的信息(如VendorID、DeviceID、BaseClass、SubClass)和PCI总线的信息。运行这个pcienum.exe就能得到相关信息。pcienum.exe提供了源码,位置PublicCommonOakDriversCeddkTestPcienum。 wince下如何让操作系统进入待机模式?又如何把它激活? 通过注册表就可以设置,前提是你的驱动和硬件都支持。注册表项参见标题为“GWESSuspendTime-outs

29、”的帮助文档。 HKEY_LOCAL_MACHINESystemCurrentControlSetControlPower BattPowerOff=dword:300 ExtPowerOff=dword:0 WakeupPowerOff=dword:60 ScreenPowerOff=dword:0 现有一个GPRS模块,如何通过GPRS连接到Internet? 1、先在内核中加入WAN下面的几个组件,如RAS/PPP、TAPI。WINCE采用unimodem驱动,所以不必担心没有Modem驱动的支持。 2、WINCE启动后新建一个拨号连接,比如名称叫“gprs1”,输入用户名、密码、电话号

30、码。电话号码不同,所采用的模式不一样,例如“*99#”是GPRS模式,“17201”是普通的数据模式,速度差很多,价钱也差很多。 3、开始连接,连接过程会在对话框中显示,直到显示“连接成功”。 4、打开浏览器或者自己开发的通讯软件测试网络连接情况。 5、关闭连接。 6、保存HKEY_CURRENT_USERCommRasBookgprs1下的所有数据,添加到project.reg中,重新编译后内核中就有了一个拨号连接“gprs1”。 7、调用RAS函数可以修改拨号连接“gprs1”的参数,如用户名、密码、电话号码,但是不能修改硬件设置,如波特率、串口、数据位、停止位等。RAS函数还能够拨号、挂

31、断。为了修改波特率可以多保存几个拨号连接,也可以直接调用TAPI开发拨号软件,另外WINCE自带的拨号连接是有源码的,位置在PUBLICCOMMONOAKDRIVERSNETSAMPCONNMC。 采用基于HIVE的注册表如何删除用户保存在注册表中的数据,恢复到出厂时的注册表? 用户修改的数据保存在user.hv文件中,直接删除一定失败,所以不能通过删除文件实现恢复出厂设置。微软考虑到了这个问题,在WINCE启动过程中filesys.exe加载注册表时会调用OEMIoControl函数并传递一个IOCTL,这个IOCTL在pkfuncs.h中定义如下: #defineIOCTL_HAL_GET

32、_HIVE_CLEAN_FLAGCTL_CODE(FILE_DEVICE_HAL,49,METHOD_BUFFERED,FILE_ANY_ACCESS) filesys.exe会分别传递参数HIVECLEANFLAG_SYSTEM和HIVECLEANFLAG_USERS,如果返回值为TRUE那么filesys.exe清除原来的注册表文件,如果返回值为FALSE那么filesys.exe保留原来的注册表文件。默认WINCE并没有实现这个IOCTL,所以OEM要删除注册表文件就必须先编写这个IOCTL代码。代码的例子可参考标题为“IOCTL_HAL_GET_HIVE_CLEAN_FLAG”的帮助文

33、档。另外必须在ioctl.h和ioctl.c两个文件中编写该代码。在ioctl.c文件中找到constOAL_IOCTL_HANDLERg_oalIoCtlTable,添加IOCTL和对应的处理函数。要进一步了解这个全局数组,参见标题为“IOCTLLibrary”的帮助文档。 如何在不删除必要组件的前提下减小内核文件长度? 要减小内核文件长度首先要在使用PB的定制内核向导中选择自定义,也就是说对于每个组件都由自己来选择,而不是选择PB的标准配置。但减小内核文件长度最有效最直接的办法是缩小字体,尤其对于东亚字体,采用字体压缩技术并且选择合理的字库文件将明显缩小文件长度。 1、在定制内核时选择AG

34、FAAC3FontCompression组件。SYSGEN变量为SYSGEN_AGFA_FONT。 2、参考标题为“EastAsianFontVersions”的帮助文档,从中选择你需要的字库文件加到内核中,从文档可以看出加AC3压缩比不加压缩在文件长度方面差距很大。 如何得到WAV文件播放的总时间? 1、直接读取wav文件头信息,从文件起始地址偏移28个字节长度为4个字节保存的是每秒钟播放的字节数,从文件起始地址偏移40个字节长度为4个字节保存的是声音数据的总的字节数,相除就是播放时间。 2、调用IGraphBuilder:RenderFile打开一个wav文件,然后通过IGraphBuil

35、der得到IMediaSeeking指针,再调用IMediaSeeking:GetDuration得到总的时间(结果要除以),IMediaSeeking:GetCurrentPosition得到当前播放时间。 如何在Dialog-Based程序中加入menubar? 先调用CommandBar_Create再调用CommandBar_InsertMenubar。 请问MultiByteToWideChar与_T、L、TEXT的区别? MultiByteToWideChar函数转换的对象可以是常量也可以是变量。其它只能转换常量。_T和TEXT会根据当前系统是否定义_UNICODE宏来决定是否转换

36、,而L就是转换成宽字符,当然也包括其他类型常量的转换。 在用UBS线缆通过ActiveSync同步有效的情况下,如何插上USB线缆后WINCE自动与PC同步? 1、新建一个拨号连接,假设名称为“usb1”,选择连接类型为“直接连接”,并在连接设备里选择通过USB线缆连接。 2、将注册表HKEY_CURRENT_USERCommRasBookusb1下的数据添加到project.reg或者platform.reg中。 3、在HKEY_CURRENT_USERControlPanelComm下添加如下: AutoCnct=dword:1/直接连接 Cnct=usb1/连接名称 4、重新编译内核。为

37、了节省编译时间也可以在内核工程下搜索*.reg文件,将2、3步骤中的注册表数据添加其中,然后直接makeimage。 如何通过进程句柄来获得该进程的主窗口句柄? 好像没有API能够通过进程句柄直接获得主窗口的句柄,因为并非每个应用程序都带UI。但是可以反过来,先枚举当前系统所有主窗口,然后根据每个窗口的句柄调用GetWindowThreadProcessId函数得到进程的ID,再调用OpenProcess得到进程句柄,与现有的进程句柄比较。 我做的显示驱动DLL已经编译成功了,但是在加载显示驱动的过程中弹出话框,提示如下: unhandledexceptioningwes.exe(0xcacc

38、essviolation) 提示的错误地址访问非法,表明你的驱动程序代码并没有在读写数据前添加SetKMode(TRUE)或者SetProcPermissions(0xFFFFFFFF)函数让线程能够访问任何进程的地址空间。你可以调用IsBadReadPtr和IsBadWritePtr函数检测地址是否能够合法访问。编写和gwes有关的驱动程序应该首先调用SetKMode(TRUE)或者SetProcPermissions(0xFFFFFFFF)函数,这是一个好习惯。 请问在嵌入式系统中如何设置GPRS拔号用的APN? 对一个拨号连接比如“我的连接”单击鼠标右键,在弹出的菜单中选择“属性”,然后

39、单击“配置”“拨号选项”,在“附加设置”中添加AT命令如“+cgdcont=1,ip,cmnet”。“cmnet”位置即为APN。 WINCE的IPPhone功能如何? WINCE的voip需要c-s-c结构,既需要服务器的中转,而skype采用第三代p2p技术就不需要中转,但是在gprs下也做不到语音流畅。skype有pocketpc版本,但是无线方面需要wlan或者cdma。 三星ARM平台如何定义自己的中断ID? 以S3C2410为例,在oalintr.h文件中定义中断ID,也称SYSINTR,例如#defineSYSINTR_MYINT(SYSINTR_FIRMWARE+20),最大值

40、不能超过SYSINTR_FIRMWARE+23。然后在armint.c文件中找到OEMInterruptHandler函数,用if(IntPendVal=INTSRC_XXX)判断当前发生的中断源号,然后返回SYSINTR_MYINT。内核分别调用OEMInterruptDisable(禁止当前中断)、OEMInterruptDone(中断处理结束)、OEMInterruptEnable(当前中断有效)三个函数,参数都为中断ID,在这三个函数中用caseSYSINTR_MYINT判断当前要处理的中断。 如何开发软件从PC端复制文件到基于WINCE的设备? 调用RAPI(RemoteApplic

41、ationProgrammingInterface)函数,此函数集由桌面计算机调用,由基于WINCE的设备执行。一旦连接上就可以在桌面计算机端调用RAPI。通过注册表还可以限制RAPI能够访问目录的范围。具体参考RAPI和RDP(远程桌面协议)。 请问如何对NandFlash分区、格式化? 你看看WINCE420PUBLICCOMMONOAKDRIVERSETHDBGBOOTPARTbootpart.cpp,在Eboot中先要调用BP_LowLevelFormat( DWORDdwStartBlock,DWORDdwNumBlocks,DWORDdwFlags)再flash的一个区域建立空的M

42、BR,然后连续两次调用BP_OpenPartition(DWORDdwStartSector,DWORDdwNumSectors,DWORDdwPartType,BOOLfActive,DWORDdwCreationFlags)函数来建立BINFS和FAT分区。建好后,将nk.bin烧入binfs分区中。 要做个弹出对话框具有alwaysontop属性,如何实现? 调用SetWindowPos(.,HWND_TOPMOST,.,SWP_NOACTIVATE)。 s3c2410WINCE下网络PING一会就断,如何解决? 原因在于中断处理程序把已经产生的中断标志清除掉了,这样就丢失一次中断。因为

43、原驱动里配置中断为上升沿触发,一次中断丢失就导致不会再产生中断信号跳变,因为只有在中断服务中读取了cs8900的Interruptstatusqueue寄存器后,才会产生下一次中断!解决办法: 1、在cfw.c文件中全局定义BOOLInited=FALSE 2、修改OEMInterruptEnable()中caseSYSINTR_ETHER:下面的语句为: if(Inited=FALSE) s2410IOP-rEINTPEND=0x200; s2410INT-rSRCPND=BIT_EINT8_23; if(s2410INT-rINTPND&BIT_EINT8_23) s2410INT-rINTPND=BIT_EINT8_23; Inited=TRUE; s2410IOP-rEINTMASK&=0x2

温馨提示

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

评论

0/150

提交评论