4. 嵌入式软件开发之架构设计

嵌入式软件三大代码架构设计方法详解 嵌入式系统开发中,代码架构设计直接影响系统实时性和可维护性。时间片轮询架构通过定时器中断实现准并行任务调度,适合中等复杂度场景;RTOS方案提供真正的多任务管理,满足硬实时需求;前后台顺序执行法则以简单性见长。本文深入解析这三种典型架构的实现原理与技术要点,对比分析其适用场景与工程实践中的关键考量因素,为嵌入式开发者提供架构选型决策依据。 阅读详情


在软件开发中,架构设计是指对系统的整体结构和行为进行规划和设计的过程。架构设计是系统设计中最重要的环节之一,它将对系统的后续开发、测试、部署和维护产生重大影响。

1. 架构设计的原则

架构设计的原则主要包括以下几个方面:

  • 抽象性: 架构设计应该从系统的整体角度进行,关注系统的结构和行为,而不需要考虑具体的实现细节。
  • 可扩展性: 架构设计应该考虑系统未来的扩展需求,使系统能够随着需求的变化而进行扩展。
  • 可维护性: 架构设计应该考虑系统的维护需求,使系统能够在需要时进行修改和升级。

2. 架构设计的视图

架构设计可以从不同的角度进行,常见的架构设计视图包括:

  • 领域视图: 关注系统的不同功能区或领域,如何组织和定义这些领域以及它们之间的关系。
  • 子系统或构件视图: 涉及如何将系统进一步分解为子系统或构件,这关系到模块化、重用性及系统的灵活性。
  • 并发视图: 关注系统中的并发处理和线程管理,如何有效地在多线程或多处理器环境中管理任务和资源。
  • 分布视图: 涉及分布式系统中对象的通信和管理,特别是在不同物理位置或处理器之间的对象交互。
  • 安全和可靠性视图: 专注于设计中的安全性和可靠性因素,确保系统在各种情况下都能稳定运行,防止事故发生。
  • 部署视图 关注软件体系结构如何映射到物理设备上。

2.1 领域视图

领域视图是架构设计中的一个重要视图,它关注系统的不同功能区或领域,如何组织和定义这些领域以及它们之间的关系。

  • 领域的定义:
    在软件工程中,领域指的是特定的业务、技术或知识领域,具有自己的术语和专业知识,定义了一组相关的功能、数据和规则,共同描述了一个特定领域的问题或需求。领域角色代表着一组具有共同语义和功能的模型元素。在系统设计中,领域作为分类和组织信息的一种方式,帮助管理庞大而复杂的类结构(子系统 > 构件(组件)> 类)。

  • 领域建模:
    在建模中,领域被视作包的一种特例,这意味着它们是对包的一种特殊化,用于表示特定主题或功能领域。系统中的所有类几乎都会定义在某个领域中,而每个泛化的分类体系几乎都位于单一领域内。

  • 领域的组织:
    为了方便管理和开发,领域本身可能被细分为更小的子包,这些子包可以分配给不同的开发人员或团队。这样的组织结构形成了系统的逻辑模型,这个模型关注于类和它们之间关系的逻辑正确性,由子系统和构件模型负责实例化。

  • 领域的实际应用:
    对象协作通常跨越多个领域以满足特定用例。尽管如此,每个类都被定义在一个单独的领域内,并且当类属于相同的主题内容时,它们被组织到同一个领域中。嵌入式系统中常见的领域示例包括:用户界面、硬件抽象、数据管理、数据通信和报警管理。应用领域会增加更具体的领域,如:导航和引导、姿态控制、麻醉输送、病人监控、飞机瞄准等。

  • 领域与子系统的关系:
    领域通常定义了可以在许多或所有子系统中实例化的类。例如,所有子系统可能都需要进行总线通信,那么负责管理、发送和接收总线消息的类会在通信领域中定义,并可能在所有子系统中实例化。而有些在特定领域中定义的类可能仅在单一子系统内实例化。例如,尽管航天器的姿态控制子系统可能包含来自多个领域的类实例,但在姿态控制领域中定义的特定类可能仅在姿态控制子系统中实例化。

2.2 子系统或构件视图(简称子系统视图)

