C 嵌入式系统设计模式 09:硬件适配器模式

本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。

本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之二:硬件适配器模式。

硬件适配器模式 (Hardware Adapter Pattern)是一种设计模式,通过增加一层适配器来解决底层硬件设备与应用软件之间的接口不兼容问题。

比如应用层需要的特定接口,但是现有硬件层提供的接口并不能兼容,而你又希望能使用现有的硬件层接口(而不是重写),这时可以用硬件适配器模式在应用层和硬件接口之间进行转换。通过创建硬件适配器的方式来提供需要的接口,而不是重写硬件设备的接口。

摘要

硬件适配器模式提供了一种方式,可以将现有的硬件接口适配成上层应用需要的接口。

在面向对象编程中,适配器模式 (注意不是 硬件适配器模式 )是一种常见的设计模式,用于将一个类的接口转换成客户期望的另一个接口。硬件适配器模式是适配器模式在硬件接口适配方面的具体应用,因此可以看作是适配器模式的直接派生。它们的核心思想都是通过创建一个中间层来转换接口,使得原本不兼容的接口能够协同工作。

问题

在软件开发中,经常会遇到这样的情况:需要使用某个硬件设备,但该设备的接口与软件系统的期望并不完全一致。这时,如果直接修改软件系统的代码来适应硬件接口,可能会导致大量的重构工作,而且在将来更换硬件设备时,又需要再次进行修改。

为了避免这种情况,可以使用硬件适配器模式。该模式通过引入一个适配器来解决接口不匹配的问题。适配器在客户端和硬件之间起到了一个桥梁的作用,它对外提供客户端所期望的接口,而在内部则将客户端的请求转换为硬件接口所能理解的形式。这样,客户端就可以通过适配器与硬件进行交互,而无需关心硬件接口的具体实现细节。

硬件适配器模式的主要优点是提高了软件系统的灵活性和可扩展性。当需要更换硬件设备时,只需更换相应的适配器即可,而无需修改客户端的代码。这大大减少了代码的重构工作,降低了软件系统的维护成本。

模式结构

硬件适配器的模式结构图如下所示。
在这里插入图片描述

在图中,我们可以看到硬件适配器模式的主要组成部分以及它们之间的关系。这个模式是在 硬件代理模式 的基础上进行了扩展,主要增加了一个硬件适配器。硬件适配器的作用是将上层应用期望的接口转换成实际硬件能够理解的接口。

此外,图中还明确显示了上层应用期望硬件支持的 接口。这是非常重要的,因为它确保了上层应用和硬件之间的通信是按照预期的方式进行的。上层应用通过这个接口向硬件发送请求,并接收来自硬件的响应。而硬件适配器则负责将这些请求和响应在上层应用接口和硬件接口之间进行转换。

在面向对象编程(OOP)中,接口(Interface)是一种抽象类型,它是行为的抽象规范,用于规定类的方法,但不包含方法的实现接口定义了一组方法(行为),这些方法在不同的类中可能会有不同的实现。通过这些方法,接口定义了对象之间的一种 契约,即实现接口的类必须提供接口所规定的方法。

接口在面向对象编程中的主要作用是实现 多态性,以及提高软件系统的可扩展性和可维护性。通过接口,我们可以定义一种标准,使得不同的类可以以相同的方式被调用,从而实现代码的复用和模块化

接口通常包含一组方法声明,这些方法都是公开的(public),并且没有方法体(即没有实现)。实现接口的类必须提供接口中所有方法的具体实现。一个类可以实现多个接口,从而继承多个接口的行为规范。

模式详情

适配器应用层

应用层调用一些列服务,实现对硬件的交互。这些服务由“用于应用层的硬件接口”定义,接口规定了上层应用可以从代表硬件的软件模块中获得的行为和功能。

适配器应用层是系统中的一个组成部分,它想要使用硬件设备。但是,由于硬件设备的实现细节和接口可能与上层应用的期望不匹配,因此需要一个适配器来充当中间层。这个适配器实现了上层应用期望的接口,并在内部将上层应用的请求转换为硬件设备能够理解的命令或请求。

通过这种方式,上层应用可以无缝地与代表硬件的软件元素进行交互,而无需关心底层的硬件实现细节。这种抽象层的使用提高了系统的灵活性和可维护性,因为硬件设备的更换或升级不会直接影响到上层应用代码。

硬件适配器

硬件适配器在上层应用和 硬件代理 之间起到一个桥梁的作用,使得两者之间的通信能够顺畅进行,即使它们的服务接口和数据格式存在差异。换言之,上层应用发出的服务请求会被转换成硬件代理所能提供的一系列服务。这个过程可能包括对服务调用的分解,以及对数据的重新格式化和重构。

用于应用层的硬件接口

