不知不觉中我们已经发布了五十多篇外设驱动的文章。前段时间有一位网友提出了一些非常中肯的建议,这也让我们开始考虑怎么优化驱动程序设计的问题。在这一篇中我们将来讨论这一问题。

1、问题分析

  首先我们来分析一下网友提出的几点问题。第一点是说在驱动设计时,使用了typedef重定义函数指针,这就需要使用人员了解这个函数的原型定义,使用起来不太直观,所以建议直接使用函数指针定义而不是使用typedef重定义。对于这一建议,我们觉得这位网友说的很对,typedef重定义方式确实不直观,所以这将是我们的一个改进方向。
  关于第二点,网友提到了直接从结构体对象的属性获取数据的方法不合适。理由是给使用者一个错觉,既然可以从属性得到数据,自然也可以直接修改属性的值,而有些值是从获取的测量数据是不可以被修改的。对于这一点我们也认为很有道理,这种方式确实存在一定的隐患,所以后续我们将对这一方面加以改进。
  至于网友提到的第三点,是在声明对象变量时最好初始化为{0}。在我们给出的实例中确实没有这一点。当然这个问题严格来说不是对象驱动设计的问题,而是使用上的问题,这需要我们在后续的应用文档中给出规范说明。
  除了上述几点网友的建议外,我们在使用过程中也发现一些不太合适的地方。在原笨的模式下,我们都是通过调用函数来访问对象,使用时还需要关注函数而不只是关注对象,所以我们也移植在考虑驱动库的改进问题。

2、改进设计

  依据前述提到的几点,我们考虑从以下几个方面来进行改进:一是,优化对象的属性,将与对象的配置无关的属性裁剪掉;二是,优化对象的访问方式;尽量不通过直接调用去处理对象操作;三是,优化对象变量类型的定义,非必要的情况下不单独定义类型。
  首先来说说对象属性的优化,在原来的设计中有的属性并不是用来实现对对象的配置,这一类属性可以裁剪的尽量裁剪掉。而对于有必要保留的状态类属性我们将尽量限制外部访问。
  关于对象访问方式的优化,在原有的设计中,有一些函数是公开的,可以在外部直接调用这些函数来实现对象的操作。我们考虑将所有的函数都设计为非公开的,但都可以同过对象来实现调用。
  有关对象的类型定义,主要是前面网友提到的typedef问题。在原来设计中,基于程序看起来比较简洁的目标,定义了很多函数指针类型,后经网友提醒,我们也确实觉得这一方式不直观,增加了使用者的使用难度。所以在本次改进中我们也将尽量减少typedef的使用,是的代码更加直观。

3、应用方式

  从应用方式来说,本质之上使用的流程没有变化。我们要使用某一驱动依然是需要做三方面的工作:声明对象、初始化对象、执行对象调用。具体如下:

  先说对象的声明,每类对象根据实际情况声明对象,名称无限制,只要符合变量的命名规则就好。但这只是声明了一个对象变量而已,尚不具备使用条件。
  声明对象变量后,我们还需要对该对象变量进行初始化才可以使用。每一类对象都有一个初始化函数。在具体应用中调用此函数对对象进行初始化,初始化的参数根据要求以参数形式传递给初始化函数。
  初始化完成之后就可以在具体应用中调用相应的函数获取对象参数。调用的函数一般以对象指针为实参,调用完成后可以通过对象的属性得到数据。
  此外,所用的对象头文件都汇集在扩展外设配置文件中,所以我们需要将配置文件添加到我们的应用中,并通过宏定义添加我们需要用到对象的头文件,将宏参数定义为0则不使用,定义为1则使用。然后还需要将我们使用的对象的源文件添加到我们的应用项目中就可以了。

4、总结说明

  本次改进设计的目标有两个:让使用更简单、让功能更内聚。在实例中,我们只设计了初始化函数,而其它的函数都需要对象变量来访问。
  本套驱动程序完全开源,并会根据使用情况随时修正和新增。并将源码公布到GitHUB:https://github.com/foxclever/ExPeriphDriver

欢迎关注:

