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://www.mzph.cn/news/698602.shtml

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

相关文章

性能测试的几个指标范围(CPU,内存,IO,网络)

性能测试中,对服务端的指标监控也是很重要的一个环节。通过对各项服务器性能指标的监控分析,可以定位到性能瓶颈。 后端性能指标有 CPU,内存,网络,jvm,I/O 等等 分析思路 整体系统 CPU 利用率 内存利用…

VMware虚拟机内部打开错误

修改vmci0.present"TRUE" 找到虚拟机相对应的"***.VMX文件";用记事本打开它,找到这一行:vmci0.present"TRUE"将TRUE改为 FALSE或者直接将这行删除。(只是临时解决兼容性问题)。重启VM虚拟机。

【论文精读】Diffusion Transformer(DiT)

摘要 以往的Diffusion模型主要以卷积UNet作为主干网络,本文发现U-Net的归纳偏差对Diffusion模型的性能并不是至关重要的,可以用Transformer等取代。通过利用其他视觉方向成熟的Transformer方案和训练方法,Diffusion模型可以从这些架构中获益&…

一篇文章搞懂CDN加速原理

目录 一、什么是CDN CDN对网络的优化作用主要体现在以下几个方面: 二、CDN工作原理 CDN网络的组成元素: 三、名词解释 3.1 CNAME记录(CNAME record) 3.2 CNAME域名 3.3 DNS 3.4 回源host 3.5 协议回源 一、什么是CDN CD…

【SpringBoot3】Spring Security 常用配置总结

注:本文基于Spring Boot 3.2.1 以及 Spring Security 6.2.1 相关文章 【SpringBoot3】Spring Security 核心概念 【SpringBoot3】Spring Security 常用注解 【SpringBoot3】Spring Security 详细使用实例(简单使用、JWT模式) 【SpringBoot3】…

【MATLAB GUI】 4. 坐标区和表

看B站up主freexyn的freexyn编程实例视频教程系列36Matlab GUI的学习笔记 文章目录 坐标区表 坐标区 任务要求设计一个图像显示界面,根据选定的周期做出相应的sin函数图像 使用坐标区、弹出式菜单、普通按钮设计页面,弹出式菜单string设置为1、2、3、4代…

linux定时清理缓存

1、创建清理缓存脚本2、脚本授权3、创建自动任务4、查看自动任务是否添加成功 1、创建清理缓存脚本 vim cache_clean.sh #!/bin/bash #每天清除一次内存buff/cache缓存 echo "开始清除缓存" sync; #写入硬盘,防止数据丢失 for i in $(seq 3);do sudo sh…

【Linux系统化学习】深入理解匿名管道(pipe)和命名管道(fifo)

目录 进程间通信 进程间通信目的 进程间通信的方式 管道 System V IPC(本地通信) POSIX IPC(网络通信) 管道 什么是管道 匿名管道 匿名管道的创建 匿名管道的使用 匿名管道的四种情况 匿名管道的五种特性 命名管道 …

iOS总体框架介绍和详尽说明

iOS总体框架介绍和详尽说明 一、iOS是什么?1.iOS简述2.iOS界面 二、iOS总体框架介绍和详尽说明1.iOS的框架层级1. 核心操作系统层(Core OS layer)1.1 Accelerate Framework1.2 Core Bluetooth Framework1.3 External Accessory Framework1.4 …

【wails】(4):使用wails做桌面应用开发,整合chatgpt-web项目做前端,进行本地开发,web端也可以连调,使用websocket实现

1,视频地址 【wails】(4):使用wails做桌面应用开发,整合chatgpt-web项目做前端,进行本地开发,web端也可以连调,使用websocket实现 2,演示效果 启动先是报500 错误&#…

Charles小程序抓包(安卓版)

微信小程序/公众号抓包的主流方式 目前有以下几种: 1、WindowsBurpProxifier(配置困难,数据包卡顿) 2、Burp安卓模拟器(模拟器卡顿) 3、BurpCharles(本文测试,抓包完整,放包流畅…

编程语言选择的方法

根据目的选择 理论上说,只要达到目的,选择任何一种编程语言都可以。实际上,只要确定了想要编写的内容和执行环境,就可以在某种程度锁定可以使用的语言的种类。 比如,如果想要创建Windows的桌面应用&…

防御保护第八、九、十、十一天笔记

一、内容安全 1、DFI和DPI技术 --- 深度检测技术 DPI是一种基于应用层的流量检测和控制技术,它会对流量进行拆包,分析包头和应用层的内容,从而识别应用程序和应用程序的内容。这种技术增加了对应用层的分析,识别各种应用&#xf…

Vue学习之响应式基础

声明式响应状态 在组合式API中,推荐使用ref()函数来声明响应式状态: Import{ref} from vueref() 接收参数,并将其包裹在一个带有 .value 属性的 ref 对象中返回: Const countref(0) Console.log(count)//{value:0} Console.log…

【2024.02.22】定时执行专家 V7.0 发布 - TimingExecutor V7.0 Release - 龙年春节重大更新版本

目录 ▉ 新版本 V7.0 下载地址 ▉ V7.0 新功能 ▼2024-02-21 V7.0 - 更新日志▼ ▉ V7.0 新UI设计 ▉ 新版本 V7.0 下载地址 BoomWorks软件的最新版本-CSDN博客文章浏览阅读10w次,点赞9次,收藏41次。▉定时执行专家—毫秒精度、专业级的定时任务执行…

Jenkins2.426邮件通知配置

之前安装的jenkins出现问题了,重新装了jenkins,需要重新配置:Maven,JDK,Allure报告,邮件通知,Extended E-mail Notification等 配置Maven,JDK参考:CICD集合(四):Jenkins…

vue中使用wangEditor富文本编辑器

jsd-2306-vue-01: 教学项目教学项目教学项目教学项目教学项目 2306-vue-baking-teacher: 教学项目教学项目教学项目教学项目 一、脚手架工程中使用富文本编辑器wangEditor 1.通过以下命令 安装wangEditor npm i wangeditor -S 2.在main.js文件中添加以下配置信息 //引入wa…

快别回消息了哥,快手测试开发工程师三面

大家好,我是chowley,进回顾一下之前参加的技术面试 部门:商业化 时间:50min 平台:轻雀,这平台纯nt,用Mac面试,麦克风老连我iPhone 过程 自我介绍实习经历一实习经历二有用到覆盖…

PYthon:super与类的继承

两种继承方式: Class SubClass(FartherClass):子类可以任意调用父类的成员变量、成员函数,适合单继承,即只继承一个父类。 Super:适合多继承 统一用一种,不要交叉用。 class FooParent(object): def _…

多数pythoneer只知有列表list却不知道python也有array数组

数组和列表 Python中数组和列表是不同的,我敢断言大多数的pythoneer只知道有列表list,却不知道python也有array数组。列表是一个包含不同数据类型的元素集合,而数组是一个只能含相同数据类型的元素集合。 Python的array库是一个提供数组操作…