4.8 嵌入式系统:基于组件的开发

4.8 基于构件体系结构:引言-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/ChatCoding/article/details/135589413引言

4.8 基于构件体系结构:引言-CSDN博客

共用基础模块(Common Building Blocks, CBB)

基于组件的开发(Component-Based Development,CBD)

4.8.1 Abstract

组件化系统是一种将软件系统拆解成独立可替换的组件进行开发的架构方式,具有易于维护、缺陷隔离、语言独立、易于开发和可复用的优势。

组件化系统的优势及特点

组件化系统具有以下引人注目的优势:

  • 易于维护: 由于组件是强封装的对象,内部结构对外部不可见,因此修改或替换单个组件时不会影响其他组件,降低了维护成本。
  • 缺陷隔离: 系统中的缺陷通常被隔离在单个组件中,修复缺陷时只产生局部影响,不会波及整个系统。
  • 独立于源代码语言: 组件通过接口与外部进行交互,接口与具体编程语言无关,使得组件可以在不同语言开发的系统中复用。
  • 易于开发: 组件化的开发方式可以将复杂系统拆解成一个个独立的组件,分别开发测试,提高开发效率。
  • 可重复利用: 同一个组件可以被重复应用于不同的系统中,提高了代码的复用率。

这些优势源于组件本身的特点:

  • 强封装: 组件内部结构隐藏,只通过接口与外部交互。因此,修改或替换单个组件时,不会影响其他组件,从而提高了维护性。
  • 语言无关的接口: 组件接口独立于具体的编程语言,因此组件可以在不同语言开发的系统中进行重用,提高了可移植性。
  • 大规模对象: 组件通常由多个较小的对象组成,实现特定的功能。
  • 构件(组件)可以包含多个子构件,也可以使用其他构件的服务。
  • 构件(组件)还可以包含多个线程。

组件与其他对象的区别在于:

  • 接口的性质:组件接口独立于源代码语言,并且可以提供功能和配置服务。
  • 应用场景:组件是可替换的,需要有良好的文档描述接口、行为和性能等特征。

组件化应用与传统应用结构不同:

  • 可替换的高层单元:组件化系统的灵活性与可维护性源于其由可替换的高层单元构成。
  • 可插拔架构:组件化的架构允许在运行时动态替换组件。
  • 通用组件集:类似于现代计算机系统,组件化系统也可以由一套通用的组件构建。

4.8.2 Problem

组件化架构模式旨在解决以下问题

  • 软件系统在维护过程中需要具有鲁棒性,即能够抵御修改的影响。
  • 软件系统需要能够在各种情况下进行重用。

4.8.3 Pattern Structure

图4-20展示了组件化架构模式的结构。

4.8 嵌入式系统:基于组件的开发_第1张图片

4.8.4 Collaboration Roles

组件化架构模式定义了几个关键角色,用于描述组件之间的协作和管理:

1. 客户端接口 (Client Interface):

  • 接口通常定为组件客户端与组件之间的契约。
  • 接口包括函数签名、服务的前提条件、后提条件和可能抛出的异常。
  • 以状态图的形式进行建模,并保持不透明(不透露内部实现),以确保组件的可替代性(使用实现相同接口的其他组件进行替代)。

2. 协作 (Collaboration):

  • 协作是系统内部各部分为了共同目标而进行的互动。(一组语义对象(在领域中定义,在组件中实例化)的协作)
  • 通过协作实现组件的用例。

3. 组件 (Component):

  • 组件是一个复合对象,包含一个或多个协作。
  • 组件是一个容器
    • 为外部组件用户提供接口。
    • 为内部协作对象提供接口。

4. 组件框架 (Component Framework):

  • 组件加载器、组件管理器和组件存储库组成,负责组件的加载和管理。

5. 组件加载器 (Component Loader):

  • 响应组件管理器的请求加载组件,如果使用静态链接则可以省略。

6. 组件管理器 (Component Manager):

  • 运行时管理一组组件。仅在需要动态链接组件时需要,静态链接时可省略。
  • 允许交换、加载和卸载组件,包括依赖其他组件的链式组件。

7. 组件存储库 (Component Repository):

  • 所有活动的组件都注册到组件存储库,确保组件加载器在加载组件时能够找到它们。
  • 当组件或客户端模块想要调用已加载组件的服务时,应先在组件存储库找到它的位置。
  • 组件存储库返回所需的组件的引用、句柄或指针。
  • 还可能维护每个组件的引用计数,计算注册到给定组件的客户端数量。

8. 管理接口 (Management Interface):

  • 由组件框架使用的接口,实际提供的服务取决于组件化架构模式的具体实现。
  • 通常包括组件的名称和版本以及该组件依赖的组件列表(以便也可以加载)。

总结

组件化架构模式通过定义清晰的协作角色,实现了组件间的解耦和互操作,提高了系统的可扩展性和可维护性。

4.8.5 Consequences

采用组件化架构模式会带来一系列影响,总体而言之,主要优势是可复用性和易于构建,主要劣势是潜在的性能开销和资源冗余