子系统或构件视图是架构设计中另一个重要视图,它关注如何将系统进一步分解为子系统或构件,旨在识别系统的主要组成部分及其相互交互,这关系到模块化、重用性及系统的灵活性。

  • 子系统或构件的定义:
    与领域不同,子系统或构件不是一个逻辑结构,而是一个运行时构件。领域更多地关注于系统的逻辑分割和功能区域,而子系统则关注于实现这些功能的实体。
    在实际的系统设计中,子系统通常是指那些实现特定业务逻辑或功能的较大模块。这些子系统可能就是由一组密切相关的构件组成,共同协作以实现更复杂的业务功能。构件在这里充当构建子系统的基本块,每个构件处理子系统中的一部分任务,而整个子系统则负责将这些构件整合在一起,形成完整的业务逻辑或功能。

  • 子系统或构件的组成:
    子系统或构件是由多个对象组成的,这些对象基于系统运行时,多个对象共同的行为目的进行实例化,而非主题内容进行实例化。这意味着子系统或构件在运行时包含了来自不同领域的类的实例,这些对象在系统运行时协同工作,实现特定的行为或功能。

  • 子系统或构件的物理模型:
    子系统或构件模型是物理模型的一个组成部分。物理模型不仅包括了子系统或构件本身,还包括部署视图,后者详述了系统在运行时各个构件如何映射到具体的硬件上。
    在子系统内部,通常会定义一些特定的类,这些类负责协调和管理领域类实例的运作,包括管理复合对象及其接口。这些类通过确定如何在运行时组织和协调各个领域类实例,从而确保系统按预定方式运作。复合对象及其接口类通常是为了实现特定的功能或行为而设计的,它们结合了多个领域类的能力,以满足更复杂或特定的系统需求。

  • 子系统与构件的区别:
    子系统通常由构件组成,而不是直接由类实例组成。在UML中,构件是运行时构件,代表系统或子系统中可替换的部分。构件包含各种类型的对象实例,包括作为线程根的活动类(«active» classes)。

活动类对象作为线程的起点或“根”,在这里线程开始执行。活动类对象通常负责启动和管理它们所控制线程的生命周期和执行过程,包括执行特定的任务、处理并发和同步等

2.3 并发视图

并发视图是架构设计中的一个重要视图,它关注系统中的并发处理和线程管理,如何有效地在多线程或多处理器环境中管理任务和资源。

  • 线程的识别
  • 对象到线程的映射
  • 管理线程执行和共享公共资源的规则

2.4 分布视图

分布视图是架构设计中的一个重要视图,它关注分布式系统中对象的通信和管理,特别是在不同物理位置或处理器之间的对象交互。

  • 对象的通信协议
  • 对象的通信方式
  • 对象的部署

2.5 安全和可靠性视图

安全和可靠性视图是架构设计中的一个重要视图,它专注于设计中的安全性和可靠性因素,确保系统在各种情况下都能稳定运行,防止事故发生。安全性和可靠性视图探讨了如何在系统中定义和管理冗余,以提高系统的可靠性和安全性。安全和可靠性体系结构涉及到存在故障和错误的情况下,系统功能是否正确。冗余可以以多种方式使用,以获得不同程度和类型的安全性和可靠性。

  • 安全性要求
  • 可靠性要求
  • 实现安全性和可靠性的设计

2.6 部署视图

部署视图关注软件体系结构如何映射到物理设备上,例如处理器、显示器等。UML 使用“节点”的概念来表示物理设备。这些节点通常会被“赋予角色”以指示它们代表的硬件类型。

3. 架构设计的模式

架构设计模式是指在架构设计中反复使用且经过验证的解决方案。架构设计模式可以帮助设计者快速和有效地解决复杂的架构设计问题。

架构设计是系统设计中最重要的环节之一,它将对系统的后续开发、测试、部署和维护产生重大影响。架构设计需要考虑系统的各种需求,包括功能需求、性能需求、可扩展性需求、可维护性需求、安全性需求和可靠性需求。

通过了解架构设计的概念、原则、视图和模式,设计者可以更好地进行架构设计,设计出满足系统需求且具有良好可靠性和可扩展性的系统。

常见的架构设计模式包括:

  1. 分层模式(Layered Pattern):将领域组织成抽象层次。
  2. 五层模式(Five-Layer Pattern):针对中小型系统的特定分层领域集。
  3. 微内核架构模式(Microkernel Architecture Pattern):将系统组织成一组核心服务及其可选服务。
  4. 通道架构模式(Channel Architecture Pattern):将系统组织成一系列顺序的转换元素。
  5. 递归容纳模式(Recursive Containment Pattern):将系统组织成几层抽象。
  6. 层次控制模式(Hierarchical Control Pattern):在不同的抽象层次分布复杂的控制算法。
  7. 虚拟机模式(Virtual Machine Pattern):通过构建抽象机器增强系统的可移植性。
  8. 基于构件的架构模式(Component-Based Architecture Pattern):将系统组织成可替换的单元,具有不透明接口。
  9. ROOM模式(ROOM Pattern):使用一组具有强封装性的重量级抽象组织系统。
