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

发布者:代码漫游者最新更新时间:2013-08-31 来源: 单片机与嵌入式系统 关键字: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来实现对驱动文件的加载、卸载。利用这一特性,对驱动文件的调用方式更加灵活,项目的可扩展性得到了提高。[page]

2.2 具体实现步骤
   
在WinCE中,主要通过RegisterDevice和Deregister Device两个函数实现WinCE内核对GPIO端口驱动的动态加载和卸载,其中Register Device函数负责加载设备驱动,DeregisterDevice函数负责卸载设备驱动。在程序设计时,端口驱动程序的开发仍然采用流驱动的设计方式,但编译环境使用Visual Studio。生成驱动动态链接库文件后将其部署在开发板适当的路径下,然后在WinCE程序中动态加载(卸载)该dll文件。笔者使用飞凌S3C2440开发板,创建了一个WincE对话框程序,通过点击相关按钮可以实现加载(卸载)GPIO端口驱动、点亮(熄灭)LED灯。图1是本程序的运行界面。

a.JPG


    相关的要点代码及解释如下(暂不考虑程序的异常处理)。
    (1)端口驱动动态链接库的创建及生成
    使用Visual Studio编译环境创建一个常规的动态链接库工程,并编译生成dll文件即可。具体代码这里不再给出。需要注意的是,在动态链接库工程的.cpp文件中,驱动的编写需要严格遵循流驱动定义的接口标准。在本程序中,流驱动的前缀名为GPI,生成的动态链接库文件名为GPI.dll。
    (2)端口驱动动态链接库的注册及加载
    调用RegisterDevice函数后,即将步骤1中生成的动态链接库文件注册到注册表中,并加载进WinCE内核。在使用该函数时需要注意,在WinCE应用程序中需要获取该驱动动态链接库文件的绝对路径。因此,开发者在部署WinCE应用程序和端口驱动动态链接库时,需要注意两者之间的位置关系,一般情况下,将两者部署在同一路径下即可。驱动程序动态链接库的注册及加载代码如下:
    b.JPG
    (3)端口访问
    端口访问的方式与常规方式一致,根据需要调用CreateFile、WriteFile、ReadFile等函数即可,相关代码这里不再给出。
    (4)端口驱动动态链接库的卸载
    当不需要该设备驱动时,调用DeregisterDevice函数即可实现对动态链接库dll文件的卸载。如果程序再次需要该设备驱动时,按照步骤2再次加载设备驱动即可。
2.3 设计方法的优点
   
在WinCE内核动态加载GPIO端口驱动的设计方法中,内核调用端口驱动的方式比较灵活,GPIO端口驱动文件是通过相关WinCE API直接注册和调用的,整个开发过程不再涉及Platform Builder编译环境的使用。开发者只需要将注意力集中在Visual Studio创建端口驱动文件和WinCE应用程序的开发上,对驱动程序的修改和调试都独立于WinCE内核,而且在实际的使用中,端口驱动程序、WinCE内核和WinCE应用程序各自独立,便于各功能模块的独立开发和调试。

结语
   
本文介绍了基于ARM+WinCE进行项目开发过程中动态加载GPIO端口驱动程序的设计方法,较好地避开了对Platform Builder编译环境的使用,能够替代常用的基于流驱动的驱动程序的设计方法。笔者在工程项目中验证了这两种设计方法,实际可行且快捷有效,对于其他ARM类的GPIO驱动程序开发,具有一定的借鉴意义。

关键字:WinCE  内核动态加载  GPIO  端口驱动 引用地址:WinCE内核动态加载GPIO端口驱动的设计方法

上一篇:基于TinyOS2.x的温湿度传感器的底层驱动与应用
下一篇:基于WSN和GPRS的远程测控系统

推荐阅读最新更新时间:2024-03-16 13:27

