书摘:C 嵌入式系统设计模式 06

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

本系列描述我对书中内容的理解。本文章描述原书第 2 章的内容。

作为嵌入式软件开发人员,现在让我们把注意力转向一个基本问题,即:我们如何完成一个复杂设计。

作者是 IBM 公司 Harmony 流程的作者。Harmony 流程 是一种通用系统开发流程,在强调实时和嵌入式软件开发方面的同时,还包括生成通用软件和系统的步骤。 Harmony 流程已有效地应用于 1-3 人的小型项目以及由数百名团队成员组成的大型团队。 Harmony 是一种高度可扩展的“中等重量级”流程,在重量级流程和轻量级所谓的“敏捷方法”(例如极限编程 (XP))之间取得平衡,同时结合了两者的各个方面。它是一种敏捷的、基于模型的软件开发方法,强调软件在整个开发、测试驱动开发和设计模式的使用过程中持续履行 Harmony 流程。

作者认为,遵循 Harmony 流程,有助于完成一个复杂的设计。

要理解这一章内容有点困难,因为这章内容是讲 方法论 的,涉及到很多名词,比较抽象。更重要的原因是我们看到的这章内容,实际上在作者另一本名为《Real Time UML Workshop for Embedded Systems》的书中,用了整本书来讲解。我们看到的是被压缩的内容,理解起来很困难就不奇怪了。

首先什么是 方法论 ?作者给出的解释是:方法论由语言和步骤组成。语言指定需要关注的元素(通常是类、函数)极其关系;步骤用来告诉开发人员使用语言的哪些部分、如何使用以及何时使用。Harmony 流程 是一种方法论,它使用 UML 极其变体作为语言。Harmony 流程还指定了一组各部分密切协调的工作流来指导开发人员,以便他们能够充分利用 UML 来开发健壮、有能力且安全的系统。

然后什么是 流程 ?在 Harmony 中,流程 是一种规范,规定了一组有序的 活动,由一组协作的工作人员执行,并且产出所需的项目成果。在这个定义中,活动 是工作人员在履行职责时所做的任务。

好的流程可以提供一种有效的指南,能够以最低成本开发高可靠性系统。坏的流程要么完全没有指定工作流,要么浪费开发人员的时间做错误的事情,比如生成厚厚的文档。

一个流程通常分为几个 阶段 ,可以认为流程是最大规模的 活动 。每个阶段都指定了一个或多个 工作流。每个工作流都是一组有序的活动(由工作人员执行的简单任务)以及产出构成。工作流 详细说明员工必须完成哪些活动?何时完成?如何完成?以及产出是什么?表示工作流的常见方法是使用 UML 活动图(活动图是九种 UML 图中的一种,描述业务实现用例的工作流程),本书也是如此。

Harmony 流程侧重于三个时间尺度:宏周期、微周期和纳周期。较小的项目更多地关注微周期和纳周期,但随着项目规模的扩大,更多的注意力应转移到宏周期层面,以组织和协调整个开发过程。

  1. 宏周期:侧重于项目的总体时间表和主要里程碑。项目管理、决策者需要关注,以月计。
  2. 微周期:专注于开发单个经过验证的模块或原型。开发团队关注,以周计。
  3. 纳周期:专注于软件的持续执行、调试和单元测试。个人关注,以分钟或小时计。

在这里插入图片描述

首先,设计是只有在我们从软件分析阶段获得了正确运行的软件之后才会发生的事情。其次,设计的重点是优化这个正确运行的软件。后一点很重要,因为这就是设计模式——本书的主题所做的。设计模式不是为了让软件正确工作;它们是为了让软件以最佳方式工作。

这也是现代敏捷开发提倡的做法,先跑起来,再寻求跑快。

Harmony 流程使用三个级别的设计:

  1. 架构设计:着眼于整体优化系统,细分为五个关键视图:并发和资源视图、分布视图、安全性和可靠性视图、部署视图和子系统和组件架构视图。
  2. 机制设计:这是一种设计方法论。在协作层面上优化,关注系统内部各组成部分之间的相互作用和因果关系。一组简单元素相互作用形成系统的各个功能。简单元素一般是指类、函数、变量等。
  3. 详细设计:关注类、函数、变量等,是开发人员最常见的关注级别,通常对整体性能影响最小。

架构设计

我们所说的 系统架构 是指从系统角度识别影响大部分或全部系统的战略设计决策。 系统的观点是“高于”软件、电子或机械工程。 因此,系统架构重点关注子系统集的规范(子系统是由系统分解而来)、这些子系统的需求和功能的分配,以及这些子系统之间的接口。 在系统架构活动结束时,系统模型的一部分被移交给子系统团队,然后将每个子系统分解为工程学科,并开始更详细的分析和设计工作。