新书《从入职到架构师——我的嵌入式软件成长之路》目录结构 我是小马儿,一个渴望良知与灵魂的嵌入式软件工程师,欢迎您的陪伴与同行,如需最新版PDF电子书,或期望深入交流,可加我个人微信**nzn_xiaomaer**,需备注“**异维**”二字。 阅读详情

相关推荐

嵌入式软件开发

嵌入式系统架构设计涉及硬件与软件的协同设计,以满足特定功能、性能、功耗和成本要求。核心目标包括实时性、可靠性、低功耗和可扩展性。C 和 C++ 是两种广泛使用的通用编程语言,具有高性能、底层控制能力和跨平台特性。C 是过程式语言,而 C++ 在 C 的基础上增加了面向对象特性(如类、继承、多态)和泛型编程支持(如模板)。外设驱动开发是指为硬件设备编写软件接口,使操作系统能够识别、控制和管理这些设备。驱动开发涉及硬件交互、操作系统内核编程以及设备特定的协议实现。

ATAOL的博客 1227

ASPICE开发流程实战指南:从需求挖掘到软件合格性测试

本文是一份ASPICE开发流程实战指南,详细解析了从需求挖掘到软件合格性测试的完整路径。文章结合车身控制器等实例,阐述了SYS1需求挖掘、系统架构设计、软件详细设计、单元验证与集成测试等核心环节的实践要点,强调了双向追溯、变更管理和高质量交付物的重要性,旨在帮助汽车软件工程师和团队高效应用ASPICE框架,提升开发过程规范性与产品质量。

weixin_29248313的博客 314

嵌入式软件开发进阶

这几年来,伴随着朋友们和网友们的指导、交流,逐渐地学习、提升和拓展。决定抽时间去分享一些心得和资源给初学者,少走弯路,和大家交流,也作为自己的总结和记录,共同成长。 首先,知识爆炸,迭代更新快,即便是不停地学习或许都是不够的。而最需要学习的是:点-线-面,整合,从上到下的开发思路;分解需求、分析问题、解决问题的思路;核心设计思想;基本原理、基础理论、基本方法。这些才是长期有用的利器。此外呢,工欲...

u010623392的博客 853

从零到一:如何用STM32与物联网技术打造你的第一个智能硬件产品

本文详细介绍了如何利用STM32微控制器与物联网技术从零开始打造智能硬件产品。通过智能盆栽系统实例,涵盖硬件选型、嵌入式开发、云平台接入及产品化全过程,特别适合嵌入式初学者和物联网毕设项目参考,提供实用的低功耗设计和商业化建议。

plant的博客 184

【软件系统架构】系列四:嵌入式软件全景解析

《嵌入式软件概述及开发流程》摘要:嵌入式软件是运行在特定硬件设备上的专用程序,具有资源受限、高实时性和强可靠性等特点。其核心组成包括BootLoader、BSP、驱动程序和嵌入式操作系统。开发流程涵盖需求分析、架构设计、开发调试、测试验证和部署发布五个阶段。随着技术发展,嵌入式软件正朝着开源RTOS、云平台连接和边缘AI等方向演进,成为实现智能硬件功能的关键技术支撑。

moton2017的博客 2486

2、嵌入式软件开发计划:从基础到实践

本文详细探讨了嵌入式软件开发计划的制定与实施,强调了书面开发计划的重要性,并介绍了开发计划的核心要素,包括需求分析、架构设计、测试与评审、风险管理及成功标准。文章还提供了开发流程图、风险管理策略及动态调整原则,帮助开发者制定科学合理的开发计划,以提高项目成功率和软件质量。

g8f9d0s1a2的博客 68

嵌入式软件架构设计之分层设计

关注、星标公众号,不错过精彩内容整理:黄工素材来源:网络参考来源:https://blog.51cto.com/kenotu/1614390在正规的项目开发中,项目往往是并行开发的,也就...

strongerHuang 6015

4、嵌入式软件架构设计全解析