stm32之GPIO寄存器学习
GPIO即通用输入/输出 (General Purpose Input Output) 包括: 两个32位的配置寄存器 GPIOx- CRL,GPIOx- CRH 两个32位的数据寄存器 GPIOx- IDR,GPIOx- ODR 一个32位的 set/reset 寄存器 GPIOx- BSRR 一位16位的 reset 寄存器 GPIOx- BRR 一位32位的锁定寄存器 GPIOx- LCKR 端口的模式包括: 浮空输入(Input floating)—— 即没有上拉电阻和下拉电阻,电压呈不确定性,一般用来做ADC输入用,这样可以减少上下拉电阻对结果的影响 上拉输入(Input pull-up)
[单片机]
stm32之<font color='red'>GPIO</font>寄存器学习
STM32单片机GPIO概述及相关寄存器
5.1 STM32单片机GPIO概述 STM32中每个IO口都有很多个作用,比如这次我们使用的STM32F103ZET6的PA0口,既可以作为IO口使用,还可以作为待机唤醒(WAKEUP),模拟输入(ADC功能)等。根据数据手册中列出的每个I/O端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置成多种模式。 (1)输入浮空 (2)输入上拉 (3)输入下拉 (4)模拟输入 (5)开漏输出 (6)推挽式输出 (7)推挽式复用功能 (8)开漏复用功能 每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/
[单片机]
STM32单片机<font color='red'>GPIO</font>概述及相关寄存器
stm32.cube(三)——HAL.GPIO
一、总览 HAL层里的库函数和大家熟悉的stm32lib基本上是一致的。一般来说一个cpu外设的操作函数分成两部分,分别是init和operation。 来看一个cube里的例子: static GPIO_InitTypeDef GPIO_InitStruct; int main(void) { /* This sample code shows how to use GPIO HAL API to toggle LED2 IO in an infinite loop. */ /* STM32F103xB HAL library initialization: - Configure the Flash p
[单片机]
如何使用GPIO(通用输入/输出)引脚实现耳机插孔感测
本应用笔记介绍了CS4201 / CS4202音频编解码器,以及如何使用GPIO(通用输入/输出)引脚实现耳机插孔感测。它简要介绍了耳机插孔感应以及带有耳机插孔感应的典型应用电路。 耳机插孔感 CS4201和CS4202编解码器使用不同的GPIO引脚来实现耳机插孔感测。音频驱动程序将根据CS4201上的GPIO(引脚44)或CS4202上的GPIO2(引脚32)的状态来使线路输出静音或取消静音。 下图1显示了具有耳机插孔感应功能的两通道CS4201 / CS4202双通道设计的适用部分。使用绝缘的立体声3.5毫米插孔可确保音频信号不会影响GPIO感测引脚的状态。当未将耳机插入连接器时,绝缘抽头将GPIO引脚拉至DGND
[嵌入式]
如何使用<font color='red'>GPIO</font>(通用输入/输出)引脚实现耳机插孔感测
GPIO模拟IIC过程中对IIC的理解
前两天在配置一款数字陀螺仪的IIC时序,分别实现了使用芯片自带IIC模块配置和使用GPIO模拟,下面谈谈个人对IIC的一些理解。 概述 IIC是一个总线协议,和spi类似的一个串行总线协议,它的特点是只用的信号线特别少,只需要两根,分别是SCL和SDA,但是与此同时也降低了通信速度。 IIC总线信号线少就造成它的通信协议稍微复杂,理解IIC的时序是理解IIC总线的关键。 .IIC总线通过上拉电阻接到VDD,当总线空闲时,两根信号线均为高电平。连接总线的任意一个器件输出低电平,将使总线信号变低,即各器件的信号线是“线与”关系。 每个IIC上连接的器件都有唯一的地址(7bit),当某个器件发出广播(地址信号)时,该器件即为主机,其
[单片机]
整理STM32GPIO输出速率问题
GPIO 引脚输出速度有:GPIO_Speed_2MHz (10MHz, 50MHz) 官方一点的解释: GPIO口的驱动电路响应速度,不是输出信号的速度。输出信号的速度与程序有关,通过选择速度来选择不同的驱动电路,降低功耗控制噪声。 又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。) 可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。 (如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。失真因素?) 如果信号频
[单片机]
端口管脚驱动双LED的方法
大多数现代微控制器都提供 I/O 端口,可以在程序执行期间改变这些端口的功能。当用作输出时,这些电路可以吸收或流出相当大的电流。本设计实例示出了用一个 I/O 管脚驱动双管脚、双色 LED 的三种方法。图 1 是一个可能的方案,它使用外接反相器 IC1 来驱动一只红/绿双向 LED,即D1。端口管脚的逻辑高电平输出使电流流过绿色(上方)LED,并将反相器输入电平拉高,于是驱动反相器输出端为低电平,从绿色 LED 吸入电流。端口管脚的逻辑低电平输出使反相器输出端为高电平,从而为红色(下方)LED提供电流,微控制器的输出端从红色 LED 吸入电流。   要关掉两只LED 时,可以重新配置微控制器的端口管脚,使之从输出转为输入
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved