技术开发 频道

八步教你 如何开发Windows CE驱动程序

  7.内存地址重建API函数和类

  下面我们介绍内存地址重建API函数。

  CeOpenCallerBuffer :验证访问权限并完成指针的内存地址重建。返回一个内存地址重建后的指针。分配资源。为了在指针处理结束后释放资源,必须调用CeCloseCallerBuffer函数。

  CeCloseCallerBuffer:释放CeOpenCallerBuffer函数分配的所有资源。如有必要,可以向被传递的缓冲区进行回写。

  CeAllocAsynchronousBuffer:使用CeOpenCallerBuffer函数或者由系统整理出一个缓冲区,以供异步访问之用。在返回发起调用的线程之前,必须同步调用这个函数。它会分配有关资源,为了在指针处理结束后释放资源,必须调用CeFreeAsynchronousBuffer函数。

  CeFreeAsynchronousBuffer:会释放由函数CeAllocAsynchronousBuffer分配的所有资源。如有必要,可以向被传递的缓冲区进行回写。

  CeFlushAsynchronousBuffer:会根据函数CeAllocAsynchronousBuffer对该缓冲区所做的修改而改变源缓冲区。

  CeAllocDuplicateBuffer:为参数指针创建安全副本。

  CeFreeDuplicateBuffer:释放由函数CeAllocDuplicateBuffer分配的所有资源。如有必要,可以向被传递的缓冲区进行回写。

  除此之外,Windows Embedded CE 6.0还另外提供了一组C++类,用于内存地址重建,它们位于\PUBLIC\COMMON\OAK\INC\MARSHAL.HPP,下面对它们做相应说明。

  AsynchronousBuffer_t:CeAllocAsynchronousBuffer函数和CeFreeAsynchronousBuffer函数的包装类,用于需要异步访问的内存地址重建后的指针。

  DuplicatedBuffer_t:CeAllocDuplicateBuffer函数和CeFreeDuplicateBuffer函数的包装类,用于指针参数。

  MarshalledBuffer_t:CeOpenCallerBuffer、CeCloseCallerBuffer、CeAllocAsynchronousBuffer和CeFreeAsynchronousBuffer函数的包装类,用于未重建内存地址的嵌入指针。

  8.调试域

  要想开发出可靠和稳定的驱动程序,必须在可能引起异常错误的可执行码中插入__try/__except/__finally块,特别是那些从外部接收数据的代码。

  调试是驱动程序开发工作的一大项,幸运的是Windows Embedded CE开发工具提供了调试驱动程序所需的全部功能。Windows Embedded CE提供了两种调试驱动程序的方法,第一种标准的单步调试方式,它能够进入内核提供的代码;第二种是无间断的调试方式。注意,要使用标准内核调试工具,应该为特定的硬件平台实现KITL,并选择传输方法。

  如果希望调试系统的所有部分,您应当构建一个Debug OS映像。如果希望调试整个驱动程序,那么只需构建一个包括内核程序调试工具KITL和调试版的带有辅助调试文件的驱动程序的Retail OS映像就足够了。如果希望调试整个驱动程序和部分系统的话,您应当在映像中包含前面所说的各种组件,以及带有辅助调试文件的系统部分。

  调试域是一种改进型的printf调试技术,并且能在运行时配置输出,还能与Platfrom Builder集成使用。从最基础的角度而言,调试域向调试输出发送条件输出。按照这种方式,调试域可以在不需要中断执行的情况下提供驱动程序执行信息。

  所有的系统码都可用于调试域,所以您不仅能够看到来自驱动程序调试域的输出,而且还能得到有关系统活动信息。这一功能有助于在驱动程序开发期间暴露并解决问题。

  为了使用调试域,需要进行如下所示的工作:

  ·在驱动程序的头文件中包含dbgapi.h:#include

  ·为调试域定义掩码,例如:

  //zone 0

  
#define ZONEMASK_INIT (0x00000001<<0)

  
//zone 1

  
#define ZONEMASK_ACTIONS (0x00000001<<1)

  
//zone 2

  
#define ZONEMASK_EXCEPTIONS (0x00000001<<2)

  
//zone 14

  
#define ZONEMASK_WARNING (0x00000001<<14)

  
//zone 15

  
#define ZONEMASK_ERRORS (0x00000001<<16)

 

  定义用于条件式调试域输出的标志,例如:

  //如果zone 0启用,则为true

  
#define ZONE_INIT DEBUGZONE (0)

  
//如果zone 1启用,则为true

  
#define ZONE_ACTIONS DEBUGZONE (1)

  
//如果zone 2启用,则为true

  
#define ZONE_EXCEPTIONS DEBUGZONE (2)

  
//如果zone 14启用,则为true

  
#define ZONE_WARNING DEBUGZONE (14)

  
//如果zone 15启用,则为true

  
#define ZONE_ERRORSDEBUGZONE (15)

 

0
相关文章