在 Harmony 流程中,我们将 架构 定义为一组战略设计决策,指定系统中的元素如何组织和交互。 我们定义中的关键术语是战略和设计。 在 Harmony 流程中,设计 就是优化。 分析模型主要由系统的功能需求驱动——系统需要做什么才能正确。 设计是由服务质量要求(这些功能必须实现的程度)以及统称为“设计标准”的其他优化特征驱动的。分析模型可以用几乎无限种不同的方式进行优化,以实现不同的优化目标。 例如,可以以最坏情况性能为代价来优化内存使用,或者可以以开发时间为代价来优化可重用性。

Harmony 流程中的另一个关键术语是 战略。 战略是与策略相关的、具有长远规划和目标的决策或行动。我通过战略,所有系统元素都必须与架构决策保持一致。 由于架构设计决策是在总体或总体级别上优化系统的尝试,因此此类决策是战略性的。

无论设计工作的范围如何,设计在很大程度上都是通过 设计模式 的应用来进行的。无论如何,设计模式都不是灵丹妙药;它们只是优秀设计师已经做过的事情的整理。 设计模式是重复出现的问题的通解。 最优秀的设计师会使用以前经过验证的设计解决方案。 设计模式方法以可重用的方式捕获这些解决方案,从而促进它们重新应用于其他问题。

机制设计

机制设计 在协作层面优化模型。 协作 是一组类和对象,它们一起工作以实现更大规模的行为,例如用例的实现。 由于典型的系统具有一到几十个用例),因此机制设计的设计决策范围比架构设计小一个数量级。 如果有 25 个用例协作,则必须应用机制设计 25 次,每个用例一次。 根据特定协作的特定需求,它将使用不同的设计模式,因为上下文可能不同,而且设计标准也可能不同。

协作是一组类和对象一起工作以实现更大范围的目的。 在面向对象编程中,一个对象通常具有特定的职责和行为。这些职责和行为可以通过类(Class)来表示。在更复杂的设计中,一个类可能不只代表一种角色或职责,而是可以扮演多种角色。协作是根据扮演命名角色的特定类来指定的,这些角色相互作用以产生更大规模的行为和功能。 设计优化问题的解决方案通常可以在不同的特定环境中推广和重用。 这种可重用的设计解决方案称为设计模式。 从抽象意义上讲,角色定义了模式的形式参数。 当与实际参数(来自分析协作的类)绑定时,该模式被称为实例化。 机制 是一种模式,其范围仅限于少数类(即,它没有架构范围),但通常适用于许多情况。 因此,机制设计是 Harmony 流程中的术语,指的是应用机制来产生设计级协作。

Harmony 设计过程非常注重模式。 下图显示了 Harmony 流程的机制设计工作流程。 要理解工作流程,重要的是要记住 Harmony 流程中建议的生命周期是螺旋形的; 螺旋生命周期将最终产品创建为一系列功能逐渐增强的版本,称为迭代原型。通常,在任何给定的螺旋中仅实现一个或少量用例。 随着更多螺旋的完成,原型变得越来越完整和强大,直到最终项目完成并将原型运送给客户。

在这里插入图片描述
正如建筑设计一样,明确指定设计标准以便选择适当的设计模式非常重要。 这些标准按重要性顺序排列。 此排名很重要,因为许多设计标准会相互冲突,并且设计模式的正确应用要求你以牺牲最不重要的设计标准为代价来优化最重要的设计标准。

常见的设计优化标准有:性能、可预测性、吞吐量、稳定性、安全性、可重用、可维护、可移植、可扩展。

确定重要的设计标准。这是经常被忽略的步骤。要记住,每当系统的某些方面得到优化时,其它一些方面总是会被牺牲。

这与 Gerald M. Weinberg 在《咨询的奥秘》中讲的那个故事很像:“给我们以最低的成本解决”、“在最短的时间内搞定”…,那么,“你愿意牺牲什么呢?”提升一方面,就要牺牲另一方面

在项目刚开始的时候,有一些基础工作不能忽略:设定明确的目标和优先级、预先思考设计上和开发上的问题并设法预防、建立测试计划、设定质量标准。这是《微软研发致胜策略》一书中的原话。

详细设计

