微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > WinCE内核动态加载GPIO端口驱动的设计方法

WinCE内核动态加载GPIO端口驱动的设计方法

时间:08-06 来源:互联网 点击:

摘要:针对采用基于流接口驱动方式进行GPIO端口驱动开发所存在的困难和不足,提出了采用动态方式加载(卸载)端口驱动的思路,给出了该思路下GPIO端口驱动设计方法的步骤和关键代码并进行了验证,为其他类似的驱动设计与实现提供参考。
关键词:WinCE;GPIO;驱动;动态加载

引言
WinCE下GPIO端口驱动大多采用流接口驱动的方式进行开发,在实现上主要依托Platform Builder编译环境将驱动程序编译成动态链接库,并整合到WinCE内核中。但在实际项目的开发中,Platform Builder在驱动程序的开发和涮试上不够便捷,且在整合动态链接库和WinCE内核时,需要进行繁琐的参数配置,整个过程较为复杂。笔者以飞凌S3C2440开发板为例,给出在VisualStudio编译环境中采用动态加载方式来设计GPIO端口驱动程序的思路,较好地改进了目前常用的GPIO端口驱动设计方法,提高了开发效率。

1 GPIO端口的流驱动设计
1.1 过程简述
关于GPIO端口流驱动的设计原理,大量论文及书籍中均有介绍,这里不再赘述。其设计步骤也遵循固定的设计模式,按照编写驱动实现代码、驱动程序配置、编译调试的顺序进行。
1.1.1 编写驱动实现代码
WinCE流式驱动实质上是按照固定的流函数接口实现的一个动态链接库。在实现时,创建相关的.cpp文件、.h文件和.def文件,根据需要实现xxx_Init、xxx_Read、xxx_Write等流接口函数即可。
1.1.2 驱动程序配置
WinCE配置文件分为源代码配置文件和镜像配置文件,通过这两种配置文件,Platform Builder编译环境实现对驱动代码和内核的编译、整合。具体包括:
①创建相关提供注册信息的.reg文件以供在WinCE注册表中注册GPIO驱动程序。
②在Platform Builder的相关目录下,配置Dirs文件、Makefile文件、Sources文件和Platform.bib文件中的相关参数,Platform Buil der在编译时按照配置的参数编译驱动程序并将其整合到内核镜像中。
1.1.3 编译调试
使用Platform Builder编译环境编译驱动程序和WinCE内核,编译成功之后即得到按照硬件平台定制的含有驱动程序动态链接库的内核镜像文件,当WinCE启动时,该驱动会被自动加载。
1.2 设计方法的不足
基于以上描述,流接口驱动程序设计方法中存在以下两个问题:
①在整个设计过程中,驱动程序的编译、调试全部依托的是Platform Builder编译环境。Platform Builder编译环境虽然也能实现对驱动程序的编译和后期调试,但在实际工程项目的开发中适用面不广,在使用操作、功能提供等方面均不如Visual Stladio,其在实际工程项目中主要是用来定制WinCE内核。另外,为了将驱动程序整合到WinCE内核中,需要开发者较为熟悉Platform Builder编译环境中对源代码配置文件和内核镜像配置文件的修改及原理,而大多数开发者对此基本上处于“比葫芦画瓢”的模仿层次,学习入门门槛较高。
②在设计中,出于整合资源的目的,将端口驱动程序的动态链接库编译到WinCE内核中,但实际上这种方法导致驱动程序的动态链接库与内核结合过于紧密,每次对驱动程序的任何改动都需要随后使用Platform Builder编译环境对内核重新进行编译,来回反复、效率低下。从程序设计的角度讲,驱动程序和内核分属不同功能类型的模块,与程序设计中功能模块内紧外松的耦合思想不一致。

2 WinCE内核动态加载GPIO端口驱动的设计方法
2.1 设计方法原理
在前文中已经介绍过,在基于流驱动的驱动设计方法中,需要在Platform Builder编译环境中配置相关的参数,将驱动程序的动态链接库文件编译到WinCE内核中。实际上,WinCE内核具有动态加载(卸载)驱动文件的能力,驱动文件可以在需要的时候动态加载进WinCE内核中,在不需要的时候卸载掉。开发者可以使用Visual Studio编译环境替代Platform Builder编译环境,在Visualstudio中通过调用相关的WinCE API来实现对驱动文件的加载、卸载。利用这一特性,对驱动文件的调用方式更加灵活,项目的可扩展性得到了提高。
2.2 具体实现步骤
在WinCE中,主要通过RegisterDevice和Deregister Device两个函数实现WinCE内核对GPIO端口驱动的动态加载和卸载,其中Register Device函数负责加载设备驱动,DeregisterDevice函数负责卸载设备驱动。在程序设计时,端口驱动程序的开发仍然采用流驱动的设计方式,但编译环境使用Visual Studio。生成驱动动态链接库文件后将其部署在开发板适当的路径下,然后在WinCE程序中动态加载(卸载)该dll文件。笔者使用飞凌S3C2440开发板,创建了一个WincE对话框程序,通过点击相关按钮可以实现加载(卸载)GPIO端口驱动、点亮(熄灭)LED灯。图1是本程序的运行界面。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top