此接口表示上层应用期望硬件代理提供的服务和参数列表的集合。作为一个接口,它是服务规范的集合,没有具体的实现。在此情况下,实现由硬件适配器类提供。

硬件代理

见 硬件代理 博文。

结果

使用这种模式,不同的 硬件代理 及其相关的硬件设备可以在不同的应用程序中直接使用,同时允许现有的应用程序无需更改即可使用不同的硬件设备。关键在于,适配器提供了连接的“粘合剂”,将硬件代理与应用程序匹配。这意味着为一个应用程序更换硬件设备或在新的应用程序中重用现有的硬件设备将变得更容易、更少出错、更快。

然而,使用这种模式的代价是它增加了一层间接性,因此会略微降低运行时性能。

实现策略

在面向对象编程中,当提到适配器模式(Adapter Pattern)时,我们经常会遇到两种类型的适配器:对象适配器类适配器。这两种适配器都用于解决接口不兼容的问题,但它们的实现方式有所不同。

  • 对象适配器(Object Adapter):对象适配器利用组合(composition)来实现适配。它持有一个被适配对象(Adaptee)的引用,并在需要时将客户端的请求委托给被适配对象。对象适配器可以适配其父类接口(Target)所定义的方法。
  • 类适配器(Class Adapter):类适配器通过继承(inheritance)来实现适配。它继承自被适配对象(通常是通过继承一个具体类而不是接口),同时实现目标接口。类适配器需要重写目标接口中的方法,并在这些方法中调用被适配对象的方法(可能需要做一些转换或适配)。

本书中的硬件适配器模式是适配器模式在硬件接口适配方面的具体应用,本文中的模式结构图描述的是 对象适配器 实现方法。

相关模式

硬件适配器 扩展了 硬件代理模式。硬件代理模式封装了硬件接口细节,但不将服务请求转换为完全不同的请求。硬件适配器模式在上层应用和硬件代理之间增加了一层间接性。这允许不改变上层应用代码的同时,重用可能为其他系统创建的现有硬件代理代码。硬件代理和硬件适配器的实现可以合并,但这会破坏硬件代理的可重用性。

这里的核心思想是,通过引入适配器,我们可以使上层应用与硬件代理之间的交互更加灵活。适配器充当了翻译的角色,将上层应用的请求转换为硬件代理可以理解的形式,或者将硬件代理的响应转换为上层应用可以理解的形式。这样,即使硬件代理是为其他系统创建的,也可以在不修改上层应用代码的情况下进行重用。然而,如果将硬件代理和硬件适配器的实现合并,那么硬件代理的可重用性就会受到损害,因为它将紧密地与特定的上层应用请求和响应格式绑定在一起。

实例

见原书。

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

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

相关文章

ctx.drawImage的canvas绘图不清晰解决方案,以及canvas高清导出

