转: WinCE驱动开发问题精华集锦-3

转: WinCE驱动开发问题精华集锦-3
WinCE驱动开发问题精华集锦-3
摘自: http://hi.baidu.com/mcu%5Fspaces/blog/item/4f3139df56ec7e1763279847.html

41、WinCE下如何读写几百兆的大文件呢? 使用内存映射文件吗?  
   一般嵌入式设备配备128MB物理内存就算顶级的了,所以要读写几百MB的文件用内存映射文件技术是最好的选择了。映射文件之后读数据是非常容易的,要注意的是写数据,内存映射方面的API没有提供改变文件长度的功能,所以要在关闭映射文件对象后用文件API改变文件长度。  

42、请问如何改系统调度的默认时间片值?  
   更改schedule.c文件中的dwDefaultThreadQuantum 变量,然后重新编译该文件并SYSGEN。调用API CeGetThreadQuantum就知道更改是否生效。  
  
43、如何让系统加载自己写的驱动程序?  
两种办法:  
1)、在[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下添加注册键。  
2)、在应用程序中调用ActivateDeviceEx。  
  
44、在一些文件中用分号来表示注释,例如下面的内容  
; @CESYSGEN IF SERVERS_MODULES_HTTPD  
; @CESYSGEN ENDIF  
在“CESYSGEN...”前加了“@”,有没有什么特别的含义?
  
     在WINCE的一些文件中,用“;”作为注释并在注释文字中用@CESYSGEN作为标记,后面接条件语句。Cefilter.exe工具负责按照条件来筛选文件内容,所以不要轻易地删除包含@CESYSGEN的注释语句。  
  
45、通过串口建立ActiveSync联接,串口线用三线的可以吗?  
   不可以,因为用串口同步时要用到其余口的状态。  

46、 WINCE是否支持MAPI?  
   不支持。

47、如何旋转屏幕显示的内容?  
   例子代码如下(前提是显示驱动程序支持旋转):  
DEVMODE   devmode = {0};  
devmode.dmSize = sizeof(DEVMODE);  
devmode.dmDisplayOrientation = DMDO_90;       ///垂直模式  
devmode.dmFields = DM_DISPLAYORIENTATION;  
ChangeDisplaySettingsEx(NULL, &devmode, NULL, 0, NULL);   ///改变显示的设置  
CRect   rcWorkArea(0, 0, 320, 240);     ///整个屏幕尺寸  
///设置客户区大小并广播消息,这样所有软件也就随之更改显示  
SystemParametersInfo(SPI_SETWORKAREA, 0, (void*)&rcWorkArea, SPIF_SENDCHANGE);  
  
48、请问如何修改字形缓存的容量?  
[HKEY_LOCAL_MACHINE\System\GDI\GLYPHCACHE]  
"limit"=dword:0400  
  
49、 如何得到从WINCE启动开始到现在的时间?  
   调用API GetTickCount,得到的值为32位整数,单位为毫秒。  
  
50、如何调用WINCE的软键盘?  
调用API SipShowIM(SIPF_ON),前提是内核加入了软键盘组件。  
  
51、 基于HIVE的注册表,如何在系统关闭前保存注册表的数据到文件system.hv?  
调用API RegFlushKey函数。  
  
52、使用VirtualAlloc和VirtualCopy的时候需要注意哪些事项?  
   1)、VirtualAlloc的作用是申请虚拟地址空间,这肯定不是最终的目的,最终目的可能是申请物理内存、映射寄存器、提交文件等。没有一个目的会在意虚拟地址空间的位置,所以尽量传递参数1为0,也就是让WINCE自动分配虚拟地址空间。VirtualAlloc分配地址空间实际上是以64KB为单位,所以要指定申请的虚拟空间的首地址的话,参数1应该为64KB的整数倍,申请的长度也应该为64KB的整数倍,即使你不需要那么大。  
   2)、VirtualCopy的主要作用是映射物理地址空间,如果参数2为物理地址,那么最后一个参数要添加PAGE_PHYSICAL,参数2必须是256的整数倍。如果参数2为虚拟地址(0x80000000以上),那么最后一个参数就不要添加PAGE_PHYSICAL,WINCE内核会根据这个虚拟地址找到对应的物理地址。  
  