本文深入解析了嵌入式软件架构设计的核心理念与实践方法,从‘代码优先’到‘架构优先’的转变出发,阐述了软件架构的重要性及其在复杂系统开发中的关键作用。文章详细介绍了嵌入式软件特有的两种架构——业务规则架构和实时硬件架构,并分析了主流架构模式如无结构单体、分层单体、事件驱动和微服务架构的优缺点。同时探讨了自上而下、自下而上及混合式设计方法,强调了耦合与内聚对架构质量的影响,最后提供了根据项目规模、性能需求和团队能力选择合适架构的实用建议。

wdx01234567的博客 115

用一个实例来探讨嵌入式软件架构设计

一、感慨 近公司新招了一个做嵌入式软件开发开发的童鞋,该童鞋是从上海的某一个上市公司出来的,因为我们这边人手不够,因此把他安排了去负责一个新产品的研发,前期让他负责加速度计、NB-IOT、舵机、外置Flash的功能测试,测试完成之后,准备让他做一个该产品的概要设计。然后他花了2个星期的时间,给我们写出来一个概要设计,说实话,我看到这个概要设计,我就觉得是刚毕业的大学生写的。 版本一的架构设计 ...

EmbeddedCoder 的优快云博客 2270

诠视MR眼镜Unity开发设置_Unity2020.3.38

请按照如下设置Android SDK 和 Gradle。打包前先将Unity切换到Android模式。Preferences 设置。

m0_71932574的博客 603

【KITTI数据集中Raw_Data数据标定文件中的参数关系解读】

上一节本人将KITTI Odometry数据集中的参数文件进行了解释。本节主要针对一些做融合slam的人,将Raw_Data数据标定文件中的参数按照自己的理解做如下阐述。其中,所讲之处如有错误,欢迎各位批评指正。

weixin_43389152的博客 1526

嵌入式软件架构设计

一、前言 小生做MCU方面的开发已经很多年了,记得当初开始做项目的时候,实现功能就是我的目标,基本不会关注其它方面,功能的实现已经够让我折腾的了,也没有多少精力关注其它方面,后面慢慢对代码风格、编码规范有一定的讲究,有些代码看起来令人赏心悦目,而有些却不忍直视,再后来发现有些功能模块在一个产品上做了,然后换一个平台(mcu)后,又得调一遍,有些甚至调了一遍又一遍,多几次之后真是烦躁,哲学上有句话叫"人不能两次踏入同一条河流",而我却是一个坑踩了一次又一次,直到实在受不了了,我决定"再也不踩了",于是,软件框

上官绝痕的专栏 4828

手把手教你用LTspice仿真TVS二极管:从选型验证到波形分析全流程

本文详细介绍了如何使用LTspice仿真TVS二极管,从选型验证到波形分析的全流程。通过搭建仿真环境、核心参数验证和系统级防护策略,帮助工程师低成本评估TVS性能,优化电路设计。特别适用于电源设计和接口防护领域,提升工作效率和设计准确性。

weixin_29234239的博客 646

【愚公系列】软考高级-架构设计师 036-嵌入式软件设计

嵌入式软件设计是指为嵌入式系统开发软件的过程,这种系统通常是专门为执行某些专用任务而设计的,而不是通用计算。嵌入式软件的设计涉及多种技术和方法,其主要挑战包括资源限制、功耗管理、实时性能要求等。交叉编译是指在一个平台上生成可在另一个具有不同CPU或体系结构的平台上执行的代码。这种技术对于嵌入式系统开发尤为重要,因为嵌入式系统的硬件资源通常有限,不足以支持复杂的编译过程。交叉调试是指使用宿主机(通常是性能较强的个人电脑或工作站)上的调试工具来调试运行在目标机(嵌入式设备)上的程序。

愚公智库 10万+

基于深度学习的番茄成熟度检测系统——YOLOv5、YOLOv8、YOLOv10及UI界面的实现

YOLO是一种快速且准确的目标检测模型,近年来,YOLOv5、YOLOv8和YOLOv10作为YOLO系列的重要版本,分别在速度、精度和效率上进行了优化。下面我们简要介绍这些模型。本文介绍了如何基于YOLOv5、YOLOv8和YOLOv10等深度学习模型,结合PyQt5设计一个番茄成熟度检测系统。通过训练模型、优化算法和设计用户友好的界面,我们能够构建一个高效且准确的番茄成熟度检测系统,广泛应用于农业自动化和智能化管理中。

YOLO 1002

分布式训练中All-Reduce、All-Gather、Reduce-Scatter原理