ctx.drawImage的canvas绘图不清晰 原因: 查资料是这么说的:canvas 绘图时,会从两个物理像素的中间位置开始绘制并向两边扩散 0.5 个物理像素。当设备像素比为 1 时,一个 1px 的线条实际上占据了两个物理像素(每个像素…

如何实现一个规则研究区域内数据的提取(matlab)

在利用经验正交分解(EOF)进行某一个研究区域分析时,我们需要将研究区域转换成N*M的矩阵,其中N为空间维度,M为时间维度,这意味着我们之前的数据加上时间维度是三维的,即(lon,lat,rg&a…

【hot100】跟着小王一起刷leetcode -- 128. 最长连续序列

【hot100】跟着小王一起刷leetcode -- 128. 最长连续序列 128. 最长连续序列题目解读关键问题代码 总结 128. 最长连续序列 题目解读 128. 最长连续序列 ok,兄弟们,咱们看这个题哈,还是哈希分类下,然后一看题目,居然…

C# GTS四轴运动控制器实例(固高科技步进电机不带编码器)

注:由于电机不带编码器,无法做home和当前位置信息读取! 功能: 三个轴的点位运动:前进后退,并分别显示每个轴的移动脉冲数(可以换算为距离)! 开发环境:VS2017 硬件设备:固…

【知识整理】Git Commit Message 规范

一. 概述 前面咱们整理过 Code Review 一文,提到了 Review 的重要性,已经同过gitlab进行CodeReview 的方式,那么本文详细说明一下对CodeReivew非常重要的Git Commit Message 规范。 我们在每次提交代码时,都需要编写 Commit Mes…

IOS不使用默认的mainStroryboard作为首个controller的方法

步骤1: 删除info.plist文件下的一条配置,如图 步骤2: 编辑AppDelegate.m,参考以下代码 interface AppDelegate () //property (strong, nonatomic) UIWindow * window; property(nonatomic,strong) UIWindow * win; property(…

【常用】添加作者传记,部分期刊需要例如IEEE ACCESS TCVSVT

1 添加在下面位置 \begin{IEEEbiography} [{\includegraphics[width1in,height1.25in,clip,keepaspectratio]{moumouxu.png}}] {Moumou Xu} is currently a full professor at the School of Computer and Software, Nanjing University of Information Science and Technolo…

真Unity3D编辑器Editor二次开发

IMGUI Editor Label 改变颜色 分享一个很神奇的颜色 一开始这么写&#xff0c;以为不行的&#xff0c; private void OnGUI()(){GUILayout.Label("<colorred>name:</color>ffdasilufoi");//。。。。 } 结果这么写又好了&#xff0c; private GUIStyle m…

数据湖Iceberg、Hudi和Paimon比较

1.社区发展现状 项目Apache IcebergApache HudiApache Paimon开源时间2018/11/62019/1/172023/3/12LicenseApache-2.0Apache-2.0Apache-2.0Github Watch1481.2k70Github Star5.3k4.9k 1.7k Github Fork1.9k2.3k702Github issue(Open)898481263Github issue(closed)20542410488…

Stable Diffusion 模型分享:Realisian(现实、亚洲人)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 Realisian 是由多个模型合并而来&#xff0c;是一个现实模型&#xff0c;可以绘制美丽的亚…

贡献过Github开源项目的可领$231,亲测有效!

就在刚才我已经领到了价值231美元的Strk并且变现啦​&#xff01; 这次领取有一个条件就是&#xff0c;需要是Github排名前5k的开源项目的Contributor&#xff0c;并提交最少3次&其中&#xff0c;至少有一次PR贡献是在 2018 年或之后完成的。 丙子我恰巧所有开源项目都在世…

【C++】笔试训练(九)

目录 一、选择题二、编程题1、另类加法2、走方格的方案数 一、选择题 1、某函数申明如下 void Func(int& nVal1);有int a,下面使用正确的为&#xff08;&#xff09; A Func(a) B Func(&a) C Func(*a) D Func(&(*a)) 答案&#xff1a;A 2、C语言中&#xff0c;类…

信号系统之傅里叶变换属性

1 傅里叶变换的线性度 傅里叶变换是线性的&#xff0c;即具有均匀性和可加性的性质。对于傅里叶变换家族的所有四个成员&#xff08;傅里叶变换、傅里叶级数、DFT 和 DTFT&#xff09;都是如此。 图 10-1 提供了一个示例&#xff0c;说明均匀性如何成为傅里叶变换的一个属性。…

Stable Diffusion 3震撼发布模型与Sora同架构

Prompt&#xff1a;Epic anime artwork of a wizard atop a mountain at night casting a cosmic spell into the dark sky that says "Stable Diffusion 3" made out of colorful energy Stability AI发布Stable Diffusion 3文本到图像模型。该模型采用扩散变换架构…

Java项目:27 基于SSM+JSP实现的大学校园兼职平台

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统介绍 基于SSMJSP实现的大学校园兼职平台分为前台与管理员两块 管理端分为8大模块&#xff0c;分别是用户管理、兼职管理、帖子管理、聊天管理、…

研学活动报名平台系统功能清单

中小学生社会实践活动、研学旅行等素质教育活动报名与管理平台&#xff0c;功能包含&#xff1a;活动分类&#xff0c;活动管理&#xff0c;在线报名缴费&#xff0c;扫码核销&#xff0c;会员特权体系&#xff0c;在线商城&#xff0c;研学互动。系统支持入驻老师自行创建研学…

【Java程序员面试专栏 数据结构】一 高频面试算法题:数组

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊数组,包括数组合并,滑动窗口解决最长无重复子数组问题,图形法解下一个排列问题,以及一些常见的二维矩阵问题,所以放到一篇Blog中集中练习 题目…

如何在nginx增加健康检查接口

在docker中部署的nginx或者在nginx部署的nginx一般是需要一个健康检查接口的 这样的话&#xff0c;就可以确定容器当前的状态是否是健康的 那么&#xff0c;如何给nginx增加一个健康检查的接口呢&#xff1f; 接下来呢&#xff0c;我们就演示一个在nginx中如何增加健康检查的…

无人机竞赛常用目标检测方法--色块检测

本次开源计划主要针对大学生无人机相关竞赛的视觉算法开发。 开源代码仓库链接&#xff1a;https://github.com/zzhmx/Using-color-gamut-limitations-such-as-HSV-and-RGB-for-object-detection.git 主要使用传统算法&#xff0c;如果想要使用进阶版机器学习算法&#xff0c;请…

03 表数据基本操作

文章目录 插入(insert)查询(select)where子句更新表记录(update)删除表记录&#xff08;delete&#xff09;表字段的操作(alter)时间类型数据 插入(insert) insert into 表名 values(值1&#xff0c;值2...),(值1&#xff0c;值2...),...; insert into 表名 (字段1,...) value…