嵌入式开发:设计嵌入式软件架构的5个步骤—步骤3

更新时间: 2022-12-01 11:02:40来源: 粤嵌教育浏览量:7183

上两篇文章探讨了在嵌入式开发中设计嵌入式软件架构的五个步骤。到目前为止,我们已经看到现代嵌入式系统需要将软件架构分为硬件相关和硬件无关的架构。我们还讨论了在过程早期识别系统数据资产的好处。我们的讨论揭示了一个重要的软件架构原则,数据决定设计。

 

本文探索了设计嵌入式软件架构的第三步分解系统

 

一旦团队初步了解了数据资产以及它们如何在系统中移动,我们就准备好分解软件架构了。分解不是让我们的软件腐烂分解成混!相反,分解是获取我们的数据资产并创建软件架构的构建块的行为,如软件任务、线程和其他组织机制。

 

架构师或团队如何分解通常取决于他们的最终目标和系统的复杂性。可以使用三种分解方法来开发一个软件架构。这些分解技术包括

l 按安全性分解

按域分解

按任务分解

让我们来看看这些如何帮助嵌入式软件架构师。

 

按安全性分解

在嵌入式开发中对于具有需要从安全角度保护的数据资产的系统,首先的分解步骤之一是将体系结构进一步分为安全和非安全的体系结构部分。例如,如果我分解我们已经检查过的电机控制器设备,架构图可能如图4所示。这是因为该图根据数据资产应该位于的安全域来分隔数据资产。(威胁模型和安全分析可以识别这些资产。)

 4

 

通过安全性分离体系结构可以帮助体系结构识别需要特殊处理的数据资产和应用程序组件。例如,这些数据资产可能需要放在硬件隔离的执行环境中。此外,这些数据资产可能需要配置额外的内存保护单元(MPU)来限制访问。最后,甚至可能需要实现信任根服务来管理和访问数据资产。

 

按域分解

按领域分解软件体系结构已经成为一种非常流行的软件体系结构设计方法。在最广泛的意义上,步骤1,分离软件架构,嵌入式开发人员已经将软件架构分解为两个域实时硬件域和应用程序域。按安全性进行分解还确定了另外两个域安全和非安全应用程序域。这些领域中的每一个都可以单独分解和构建。

理论上,体系结构可以进一步分解成额外的领域,允许领域专家专注于该领域的体系结构。例如,图5显示,对图4稍作重新排列后,数据中出现了三个额外的域:

输入域

电机控制领域

输出域

5

 

有趣的是,当以这种方式看待领域时,它们通常跨越应用程序层,包含与领域相关的所有内容。例如,电机控制域管理高级应用程序状态,并通过抽象层与低级硬件交互。甚至可能需要一个应用程序接口,以便域之间进行交互,正如在输入和电机控制域之间可以看到的那样。使用RTOS为各个域创建消息队列以便彼此交互并不罕见。

 

按任务分解

超过50%的嵌入式系统使用实时操作系统(RTOS)。即使嵌入式开发人员在不使用RTOS的系统中,使用协作执行任务的周期性调度程序也是很常见的。任务是源代码和架构思想的逻辑分组,它们相互关联并解决软件问题。或者在我们的例子中,一个任务可能封装了跨多个软件域的数据资产以及数据上的操作和过程。

基于任务分解初始架构可能是有益的。例如,如果我们再看看我们的电机控制设备,我们可以使用区域分解为系统创建三个任务

输入任务

运动控制任务

输出任务

 

根据系统的不同,这可能没问题。然而,如果我们查看每个领域的细节,我感觉每个任务都试图做得太多,随着系统的发展,它可能会有可伸缩性的问题。因此,相反,基于我们已经确定的数据资产,我可能倾向于如图6所示的任务分解。

6

 

所见,该系统中有五项任务:

控制器任务

传感器任务

Rx任务

电机任务

显示任务

这种任务分解将更加灵活,因为每个任务都有一个它所关注的单一职责。例如,如果客户近期需要诊断,嵌入式开发人员可以添加诊断任务。如果添加更多传感器,传感器任务可以管理它们。如果我们需要通过遥测传输设备状态,我们可以添加一个遥测任务和一个传输任务。如果我们设计了一个使用电机的新装置,我们就可以把我们的电机任务重新利用起来!

 

填写细节

一旦我们将我们的系统分解成高级的块和任务,我们就可以分解一些初始的通信架构。例如,在上一节中,我们看到我们的初始架构有五个任务。我们可以在几个区域看到数据,数据流跨越了任务之间的界限

传感器任务到控制器任务

Rx任务到控制器任务

控制器任务到运动任务

要显示任务的控制器任务

边界交叉表明这些任务需要交互以交换数据或以某种方式相互通信。作为分解步骤的一部分,我们可以突出这些交互,并确定传输数据的潜在机制。然而,尽可能推迟做出架构决策通常是一种最佳实践。例如,在此阶段,我们可能会看到传感器任务与控制器任务的交互,并意识到有几种解决方案

使用消息队列将温度数据传输到控制器

使用带有互斥体的共享内存位置来保护数据

 

软件架构设计第3步结论

正如我们在本文中看到的,我们在前面步骤中识别的数据已经开始自然地决定我们如何将系统分解成域和任务。数据在系统中的流动方式突出了任务之间的交互。虽然通常有多种解决方案来处理任务交互,但我们经常将最终决定推迟到设计过程的后期。推迟决策通常允许嵌入式开发人员更容易地改变和发展设计,并且只在必要的时候才做出决定。

免费预约试听课