驱动开发的分离与分层

1.概念

1.1.分层

分层就是将一个复杂的工作分成了多层, 分而做之,降低难度。在驱动里面,每一层只专注于自己的事情, 系统已经将其中的核心层和事件处理层写好了,我们只需要来写硬件相关的驱动层代码即可。可能驱动里面大家都不是很熟悉,比如说网络吧,网络里面分了很多层,7层模型或者4层模型等等,这些分层都有自己的任务,提供接口给每一个层使用,完成某一些工作;例如IP层,会将IP报文解析,解析完了的数据会给到网络层的协议栈,TCP/UDP等等。这样的好处就是,层与层之间相对独立,每一层的变动或者优化,对其他层影响都不大。

1.2.分离 

分离是指把硬件相关的部分(驱动层)从纯软件部分(事件处理层)抽离出来,使我们只需要关注硬件相关部分代码的编写。具体来说就是在驱动层中使用platform机制(将所有设备挂接到一个虚拟的总线上,方便sysfs节点和设备电源的管理,使得驱动代码,具有更好的扩展性和跨平台性,就不会因为新的平台而再次编写驱动)把硬件相关的代码(固定的,如板子的网卡、中断地址)和驱动(会根据程序作变动,如点哪一个灯)分离开来,即要编写两个文件:dev.c和drv.c(platform设备和platform驱动)

 反向思考:如果不分离会怎么样?

举个例子,在字符设备LED实验中,发现硬件的地址写在驱动里面,导致这个驱动有点是该硬件专属了,造成驱动每个LED,都需要开发一个模块,将会有很多重复性的代码出现,是不是就冗余了呢?
是否可以考虑像单片机HAL库的做法,将模块成两部分:
一部分就是类似去HAL库的部分,我们称之为driver部分
一部分就如同我们调用的部分,我们称之为device部分

 driver部分就是执行函数,device部分就是传入参数;driver部分根据device部分的参数,对不同的硬件资源进行控制。这样每来一个设备,是不是不需要改driver了,只需要开发device就可以了。是不是连觉得开发device都觉得麻烦,没问题,设备数给你解决这个问题了,通过设备树自动给你创建设备,代码都不需要你写,只需要你按照设备树规则去填写硬件参数即可。

2.为什么分层或者分离

2.1.分层的理由

  1. 模块化和解耦:分层可以将复杂的系统划分为若干个独立的层次或模块,每个层次负责一组明确的任务或功能。

  2. 职责清晰:通过分层,可以清晰地定义每一层的职责。

  3. 可测试性:分层架构使得单元测试更加简单直接。每一层都可以独立进行测试,无需依赖整个系统。此外,由于层间耦合度低,可以更容易地模拟或替换依赖,进行隔离测试。

  4. 可扩展性和灵活性:随着需求变化,分层架构允许更容易地在现有层次中添加新功能或修改现有功能,而不必改动整个系统。比如,增加一个新的业务逻辑或更换数据库技术,只需调整相应层次,对其他层的影响较小。

  5. 复用性:良好的分层设计可以促进代码的复用。通用的功能可以封装在特定的层中,供多个模块或项目使用,减少了重复编码,提高了开发效率。

  6. 技术选型自由度:分层架构让开发者在不同层次上可以根据需求选择最合适的技术栈。比如,前端展示层可以使用React或Vue,后端服务层可以是Java Spring Boot或Node.js等,数据库层可以是MySQL、MongoDB等,各层的选择更加灵活。

2.2.分离的理由

  1. 提高代码可维护性:当代码按照功能、职责或技术领域分离后,每个部分都聚焦于单一职责。这样,当需求变更或修复bug时,开发者可以快速定位到相关代码段,而不必理解整个系统的复杂性,从而简化维护工作。

  2. 增强代码可读性:分离使得代码结构清晰,逻辑更加条理化。每个模块或层只包含与自身职责相关的代码,减少了不必要的交叉和冗余,使得其他开发者或未来的自己更容易理解代码意图

 说白了,分层就是将一个大工作,划分为多个小工作,让不同人去完成,层与层之间通过有限接口进行交互,降低了耦合度,符合高内聚,低耦合的概念。而分离,个人认为是更加细化的"分层",将某个模块内部进行拆分,减少每一个小模块或者组件之间的依赖,降低小模块之间的耦合度,小模块的划分何尝不是一个小分层呢?进行归类管理呢?