详细设计 在更低的抽象层次上优化系统。 详细设计应用惯用语来优化各个类的功能。详细设计的范围大约比机制设计小一个数量级。 虽然这听起来令人畏惧,因为典型系统中的类数量巨大,但实践表明,设计良好的系统中的大多数类都非常简单,几乎不需要优化。 通常有一小部分类(约 3% ~ 5%)需要特别努力。 正是针对这些“特殊需求”的类,我们在细节设计上投入了大部分的精力。

详细设计在类级别优化系统,因此主要关注类特征——属性、操作、状态、活动和端口。 协作涉及 10 到 100 个类(可能更多),但真正需要特别关注的只有少数类。 这些类在数据结构或行为方面更复杂,或者具有高优化要求的控制。

这里的 端口 的含义是:在面向对象编程中,特别是在UML(统一建模语言)中,“port”(端口)是一个与类相关的概念。它描述了类与外部环境的交互点,通常用于定义一组特定的服务或行为。

如何阅读本书中的设计模式

为了提高模式的可用性,本书的所有模式都以相同的方式组织,格式如下:

  • 摘要
    简要描述该模式的应用场景,这是对问题、解决方案和结果的概述。
  • 问题
    陈述问题的背景,陈述模式能解决什么问题。
  • 模式结构
    这里提供模式的结构 UML 图,显示模式的重要元素,以及模式元素之间的关系。
  • 结果
    描述使用该模式时所做的权衡。
  • 实现策略和源代码
    讨论实现该模式的问题,围绕不同的计算平台或不同的编程语言来讨论。
  • 例子
    每个模式都会有例子,说明如何应用该模式。包括UML 、 源代码等。

本章给出了一个模式例子: 观察者模式 。正是这个例子,让我入坑了这本书。全书描述的设计模式总共只有 4 类,分别是:

  1. 访问硬件的设计模式 (Design Patterns for Accessing Hardware)
  2. 嵌入式并发和资源管理的设计模式 (Design Patterns for Embedding Concurrency and Resource Management)
  3. 状态机设计模式 (Design Patterns for State Machines)
  4. 安全和可靠性模式 (Safety and Reliability Patterns)

对于嵌入式开发者来说,理解这些模式,以及这些模式背后的含义,并将它们运用到项目中去,一定会收获很多的。






读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)
千金难买知识,但可以买好多奶粉

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BetaFlight开源代码之电压校准

BetaFlight开源代码之电压校准 1. 源由2. 分析数据流3. 采样电路3. 原理4. 示例5. 实测&转换数据6. 参考资料 1. 源由 既然复杂的BetaFlight开源代码之电流校准都过了一遍,电压相对来说是比较简单的,一起过一下 2. 分析数据流 电源路径1》采样电路…

Pix2Seq 算法阅读记录

目录 前向传播过程 训练过程: 网络结构 前向传播过程 batch_preds--> tgt-->tgtcat(tgt, padding)-->tgt_embedding-->tgt_mask,tgt_padding_mask 以NLP的角度,tgt 代表了 词汇表的长度,encoder部分直接对图像进行处理&#…

优势演员-评论家算法 A2C

优势演员-评论家算法 A2C 优势演员-评论家算法 A2C主要思想目标函数 优势演员-评论家算法 A2C 前置知识:演员-评论家算法:多智能体强化学习核心框架 主要思想 AC 网络结构: 策略网络 - 演员: 这个网络负责根据当前的状态选择动作。它输出的是…

LabVIEW在指针式仪表读数中的应用

在LabVIEW环境中,为实现指针式仪表的自动读数,首先进行图像预处理,包括图像缩放、灰度化和二值化,以提高处理速度和减少噪声干扰。利用LabVIEW的图像处理功能,灰度化和二值化操作简化了图像的色彩信息,便于…

Java HashMap 面试题(一)

HashMap 面试题(一) 文章目录 HashMap 面试题(一)3.3 面试题-说一下HashMap的实现原理?面试题-HashMap的put方法的具体流程hashMap常见属性源码分析 3.3 面试题-说一下HashMap的实现原理? HashMap的数据结…

Mongodb删除操作中字符序对结果的影响

本文还是要从删除操作的语法说起。 db.collection.deleteMany(<filter>,{writeConcern: <document>,collation: <document>,hint: <document|string>} ) 删除语法中&#xff0c;可以指定数据写入策略&#xff0c;字符序和使用的索引字段。 字符序&a…

2024--Django平台开发-Web框架和Django基础(二)

day02 Web框架和Django基础 今日概要&#xff1a; 网络底层引入&#xff0c;到底什么是web框架&#xff1f;常见web框架对比django快速上手&#xff08;创建网站&#xff09;常见操作&#xff1a;虚拟环境、django项目、多app应用、纯净版逐点剖析&#xff1a;路由、视图、模…