外设驱动库开发笔记54:外设库驱动设计改进的思考相关推荐

  1. 外设驱动库开发笔记13:MLX90614红外温度传感器驱动

    红外温度传感器一般用于非接触式的温度检测.在我们的系统中经常会有这样的需求.所以我们将其设计为通用的驱动库以备复用.这一篇我们将讲述MLX90614红外温度传感器驱动的设计与实现. 1.功能概述 ML ...

  2. 外设驱动库开发笔记0:EPD总体设计

    在产品开发过程中,不可避免需要使用很多外部的元件及传感器,这些元器件也许是板载的,也许是板外的,但不管怎样,为其开发驱动程序都是必须的.每次都需要为这些元器件编写驱动程序.但每次重复编写调试很麻烦,于 ...

  3. 外设驱动库开发笔记23:AT24Cxx外部存储器驱动

    在我们的应用开发过程中,经常会使用到外部的EEPROM外部存储器来保存一些参数和配置数据等.而比较常用的就是AT24Cxx系列产品,这一节我们来开发用于操作AT24Cxx系列产品的驱动. 1.功能概述 ...

  4. 外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动

    移动设备的广泛应用增加对移动过程中各种参数的检测需求.ADXL345三轴数字加速度计可以用来检测加速度.进而测量倾斜角度等.在这一篇中,我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现. ...

  5. 外设驱动库开发笔记40:AT25xxx外部存储器驱动

      我们在前面开发过AT24CXX系列EEPROM存储器,它使用的是I2C接口.不过有时候我们也会使用SPI接口的EEPROM存储器.在这一篇我们将来讨论AT25XXX系列EEPROM存储器的驱动设计 ...

  6. 外设驱动库开发笔记34:OLED显示屏驱动

      现在OLED显示屏在嵌入式系统中应用的越来越多.对于一些显示信息不太复杂,以显示信息为主的需求,我们一般会选择OLED显示屏.在这一篇中,我们将讨论OLED显示屏驱动的设计与实现. 1.功能概述 ...

  7. 外设驱动库开发笔记29:DS17887实时时钟驱动

    一些时候,在我们的嵌入式产品中需要记录时间,所以我们就需要获取时钟,当然实现的方式多种多样,有的MCU本身就有这一功能,不过精度较低.当我们的应用要求较高时就需要使用专门的实时时钟芯片,如DS1788 ...

  8. 外设驱动库开发笔记9:SHT1x系列温湿度传感器驱动

    在我们的产品中,经常需要检测温湿度数据.有很多检测温湿度的方法和模块,其中SHT1x系列温湿度传感器就是一种成本较低使用方便的温湿度检测模块.下面我们就来说一说如何实现SHT1x系列温湿度传感器的驱动 ...

  9. python实现sht驱动_【技术】外设驱动库开发笔记9:SHT1x系列温湿度传感器驱动

    在我们的产品中,经常需要检测温湿度数据.有很多检测温湿度的方法和模块,其中SHT1x系列温湿度传感器就是一种成本较低使用方便的温湿度检测模块.下面我们就来说一说如何实现SHT1x系列温湿度传感器的驱动 ...

最新文章

  1. [日推荐]『保养汽车』爱车的专职管家
  2. Linux协议栈(7)——网络层实现
  3. 中国无碳复写纸行业竞争现状与运行态势研究报告2022年
  4. sublime text安装插件出现问题
  5. 与崇洋媚外的程序员的辩论
  6. MapReduce之join操作
  7. mfc实验报告心得体会_mfc实验报告.doc
  8. linux桌面版本安装MSDM,Parallel_s desktop怎么安装linux系统
  9. UVA10505 Montesco vs Capuleto【DFS】
  10. 机器人仿真论文阅读1
  11. 【转】网站ICP备案和公安备案流程
  12. android 自动化测试 百度,Android 自动化测试框架-百度cafe
  13. 企业级spring-boot案例-自定义Spring Boot Starter
  14. 是什么让一个优秀的派对服饰
  15. mysql connector j_MySQL Connector/J
  16. 【云服务器】免费云服务器推荐
  17. input tabIndex说明
  18. [20150311]x$bh的tch.txt
  19. CSS隐藏多余文字的几个方法
  20. addEventListener的常用事件

热门文章

  1. ABB通过web控制机器人单轴运动
  2. nvidia实时刷新
  3. android图像处理系列之五--给图片添加边框(中)
  4. Python盗号原理-代码实现截屏键盘记录远程发送(不要做坏事)
  5. 大牛讲解数字信号处理
  6. 属性基加密——模糊身份基加密(FIBE)
  7. 基民读基金评级常犯四个错误
  8. 210:例子1:6个垃圾桶是否满的信息读取VSCODE实现
  9. HQChart使用教程35 - 如何在uni-app创建K线图(h5)
  10. html5重置按钮,25-普通按钮-提交按钮-重置按钮