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

news2024/12/24 9:42:33

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

1、问题分析

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

2、改进设计

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

3、应用方式

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

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

4、总结说明

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

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[年中总结]真正的精彩都在海里

时间过得可真的是快啊,一眨眼就是六月底了 这半年的经历也是挺多彩 二月底的时候,跟老大提出了离职申请,经过 老大/hr/部门 leader 的谈话之后,依然决定离职 四月底拿到离职证明之后,就出去玩了一圈,六月份刚回来,哈哈哈哈 我不知道有没有人和我一样,非常在意能不能在一份工作…

2023个人简历的范文参考(合集)

2023个人简历的范文参考【篇1】 基本信息 姓名:__ 性别:__ 出生日期:__ 籍贯:__市 目前城市:__市 联系电话:__ E-mail:__ 应聘方向 求职行业:金融/投资/证券,银行&#x…

Python 标准库-CSV 文件读写

目录 【1】读取CSV 【2】字典方式写入 【3】常用自定义 csv --- CSV 文件读写 — Python 3.10.11 文档 涉及方法: csv.DictReadercsv.DictWriter 【1】读取CSV def readToCsvFile(csv_path, u_delimiter,, u_doublequoteTrue):read_file []try:with open(cs…

计算机网络23年6月期末复习【更新】

计算机网络23年6月期末复习 题型分布 循环冗余码(CRC校验码)子网划分IP数据报分片滑动窗口拥塞避免和快速重传TCP三次握手和四次握手路由选择(更新路由表)1.(简答题)网络体系结构为什么要采用分层次的结构&…

签约新闻 | 南方传媒携手AMT企源开启各项管理优化工作

南方出版传媒股份公司(本文简称“南方传媒”)成立于2009年,2016年在上交所挂牌上市,是广东省文化产业第一股、广东文化产业龙头企业、中国出版业重要力量。 在数字化发展浪潮下,为支撑业务数字化转型变革,…

FreeBSD 开源操作系统 30周年纪念特刊

FreeBSD是一种类UNIX操作系统,是经由 BSD、386BSD 和 4.4BSD 发展而来的Unix的一个重要分支。由一些原来 BSD UNIX 的开发者后来转到 FreeBSD 的开发,使得 FreeBSD 在内部结构和系统 API 上和 UNIX 有很大的兼容性。FreeBSD 是开源Free。 FreeBSD 项目庆…

车间现场管理难!车间主管如何掌握管理进阶?

车间是企业的基本层,搞好车间现场管理,有利于企业增强竞争力,提高产品质量和员工素质,保证安全生产,而车间班组长是生产线的主要管理者,是直接“当家人”,对生产现场状况了如指掌,对…

边缘智能:边缘计算驱动实时深度学习

边缘智能 作为人工智能领域的当红炸子鸡,深度学习技术近年来得到了学术界与产业界的大力追捧。目前,深度学习技术已在计算机视觉、自然语言处理以及语音识别等领域大放异彩,相关产品正如雨后春笋般涌现。由于深度学习模型需要进行大量的计算…

【VulnHub系列】DC4

因为是从PDF转换过来偶尔可能会出现内容缺少,可以看原版PDF:有道云笔记 实验环境 Kali:192.168.10.102 MyFileServer:192.168.10.106 实验过程 通过arp-scan来发现靶机的IP地址 sudo arp-scan --interface eth0 192.168.10.1…

【Flutter】Flutter 状态管理 Provider 包使用概述

文章目录 一、 前言二、 Provider 包简介三、 安装 Provider 包四、 Provider 包的基本使用五、 示例代码:一个简单的状态管理实例六、 版本信息七、 总结 一、 前言 🎉想要精通 Flutter,掌握更多技巧和最佳实践?好消息来了&…

layui时间控件单击双击改变状态

文章目录 1️⃣ layui单击隐藏弹出的时间窗2️⃣ layui双击隐藏弹出的时间窗2.1 找到官方的插件2.2 改变引用,加上change函数 优质资源分享 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418 layui时间控件单击双击改变状态&…

计算机的工作过程和主要性能指标

一、计算机的工作过程 为使计算机按预定要求工作,首先要编制程序。 程序是一个特定的指令序列,它告诉计算机要做哪些事,按什么步骤去做。 指令是一组二进制信息的代码,用来表示计算机所能完成的基本操作。 编制好的程序放在主存中…

【030】C++类和对象之友元(friend)详解

C类和对象之友元(friend)详解 引言一、友元概述二、友元的语法三、友元的应用举例3.1、普通全局函数作为类的友元3.2、类的某个成员函数作为另一个类的友元3.3、整个类作为另一个类的友元 四、友元的注意事项五、友元案例总结 引言 💡 作者简…

大数值使用BitSet存储导致的内存溢出

背景: 在日常的工作中,使用Redis的bitmap统计每天的登录用户数,使用java的BitSet进行统计总数或者与或非等操作时,我们可以看到BitSet/Redis的Bitmap操作的身影,他们也的确能减少内存的使用量以及操作的性能&#xff…

[HTML/CSS/JS]作品案例--笔记1

一、头部导航栏代码 html代码 <!-- 第一部分 导航栏 登录 注册 卡片点击 切换 --><div class"nav-containers"><ul class"ul-one"><li class"li-one color-white">首页</li><li class"li-one"&g…

下峰锁定,行情未尽,筹码峰真的不会骗人吗?

在学习筹码分布的时候&#xff0c;经常可以看到这样的顺口溜&#xff1a;“上峰不死&#xff0c;下跌不止&#xff1b;下峰锁定&#xff0c;行情未尽”。简单解释一下就是&#xff1a;下跌行情中&#xff0c;如果上密集峰未被充分消耗&#xff0c;那么就没有新的行情产生&#…

【Unity3D】雾效

1 前言 屏幕深度和法线纹理简介中对深度和法线纹理的来源、使用及推导过程进行了讲解&#xff0c;激光雷达特效中讲述了一种重构屏幕像素点世界坐标的方法&#xff0c;本文将介绍使用深度纹理重构屏幕像素点在相机坐标系下的坐标计算方法&#xff0c;并使用重构后的坐标模拟雾…

EventBus

EventBus 文章目录 EventBus1.EventBus的作用2.关于EventBus的概述3.EventBus的使用方法4.EventBus的黏性事件5.EventBus的源码EventBus的构造方法getDefault()源码EventBus()源码 订阅者注册register()源码findSubscriberMethods()源码findUsingInfo()源码findUsingReflection…

TCP的三次握手与四次挥手

TCP的三次握手与四次挥手 1.网络分层 网络分层代表硬件协议/技术特性应用层HTTP,DNS,FTP,SMTP,Telnet协议等应用程序实现的,规定应用程序的数据格式传输层TCP/UDP协议负责两主机之间的数据正确传输主机系统内核实现的网络层路由器IP协议负责地址管理和路由选择(确定对应主机)…

合宙Air724UG Cat.1模块硬件设计指南--SDIO接口

SDIO接口 简介 SDIO(Secure Digital Input and Output)全称为安全数字输入输出接口&#xff0c;在协议上和SPI类似是一种串行的硬件接口&#xff0c;通信的双方一个作为HOST&#xff0c;另一端是Device&#xff0c;所有的通信都是由HOST端发送命令开始的&#xff0c;Device端只…