mysql的分页查询

我们来看下一段查询&#xff1a; select * from sys_role; 如果我们要进行分页查询&#xff0c;例如每页显示两条数据&#xff0c;我们可以利用 limit 关键字&#xff1a; select * from sys_role limit 0,2; select * from sys_role limit 2,2; 假设我们当前页面为 n&#xf…

机器学习--ROC AUC

参考 机器学习-ROC曲线 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/347470776一文看懂ROC、AUC - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/81202617 在了解之前&#xff0c;我们先来认识一下以下的概念 针对一个二分类问题&#xff0c;将实例分成正类(postive)或…

java基于SSM的游戏商城的设计与实现论文

基于SSM的游戏商城的设计与实现 摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于游戏信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以…

系统及应用安全

引导语 系统安全及应用是现代信息系统的核心组成部分&#xff0c;它不仅关乎信息安全&#xff0c;更直接影响到企业的运营效率、财务状况乃至品牌信誉。通过不断改进和强化系统的安全性&#xff0c;可以为企业创造一个更加可靠、高效的信息化环境。 一、账号安全的基本措施 …

狮子目标检测数据集VOC格式300张

狮子&#xff0c;作为“丛林之王”&#xff0c;以其威武雄壮的身姿和卓越的狩猎能力闻名于世。 狮子的体型健硕&#xff0c;毛发浓密&#xff0c;通常是金黄色或浅褐色&#xff0c;腹部和腿部的毛发相对较浅。狮子的头部特别大&#xff0c;长有一对威风凛凛的鬃毛&#xff0c;…

玩转Mysql 四(MySQL逻辑架构与数据引擎)

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。 一、MySQL逻辑架构 1、从Oracle收购MySQL后&#xff0c;MySQL逻辑架构受Oracle影响&#xff0c;MySQL8版本中逻辑架构受Oracle的影响逐步完善查询缓存&#xff0c;O…

多线程高级面试题

1. 什么是 ThreadLocal&#xff1f; 参考答案 ThreadLocal 叫做本地线程变量&#xff0c;意思是说&#xff0c;ThreadLocal 中填充的的是当前线程的变量&#xff0c;该变量对其他线程而言是封闭且隔离的&#xff0c;ThreadLocal 为变量在每个线程中创建了一个副本&#xff0c;…

2023年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分…

关于“Python”的核心知识点整理大全65

目录 20.2.19 设置 SECRET_KEY 20.2.20 将项目从 Heroku 删除 注意 20.3 小结 附录 A 安装Python A.1.1 确定已安装的版本 A.1.2 在 Linux 系统中安装 Python 3 A.2 在 OS X 系统中安装 Python A.2.1 确定已安装的版本 A.2.2 使用 Homebrew 来安装 Python 3 注意 …

[技术杂谈]使用VLC将视频转成一个可循环rtsp流

通过vlc播放器&#xff0c;将一个视频转成rtsp流&#xff0c;搭建一个rtsp服务器。rtsp客户端可访问这个视频的rtsp流。 1. 打开vlc播放器&#xff0c;使用的版本如下 2. 菜单&#xff1a;媒体 ---> 流 3. 添加视频文件&#xff0c;点击添加一个mp4 文件 4. 选择串流&…

【软件测试】学习笔记-测试覆盖率

测试覆盖率通常被用来衡量测试的充分性和完整性&#xff0c;从广义的角度来讲&#xff0c;测试覆盖率主要分为两大类&#xff0c;一类是面向项目的需求覆盖率&#xff0c;另一类是更偏向技术的代码覆盖率。 需求覆盖率 需求覆盖率是指测试对需求的覆盖程度&#xff0c;通常的做…

LeetCode 每日一题 Day 3334(hard)35 ||二进制枚举/单调栈/链表遍历

2397. 被列覆盖的最多行数 给你一个下标从 0 开始、大小为 m x n 的二进制矩阵 matrix &#xff1b;另给你一个整数 numSelect&#xff0c;表示你必须从 matrix 中选择的 不同 列的数量。 如果一行中所有的 1 都被你选中的列所覆盖&#xff0c;则认为这一行被 覆盖 了。 形式…

【CANopen】关于STM32中CanFestival的pdo应用

系列文章目录 文章目录 系列文章目录一、发送1、同步传输2、异步传输 二、接收 使用STM32F407单片机 pdo属于过程数据用来传输实时数据&#xff0c;即单向传输&#xff0c;无需接收节点回应。 一、发送 分为同步传输和异步传输。 1、同步传输 分为循环传输&#xff08;周期…