53、驱动程序和应用程序之间传递数据时何时调用MapPtrToProcess?  
   因为设备管理器负责加载驱动程序DLL,这意味着当应用程序调用驱动程序接口函数的时候,WINCE内核会将调用驱动程序接口函数的线程转移到设备管理器的进程空间然后执行具体的驱动程序代码,应用程序和设备管理器处于两个进程空间,这就造成设备管理器无法访问应用程序传递的指针(虚拟地址),所以当我们在应用程序中传递指针给流驱动程序接口函数时,WINCE内核从中作了一个地址映射,例如ReadFile、WriteFile、DeviceIoControl函数的参数凡是指针都经过了映射才传递给驱动程序,所以很多驱动程序开发者并不了解其中的奥秘就可以编程了。但是如果参数是一个指向一个结构体的指针,而结构体里包括一个或多个指针,那么WINCE内核并不负责映射,所以就需要开发者在驱动程序接口函数中调用API函数MapPtrToProcess来映射地址。例如:pPointer_retval = MapPtrToProcess(pPointer, GetCallerProcess());  
  
55、 如何判断可插拔的设备是否存在?  
   1)、通过查找注册表的值。凡是由API ActivateDeviceEx加载的驱动程序都在[HKEY_LOCAL_MACHINE\Drivers\Active]键下有注册键,通过查找“name”或者其它键值就能够找到。设备管理器就调用这个API。如果是PCI设备,在注册表[HLM\Drivers\BuiltIn\PCI\Instance]下查找关键字,例如[HLM\Drivers\BuiltIn\PCI\Instance\WaveDev1],说明音频驱动已经加载。  
   2)、调用驱动程序接口函数,根据返回值或者执行结果来判断。  

56、如何做到通过串口过来的一个信号启动自己开发的应用程序?  
   创建一个线程负责等待串口过来的信号,调用API SetCommMask设置要等待的信号种类,具体可以等待的信号种类参见参数2的说明。然后再调用API WaitCommEvent函数等待这个信号,接收之后再调用API CreateProcess启动应用程序。  
  
57、在WINCE中如何只能启动应用程序的一个实例?  
   常用的两种办法:  
1)、如果应用程序实例创建了窗口,可通过API FindWindow函数通过窗口类名和窗口标题名称来查找,前提是系统内不会出现窗口名称重复的情况。  
2)、应用程序初始化的时候创建一个事件或互斥等内核对象,因为内核对象是由内核创建,名称在系统内唯一。  
  
58、能不能自己编辑一个数字签名文件导入到手机上,这样就可以用这个签名签自己的程序了?  
   WINCE的内核签名机制的用途是限制非法的可执行模块EXE、DLL等在设备上运行。要求内核的加载模块用公钥验证请求加载的EXE、DLL的签名是否合法,而这个公钥是在定制内核的时候加进去的,所以除内核的定制者以外的人无法修改这个验证机制。  
  
59、 在WINCE下是否能够得到某一进程使用的物理内存总量?  
   目前没发现有这样一个API能够得到指定进程使用的物理内存总量。只有GlobalMemoryStatus能够得到整个系统使用的物理内存总量。  
  
60、 应用程序如何控制lcd的亮度?如何获得电池的电量?  
   从常见的平台如Geode、三星ARM系列来看,的确在驱动方面没有统一的控制LCD或者其它种类屏幕亮度的接口函数,所以只能根据具体平台提供的接口来做。从帮助文档来看微软的带有DirectDraw功能的显示驱动程序的确有标准的增加亮度的接口函数,关于背景光参见标题为“Enabling a Backlight”的帮助文档。  
获得电池电量有标准的接口函数GetSystemPowerStatusEx,前提是驱动程序和硬件都要支持。

你可能感兴趣的:(转: WinCE驱动开发问题精华集锦-3)