优势:

  • 高可复用性: 组件化架构允许将预先定义和新开发的组件组合起来构建系统和子系统,就像硬件工程师用标准元件搭建电路一样。组件之间通过不透明的、独立于源代码语言的接口进行交互,大大提高了组件的复用性。目前市场上提供各式各样的可复用组件,涵盖用户界面、通信、分布式对象中间件和数学库等领域。
  • 易于构建: 类似于用乐高积木搭建玩具,采用组件化架构可以更快地组装系统和子系统,降低开发难度和周期。

劣势:

  • 潜在性能开销: 由于组件接口的不透明性,客户端无法依赖组件的内部实现细节,这可能会限制一些潜在的优化,导致性能下降。
  • 资源冗余: 组件通常是功能封装的大型对象,即使系统只用到它少量服务,也需要加载整个组件及其依赖的其他组件,增加内存和 CPU 等资源消耗。

总结:

组件化架构模式提供了构建可复用、易于维护的软件系统的有效途径,但同时也需要考虑潜在的性能开销和资源冗余问题。在实际应用中,需要权衡利弊,选择适合项目需求的架构模式。

4.8.6 Implementation Strategies

组件化设计 (CBD) 是一种流行的构建大型复杂系统的方法。 为了快速实现 CBD,通常会采用框架的方式,其中组件扮演着明确的角色。

在嵌入式领域,常用的组件化框架包括:

  • FreeRTOS:一个开源的嵌入式实时操作系统,提供了组件化的内核和丰富的组件库。
  • Microchip MPLAB Harmony:一个由 Microchip 提供的嵌入式开发框架,提供了组件化的硬件抽象层和丰富的组件库。
  • NXP i.MX RT:一个由 NXP 提供的嵌入式开发平台,提供了组件化的硬件抽象层和丰富的组件库。

组件化架构模式有很多变体,本文介绍了一种支持动态加载和卸载组件的实现方式。 组件可以是静态的(静态链接,因此它们存在于应用程序的加载映像中),也可以是动态的(按需加载,例如按需加载)。

组件本身可以主要包含数据(例如配置表和数据库),也可以主要包含行为(例如数学库),或者两者兼而有之(例如 GUI 组件,例如窗口小部件)。

使用现成组件 (COTS) 可以进一步发挥组件的优势:系统使用已经标准化的组件架构,会有大量可用的组件。  创建自己的组件架构时应参考现有成熟的组件架构,避免多走弯路。

为了在嵌入式系统中实现基于组件的设计(CBD),当编写或集成组件时,必须遵循严格的接口和服务约定。在定制或选择嵌入式CBD框架时,可能需要开发一套独特的规范来匹配特定的硬件和软件需求。无论是采用现有的框架还是自行构建一套新的体系,下列功能对组件的成功集成至关重要:

  • 组件服务调用协议:必须有一个清晰的协议来调用组件提供的服务,这一协议要高效、简单,以适应嵌入式系统的性能和内存限制。
  • 组件发现与动态加载机制:要有一种机制,能够在系统启动或运行时发现组件,并在必要时加载进来。这个机制需要足够轻量,以减少对系统资源的占用。
  • 语言独立的接口描述:组件接口应该用一种与编程语言无关的方式来描述,以保证不同编程语言编写的组件可以相互操作,并提高组件的可复用性。
  • 组件版本控制:有必要通过一种标准方式来识别组件的版本号,这对于维护和更新组件至关重要。
  • 组件依赖性追踪:一个组件可能依赖于其他组件。有效识别这些依赖关系,并确保依赖项的正确加载,对系统稳定性是必须的。
  • 灵活的组件管理基础设施:系统应当提供基础设施,允许组件按需被加载和卸载,这样可以优化内存使用,并允许系统适应不同的运行时需求。

在嵌入式领域中,所有这些需求必须在尊重硬件资源极限的基础上实现。这通常意味着必须对CBD框架进行定制,以期在功能性和资源利用之间找到合理的平衡。

由于组件应该具有与编程语言无关的指定和使用接口的方法,因此一些组件架构提供了一种接口描述语言 (IDL) 来指定接口。不同的 IDL 编译器将 IDL 描述的接口映射到目标编程语言(组件开发者或组件用户使用的编程语言)。

在大型 CBD 系统中,我们通常根据组件所提供的服务类型对其进行归类。这种分类可以促使我们将其他设计模式与组件相结合。例如,我们经常将组件模式与分层架构模式结合起来,使用组件来构建分层架构中的各个层次。

4.8.7 Related Patterns

组件可以与任何其他结构架构模式结合使用。组件化的优势显而易见,以至于本章所有其他模式都存在与组件结合运用的例子。例如,组件化架构模式和分层模式的混合使用非常常见。

  • 组件可以与任何其他结构架构模式结合使用。
  • 组件化架构与其他模式结合能发挥各自优势,带来更好的效果。
  • 组件化架构和分层模式的混合使用非常常见。

4.8.8 Sample Model

需求文档

系统名称:Control System.exe

版本:1.0

日期:2024-01-28

需求说明

1. 系统概述

Control System.exe 是一个组件化应用程序,用于控制传感器数据。该系统由三个子系统组成:显示子系统、数据采集子系统和数据管理子系统。

