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

news2024/9/21 3:34:44

本书的原著为:《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://www.coloradmin.cn/o/1464805.html

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

相关文章

JAVA毕业设计128—基于Java+Springboot+Vue的共享单车租赁管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的共享单车租赁管理系统(源代码数据库)128 一、系统介绍 本项目前后端分离,本系统分为管理员、用户两种角色 1、用户: 注册、登录、…

Java学习笔记2024/2/22

面向对象进阶部分学习方法: 特点: 逻辑性没有那么强,但是概念会比较多。 记忆部分重要的概念,理解课堂上讲解的需要大家掌握的概念,多多练习代码。 今日内容 复习回顾 static关键字 继承 教学目标 能够掌握st…

【移动安全】MobSF联动安卓模拟器配置动态分析教程

原文链接 MobSF联动安卓模拟器配置动态分析教程 实现方式 Windows开启安卓模拟器并进行相关配置作为调试客户端,Linux使用docker开启MobSF作为服务端。 好处:干净,部署简单,不用安装乱七八糟的环境,防止破坏其他应…

SpringCloud(14)之SpringCloud Consul

我们知道 Eureka 2.X 遇到困难停止开发了,所以我们需要寻找其他的替代技术替代Eureka,这一小 节我们就讲解一个新的组件Consul。 一、Consul介绍 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式…

【k8s核心概念与专业术语】

k8s架构 1、服务的分类 服务分类按如下图根据数据服务支撑,分为无状态和有状态 无状态引用如下所示,如果一个nginx服务,删除后重新部署有可以访问,这个属于无状态,不涉及到数据存储。 有状态服务,如redis&a…

音视频技术-电脑连接调音台时交流声的产生与消除

当电脑(笔记本/台式机)声卡通过音频线与调音台(或扩音机)连接时,能听到“交流声”。有时很轻微,有时很明显,甚至干扰正常的演讲或发言。 很多时候,我们在台上演讲时,都会使用电脑播放PPT,遇到视频时,还需要将视频中的音频扩大。电脑音频的输出口一般都是3.5的,我们…

Flutter常用命令,持续更新

目录 前言 Flutter 常用命令 Dart 常用命令 adb 常用命令(用于 Android 开发) 前言 当在开发Flutter项目时,熟悉一些常用的命令是非常重要的。这些命令可以帮助你执行各种任务,从构建应用程序到调试和测试。以下是一些Flutte…

SQL注入:sqli-labs 46关(order by注入)

sqli-lab靶场的46关是需要使用order by注入的 通过页面提示我们可以给sort传入一个值,那么尝试传入id: 可以看到是基于id排序的结果显示了出来 那么我们可以尝试闭合一下看是否存在报错注入 可以看到是报错了,但是当我们想要尝试进行联合查…

浅谈集群的分类

本文主要介绍集群部署相关的知识,介绍集群部署的基础,集群的分类、集群的负载均衡技术,集群的可用性以及集群的容错机制。随后介绍Redis-Cluster以及Mysql的架构以及主从复制原理。 集群介绍 单台服务器本身会受到带宽、内存、处理器等多方面…

PostgreSQL教程(二):pg安装、架构基础、创建并访问数据库

安装 自然,在你能开始使用PostgreSQL之前, 你必须安装它。PostgreSQL很有可能已经安装到你的节点上了, 因为它可能包含在你的操作系统的发布里, 或者是系统管理员已经安装了它。如果是这样的话, 那么你应该从操作系统…

初识表及什么是数据表

一、了解表 1.1.概述 表是处理数据和建立关系型数据库及应用程序的基本单元,是构成数据库的基本元素之一,是数据库中数据组织并储存的单元,所有的数据都能以表格的形式组织,目的是可读性强。 1.2.表结构简述 一个表中包括行和列…

SolidWorks的stl零件导入simulink后仿真尺寸变大

没改单位,in不是导入,是英尺的意思

(提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战

文章目录 (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、提示词Prompt优化本地知识库目标操作步骤问答测试的预设问题原始数据情况数据集优化:预处理,先后准备了三份数据…

【了解机器学习的定义与发展历程】

曾梦想执剑走天涯,我是程序猿【AK】 目录 简述概要知识图谱 简述概要 了解机器学习的定义与发展历程 知识图谱 机器学习(Machine Learning,ML)是一门跨学科的学科,它使用计算机模拟或实现人类学习行为,通…

助力探索社交出海最短变现路径,融云 1V1 音视频「限时免费」

在社交赛道,1V1 业务是最好的切入点。 对于初创公司来说,1V1 业务的技术成本和运营成本相对可控,并且具备与秀场直播等业务融合拓展的巨大空间。未来,相信 1V1 业务会吸引更多开发者投身其中。 一位社交出海经验丰富的从业者曾在…

Servlet(2)

文章目录 更方便的部署方式安装 Smart Tomcat 插件配置 Smart Tomcat 插件 访问出错怎么办出现 404出现 405出现 500出现 "空白页面"出现 "无法访问此网站" 小结 更方便的部署方式 手动拷贝 war 包到 Tomcat 的过程比较麻烦. 我们还有更方便的办法. 此处我…

改进yolov5实现目标检测与语意分割项目

简介 基于ultralytics/yolov5多任务模型。同时实现yolo目标检测与语意分割以增加少量计算和显存为代价,同时完成目标检测和语义分割(1024512输入约增加350MB,同尺寸增加一个bisenet需要约1.3GB,两个单任务模型独立输入还有额外的延时)。模型…

【漏洞复现】大华智能物联ICC综合管理平台弱口令漏洞

Nx01 产品简介 大华智能物联ICC综合管理平台是一个集成了多种智能物联应用服务能力的平台。该平台提供了一系列的基础能力,如中台基础能力、各智能物联应用服务能力以及周边生态支持。 Nx02 漏洞描述 大华智能物联ICC综合管理平台存在弱口令漏洞,攻击者…

导入excel某些数值是0

目录 导入excel某些数值是0数据全部都是0原因解决 部分数据是0原因解决 导入excel某些数值是0 数据全部都是0 有一列“工单本月入库重量”全部的数据都是0 原因 展示的时候,展示的字段和内表需要展示的字段不一致,导致显示的是0。 解决 修改展示的字…

stm32利用CubeMX按键控制数码管加减数

首先画电路图: 接下来配置CubeMX: 设置好后生成MDK工程文件: 用keil打开工程: 添加部分代码: /* USER CODE BEGIN Includes */ uint16_t duan[]{0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; uint1…