分离是目标,分层是达到这一目标的策略之一。

分离分层概念明白了,ok, 终于到我们心心念念的platform总线开发与设备树出场了,后面文章将介绍platform总线开发与设备树,以及基于它们的实验。

参考:

驱动的分层分离概念(platform)及实例讲解(点亮led)-CSDN博客 

Linux驱动开发(二)---驱动与设备的分离设计_linux driver device 分离-CSDN博客 

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

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

相关文章

ubuntu18.04 报错:fatal error: execution

一、问题描述 在ubuntu18.04上编译Faster-lio 报错&#xff1a; fatal error: execution: 没有那个文件或目录#include <execution> 二、解决方法 需要将g编译器更新到9.0 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt install g…

深度学习-序列模型

深度学习-序列模型 1. 定义2. 应用领域3. 典型模型4. 技术细节5. 总结 序列模型是一种处理序列数据的机器学习模型&#xff0c;其输入和/或输出通常为序列形式的数据。以下是关于序列模型的详细解释&#xff1a; 1. 定义 序列模型是输入输出均为序列数据的模型&#xff0c;它…

【Django】开发个人博客系统【1】

使用Django开发个人博客系统&#xff0c;博客系统包括用户&#xff08;博主&#xff09;注册和登录、博主资料信息、图片墙功能、留言板功能、文章列表、文章正文内容和Admin后台系统。 1. 项目架构设计 下一步将上述设置写入Django的配置文件settings.py&#xff0c;当Django…

【区分vue2和vue3下的elementUI和elementUI Plus的container组件,介绍如何安装,属性,事件,方法等以及使用案例】

vue2下的Element UI与vue3下的Element Plus的container组件区分 一、Element UI (vue2) 1. 安装 使用npm进行安装&#xff1a; npm install element-ui --save2. Container组件介绍 Container组件用于布局的容器组件&#xff0c;方便快速搭建页面的基本结构。它包含了<…

R可视化:另类的柱状图

