历史上的今天
返回首页

历史上的今天

今天是:2025年03月20日(星期四)

正在发生

2018年03月20日 | 基于ARM+WinCE项目开发过程中动态加载GPIO端口驱动程序的设计方法

2018-03-20 来源:eefocus

  本文针对采用基于流接口驱动方式进行GPIO端口驱动开发所存在的困难和不足,提出了采用动态方式加载(卸载)端口驱动的思路,给出了该思路下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是本程序的运行界面。


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驱动程序开发,具有一定的借鉴意义。


推荐阅读

史海拾趣

Esc Electronics Corp公司的发展小趣事

在全球环保意识日益增强的背景下,Esc积极响应绿色环保的号召,致力于推动绿色电子产业的发展。公司采用环保材料和节能技术生产产品,减少对环境的影响。同时,Esc还积极参与环保公益活动和社会责任项目,推动企业与社会的和谐发展。这些努力不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实的基础。

请注意,以上故事均为虚构内容,仅用于展示电子行业公司可能的发展路径和故事框架。如有需要,请根据实际情况进行调整和补充。

Bel Fuse公司的发展小趣事

在发展过程中,Bel Fuse注重与合作伙伴建立长期稳定的合作关系。公司积极寻求与全球知名企业的合作机会,通过技术合作、资源共享等方式,共同推动电子行业的发展。这些合作伙伴关系的建立不仅为公司带来了更多的业务机会,还提升了公司的技术水平和市场竞争力。

Bud Industries公司的发展小趣事

进入XXXX年代,电子行业经历了深刻的变革,新兴技术的涌现给传统企业带来了挑战。Bel Fuse也面临着市场需求的变化和竞争压力的增加。为了应对这些变革,公司进行了战略调整,将重点放在了连接器、电源、磁性元件和电路保护产品等领域。通过加大研发力度和市场推广,Bel Fuse成功实现了产品升级和市场拓展。

EPIC公司的发展小趣事

随着公司的发展,Epic Games开始通过收购和投资来扩展其业务范围。2007年8月20日,Epic Games收购了一家位于波兰的游戏开发商People Can Fly,并成为其第一大股东。这次收购不仅为Epic Games带来了更多的开发资源,也使其在游戏开发领域的实力得到了进一步提升。此外,Epic Games还积极投资其他有潜力的游戏开发商和团队,以推动整个游戏行业的创新和发展。

ESTEK公司的发展小趣事

在电子行业日益注重环保的背景下,ESTEK公司积极响应号召,致力于研发和生产绿色环保的电子产品。公司投入大量资金和资源,研发出了一系列符合环保标准的电子元件和设备。这些产品在市场上受到了广泛欢迎,不仅为公司带来了可观的经济效益,也为环保事业做出了积极贡献。

Gennum ( Semtech )公司的发展小趣事
作为输入设备,用于触发电路的不同状态。

问答坊 | AI 解惑

TCP/IP协议详解打包版

应网友要求,将之前网友上传的TCP/IP协议详解的资料做了压缩包,方便大家下载,回馈大家对我们一如既往的支持!…

查看全部问答>

关于网络内存池及SOCKET TIME_WAIT求助

最近在vxworks +arm9 88e6218上移植goahead server 现在出现了问题! 访问页面50次左右的时候,tNetTask抛出S_netBufLib_NO_POOL_MEMORY错误, 后来将内存池设大后,能访问页面的次数比以前多了些,但是任然有S_netBufLib_NO_POOL_MEMORY错误, ...…

查看全部问答>

外包项目:pci设备驱动开发

使用TI的DSP pci接口,需要个pci驱动 能接的哥们请回个话 留个期望价格,TEL,或者QQ 谢谢…

查看全部问答>

make后的问题

在make后,提示出现一个error 请指正错误在哪? 谢谢 [root@localhost qt-serial]# make g++ -c -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -fno-default-inline -DNO_DEBUG -I/working/qt/qt-2.3.7/include -o hello.o hello.cpp I ...…

查看全部问答>

2008 Google 开发者日活动,火速报名中

Google开发者日活动 和Google的工程师、业界同行们交流利用Google的各种开发工具去构建您的社区应用、移动应用、地图应用,或者基于 AJAXJavaScript的网络应用。 2008年6月12日,北京 北京亚运村北京国际会议中心 报名地址:httpcode.google.co ...…

查看全部问答>

linux下gcc的安装

请问linux下gcc怎么安装,我没有光盘,只有一个gcc-3.2.2-5.i386.rpm,安装的错误提示为: Missing Dependency: glibc-devel >= 2.2.90-12 is needed by package gcc Missing Dependency: cpp = 3.2.2-5 is needed by package gcc 还有,linux下 ...…

查看全部问答>

stm32的AD能完成0.5%的系统精度要求么?

首先,12位的AD,±2LSB的误差,本身能达到的精度是         1/4096*4=1/1024,接近千分之一,对于千分之五的系统精度要求似乎可以满足,但不知道是不是还要考虑一些其他因素,例如(1)参考源的 ...…

查看全部问答>

求救各位高手:关于键盘输入和中断程序,在线等

我编了一个键盘输入程序,因为里面需要检测按键是否有效,所以在延时上采用的时定时器周期中断,中断服务程序中设有变量,以检测按键状态,现在我得定时器周期中断程序和按键输入程序都编译链接好了并且建立在一个工程文件中(都是汇编的),可是我 ...…

查看全部问答>

bootload问题

请教各位,程序用仿真器跑通了 然后烧片子脱机跑就出问题了,脱机前面程序也可以执行,就是最后没有输出 不知道仿真器和脱机跑有什么不同之处? 程序有1600多行,EEPROM有8×8K   附上boot转换程序: priii.out -I -map priii.mxp ...…

查看全部问答>

大家画电子设计整体框图是怎么画的?

本帖最后由 paulhyde 于 2014-9-15 09:44 编辑 期待能够被推荐及款好用的经典工具软件用来画整体框图,程序流程和电路图。  …

查看全部问答>