Reduce-Scatter = 先对所有进程的数据做 Reduce(如 sum / mean),再把结果“切分”分发给各进程。(是 Reduce + Scatter 的融合操作。

comli_cn的博客 341

嵌入式软件开发流程

非常细、非常落地,和互联网后端完全不一样,偏。

qq_43582136的博客 848

看28377代码笔记

使用的是20MHz外部晶振,为取200MHz系统时钟,倍频设为20,分频设为2,这样sysclock = 20MHz * 20 / 2,正好200MHz。注意:SPISTE配置成普通的GPIO端口,是为了更好控制芯片,配置芯片的时序。FMULT_0:小数点位数,小数只能有0,0.25,0.5,0.75四个选择。XTAL_OSC:表示使用外部晶振。GPIO_MUX_CPU1:复用类型。GPIO_MUX_CPU1:复用类型。PLLCLK_BY_2:表示2分频。IMULT_20:表示倍频数。

小柚子的博客 807

嵌入式软件开发常用的三种架构

通过对三种常用嵌入式软件架构的分析,可以看出,每种架构都有其独特的优势和适用场景。在实际项目中,开发人员需要根据具体的需求、约束条件和项目目标,选择最适合的架构。无论是单片机架构、RTOS架构还是分层架构,都能够在合适的场景中发挥出巨大的作用,帮助开发团队高效完成任务。??总之,选择合适的嵌入式架构是嵌入式软件开发成功的关键因素之一,理解它们的特点和应用场景,有助于提升我们的设计和开发效率。??

jiangyu258的博客 373

RAG测评实战代码

本文主要介绍了RAG测评实战代码,希望对使用RAG的同学们有所帮助。 文章目录 1. 前言 2. 实战代码 2.1 实战代码一 2.2 实战代码二

herosunly的博客 1万+

(4-2)A*

实际已经花费的代价(g(n)):从起点到当前节点n的实际路径代价。启发式估计的剩余代价(h(n)):从当前节点n到目标节点的估计路径代价。这是A算法的关键之一,启发式函数要足够接近实际代价,但又要高效计算。如果启发式函数等于0,A算法就相当于Dijkstra算法。实现A*算法的核心步骤如下所示。(1)初始化:将起点加入开放列表(open list),并将其f值设为g值和h值的和。(2)循环:从开放列表中选择具有最小f值的节点作为当前节点。如果当前节点是目标节点,算法结束;

码农三叔 1807

嵌入式软件架构设计(转载)

嵌入式软件架构设计实际该怎么做? 一错误的示范 最近公司新招了一个做嵌入式软件开发的同事,该同事是从上海的某一个上市公司出来的,因为我们这边人手不够,因此把他安排了去负责一个新产品的研发,前期让他负责加速度计、NB-IOT、舵机、外置Flash的功能测试,测试完成之后,准备让他做一个该产品的概要设计。然后他花了2个星期的时间,给我们写出来一个概要设计,说实话,我看到这个概要设计,我就觉得是刚毕业的大学生写的。 版本一的架构设计 2.1系统体系结构 系统分为两层:硬件驱动层、应用层。 2..

weixin_40593838的博客 2999

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

嵌入式软件架构设计资源下载

嵌入式软件架构设计资源下载 【下载地址】嵌入式软件架构设计资源下载分享 本仓库提供了一个名为“嵌入式软件架构设计”的资源文件下载。该资源文件专注于电机控制的数字信号处理器(DSP)的嵌入式软件架构分析与设计 项目地址: https...

gitblog_06681的博客 330

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

嵌入式软件的解耦

将系统分解为多个独立的组件,每个组件负责执行特定的数据转换或处理任务,可以灵活地相互结合,并通过“管道”将这些组件串联起来,形成一个完整的工作流程。即使是资源受限的单片机裸机系统,采用大循环体架构,或者中断-循环前后台(中断处理紧急事务,主循环处理常规任务)架构,也尽量划分至少两层,即保留硬件抽象层和业务层。一个复杂模块,明确拆分外部输入,内部执行,结果输出三部分,再合理的与其它模块对接,尽量保证对外接口简单稳定,外部无需过多关注内部实现,这是实现软件解耦的基本规则。

strongerHuang 501

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

嵌入式软件测试笔记3 | 嵌入式软件测试开发的多V模型

①每个部件开发一个模型;②硬件和软件的迭代开发;①软件、硬件开发团队;③不同的部件进行集成。③硬件和软件的协同。

虫无涯的博客 673
上一篇: 1.6 何为设计模式
下一篇: 嵌入式软件开发从小工到专家
Let's Chat Coding
博客等级 码龄3年 1020粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值