2. 显示子系统

显示子系统用于显示传感器数据。该子系统包含两个与讨论相关的显示对象:波形对象和直方图对象。

波形对象用于显示波形数据。直方图对象用于显示直方图数据。

3. 数据采集子系统

数据采集子系统用于从传感器硬件采集数据。该子系统包含一个驱动程序组件,用于与传感器硬件进行通信。

4. 数据管理子系统

数据管理子系统用于存储采集到的传感器数据。该子系统包含一个数据库组件,用于存储数据。

5. 组件框架

组件框架用于管理系统中的组件。该框架包含一个组件加载器和一个组件存储库。

组件加载器用于加载组件。组件存储库用于存储组件。

6. 需求

显示子系统

  • 能够显示波形数据。
  • 能够显示直方图数据。

数据采集子系统

  • 能够从传感器硬件采集数据。
  • 能够将采集到的数据存储到数据管理子系统中。

数据管理子系统

  • 能够存储采集到的传感器数据。
  • 能够为显示子系统提供数据。

组件框架

  • 能够加载组件。
  • 能够存储组件。

7. 非功能需求

  • 性能:系统应具有良好的性能,能够实时显示传感器数据。
  • 可靠性:系统应具有良好的可靠性,能够在恶劣的环境下正常运行。
  • 安全性:系统应具有良好的安全性,防止数据泄露。

8. 后续需求

  • 添加新的显示对象,例如曲线对象和图表对象。
  • 添加新的数据采集功能,例如支持多种传感器类型。
  • 添加新的数据管理功能,例如支持数据分析和报表生成。

需求文档

系统名称:Control System.exe

版本:1.0

日期:2024-01-28

需求说明

1. 系统概述

Control System.exe 是一个组件化应用程序,用于控制传感器数据。该系统由三个子系统组成:显示子系统、数据采集子系统和数据管理子系统。

2. 显示子系统

显示子系统用于显示传感器数据。该子系统包含两个与讨论相关的显示对象:波形对象和直方图对象。

波形对象用于显示波形数据。直方图对象用于显示直方图数据。

3. 数据采集子系统

数据采集子系统用于从传感器硬件采集数据。该子系统包含一个驱动程序组件,用于与传感器硬件进行通信。

4. 数据管理子系统

数据管理子系统用于存储采集到的传感器数据。该子系统包含一个数据库组件,用于存储数据。

5. 组件框架

组件框架用于管理系统中的组件。该框架包含一个组件加载器和一个组件存储库。

组件加载器用于加载组件。组件存储库用于存储组件。

6. 需求

显示子系统

  • 能够显示波形数据。
  • 能够显示直方图数据。

数据采集子系统

  • 能够从传感器硬件采集数据。
  • 能够将采集到的数据存储到数据管理子系统中。

数据管理子系统

  • 能够存储采集到的传感器数据。
  • 能够为显示子系统提供数据。

组件框架

  • 能够加载组件。
  • 能够存储组件。

7. 非功能需求

  • 性能:系统应具有良好的性能,能够实时显示传感器数据。
  • 可靠性:系统应具有良好的可靠性,能够在恶劣的环境下正常运行。
  • 安全性:系统应具有良好的安全性,防止数据泄露。

8. 后续需求

  • 添加新的显示对象,例如曲线对象和图表对象。
  • 添加新的数据采集功能,例如支持多种传感器类型。
  • 添加新的数据管理功能,例如支持数据分析和报表生成。

4.8 嵌入式系统:基于组件的开发_第2张图片

图 4-21 展示了一个名为 Control System.exe 的组件化应用程序示例。该系统由三个子系统组成:

显示子系统

  • 包含两个显示对象:波形对象和直方图对象。
  • 使用矢量图形组件来绘制数据。
  • 该组件可以是动态加载的。

波形子系统

  • 需要数据库组件来存储数据。
  • 如果数据库组件不在组件存储库中,组件加载器会加载该组件并通知波形子系统其位置。
  • 还需要矢量图形组件来绘制数据。
  • 如果矢量图形组件不在组件存储库中,组件加载器会加载该组件并通知波形子系统其位置。

直方图子系统 

  • 也需要使用数据库组件和矢量图形组件。因为这些组件已经加载,组件框架只需通知直方图子系统它们的位置即可。

矢量图形组件 

  • 需要数学库组件来进行坐标变换。
  • 如果数学库组件不在组件存储库中,组件加载器会加载该组件并通知矢量图形组件其位置。

数据采集子系统

  • 有一个驱动程序组件,用于与传感器硬件进行通信。
  •  驱动程序组件依赖于传感器配置表,该表可能存储在嵌入式应用程序的 ROM 中。

数据管理子系统

  • 为采集到的传感器数据提供标准数据库管理。
  • 数据采集子系统会将数据存储到数据管理子系统中,而视图对象则会从数据管理子系统中检索数据。

组件框架

  • 包含组件加载器和组件存储库。
  • 当 Control System.exe 应用程序启动时,它会自动加载组件框架,然后命令子系统进行初始化。

你可能感兴趣的:(设计模式)