介绍 方格状态的柱状图 加载R包 knitr::opts_chunk$set(echo TRUE, message FALSE, warning FALSE) library(patternplot) library(png) library(ggplot2) library(gridExtra)rm(list ls()) options(stringsAsFactors F)导入数据 data <- read.csv(system.file(&qu…

【代码随想录——回溯算法——三周目】

1. 子集2 这题需要先进行排序&#xff0c;和候选人那题类似。防止出现重复的子集。 func subsetsWithDup(nums []int) [][]int {path : make([]int, 0)res : make([][]int, 0)sort.Ints(nums)var dfs func(nums []int, start int)dfs func(nums []int, start int) {res app…

保留两位小数不四舍五入,10000.55变成10000.54的坑

正解 function moneyFormat(num){ let money num "";//隐式转换为字符串和toString()效果一样//没有小数补齐这个0if(money.indexOf(".")"-1"){moneymoney".00";}else{//有小数截取前二位小数moneymoney.substring(0,money.inde…

多线程基本常识

多线程的状态 在Java中&#xff0c;一个线程的生命周期有以下几种状态&#xff1a; 新建&#xff08;New&#xff09;&#xff1a;当线程对象被创建时&#xff0c;线程处于新建状态。此时线程对象存在&#xff0c;但还没有调用start()方法启动线程。 运行&#xff08;Runnable…

逆向基础:软件手动脱壳技术入门

这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文&#xff0c;希望能给新学软件逆向和脱壳的童鞋们一点帮助。 1 一些概念 1.1 加壳 加壳的全称应该是可执行程序资源压缩&#xff0c;是保护文件的常用手段。加壳过的程序可以直接运行&#xff0c;但是不能查看源代码…

基于多源数据的微服务系统失败测试用例诊断

简介 本文介绍由南开大学、华为云及清华大学共同合作的论文:基于多源数据的微服务系统失败测试用例诊断。该论文已被FSE 2024&#xff08;The ACM International Conference on the Foundations of Software Engineering&#xff09; 会议录用&#xff0c;论文标题为: Fault D…

【MySQL】库的操作+表的操作

库的操作表的操作 1.库的操作1.1创建数据库1.2删除数据库1.3查找数据库1.4修改数据库1.5数据库备份和恢复1.6查看连接情况 2.库的操作2.1创建表2.2查看表结构2.3修改表2.4删除表 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; …

[数据集][目标检测]红外车辆检测数据集VOC+YOLO格式13979张类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;13979 标注数量(xml文件个数)&#xff1a;13979 标注数量(txt文件个数)&#xff1a;13979 标…

网络流量探针与流量分析系统:全面指南

目录 什么是网络流量探针&#xff1f; 流量分析系统的功能与重要性 流量分析系统的主要功能 流量分析系统的重要性 AnaTraf 网络流量分析仪 如何选择合适的网络流量探针与流量分析系统&#xff1f; 1. 性能与扩展性 2. 易用性与部署 3. 数据可视化与报告 4. 安全性与…

模拟退火算法教程(个人总结)

模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种基于概率的全局优化算法&#xff0c;广泛应用于解决复杂的优化问题。该算法借鉴了物理学中金属退火过程的原理&#xff0c;旨在通过模拟这一过程来寻找全局最优解。本文将详细介绍模拟退火算法的背景、基本原…

Java如何将tif格式图片转为jpg格式图片

在Java中&#xff0c;将TIFF&#xff08;.tif&#xff09;格式的图片转换为JPEG&#xff08;.jpg&#xff09;格式的图片&#xff0c;通常需要使用图像处理库&#xff0c;如Apache Commons Imaging&#xff08;之前称为Sanselan&#xff09;或Java Advanced Imaging (JAI)。但是…

LayaAir3.2来了:性能大幅提升、一键发布安装包、支持WebGPU、3D导航寻路、升级为真正的全平台引擎...

LayaAir3的每一个分支版本都是一次较大的提升&#xff0c;在3.1彻底完善了引擎生态结构之后&#xff0c;本次的3.2会重点完善全平台发布相关的种种能力&#xff0c;例如&#xff0c;除原有的安卓与iOS系统外&#xff0c;还支持Windows系统、Linux系统、鸿蒙Next系统&#xff0c…

暑期社会实践即将强势来袭,投稿三下乡文章最强攻略

以热爱充实自我 以笃行丰盈青春 这个盛夏“乡”约 纷纷迈出了社会实践的有力步伐 在展开社会实践的同时 也不要忘记投稿宣传的重要性哦 快快收藏住这份投稿攻略 助力团队展现更多精彩的实践故事! No.1 感悟思想伟力&#xff0c;守好“红色根脉” No.2 循迹“八八战略…

STM32 定时器问题

stm32通用定时器中断问题 STM32 定时器有时一开启就进中断的问题 ///

ModuleNotFoundError: No module named ‘pdfkit‘

ModuleNotFoundError: No module named pdfkit 这个错误表明你的 Python 环境中没有安装名为 pdfkit 的模块。pdfkit 是一个将 HTML 转换为 PDF 的工具&#xff0c;它依赖于 wkhtmltopdf 这个命令行工具。 为了解决这个问题&#xff0c;你需要安装 pdfkit 模块以及 wkhtmltopd…

2023山东ICPC省赛Problem E. Math Problem

2023 山东 I C P C 省赛 P r o b l e m E . M a t h P r o b l e m \Huge{2023山东ICPC省赛Problem E. Math Problem} 2023山东ICPC省赛ProblemE.MathProblem 文章目录 题意思路标程 比赛链接&#xff1a;Dashboard - The 13th Shandong ICPC Provincial Collegiate Programmin…