传达嵌入式软件体系结构设计意图通常伴随着基于嵌入式开发人员经验的假设。你可以从资源受限的基于微控制器的系统的角度来看架构设计。如何设计架构将取决于系统的嵌入式软件分类。有许多不同的方法可以对嵌入式软件进行分类。我发现有五种简单的嵌入式软件分类可以帮助我调整视角,以更好地理解手头的系统。
让我们探索5种简单的嵌入式软件分类,你需要了解这些分类才能成功地进行通信和设计你的系统。
分类1 — 裸机
裸金属嵌入式系统利用不依赖于操作系统的软件架构。通常,裸金属架构将是事件驱动的,严重依赖状态机,和/或使用非常简单的协作任务调度。开发人员需要非常了解底层处理器,因为没有操作系统可以抽象出底层细节。
你通常会在资源受限的设备上找到裸机软件设计,例如8位、16位和一些32位微控制器。但是,资源可用性并不是裸机系统的限制因素。你可以设计一个裸机架构,并在任何嵌入式处理器上实现。但是,处理器越复杂,实现就越复杂。
对于功能有限、使用资源受限的微控制器、具有严格的实时要求且对可扩展性的需求最低的产品,建议嵌入式开发人员使用裸机架构和实现。
分类2 — 实时操作系统(RTOS)
在过去几年中,利用实时操作系统的嵌入式软件架构显著增加。基于RTOS的嵌入式系统通常具有比裸机架构所能管理的更复杂的时序要求。RTOS抽象了一些低级细节,如任务调度,同时也为开发人员提供了任务同步(信号量和标志)、数据保护(互斥锁)和通信(队列)的工具。
你通常可以在32位微控制器和小型应用处理器上找到RTOS软件设计。虽然你可以在16位处理器上找到它们,但RTOS通常需要至少24 KB的闪存和32 KB的RAM才能有效使用。这些要求对RTOS的有效使用设置了较低的限制。
RTOS会增加设计的复杂性,主要是在使用抢占式任务调度时。如果设计者不小心,就有可能导致线程饥饿、优先级反转甚至死锁。然而,与裸机系统相比,RTOS可以为嵌入式开发人员提供快速扩展系统、提高可维护性和收集更复杂的系统性能的能力。
对于具有复杂时序要求、使用现代微控制器、受益于多任务处理以及需要扩展或重用应用程序的产品,建议使用基于RTOS的体系结构和实现。
分类3 — “完整”操作系统
当使用足够复杂的处理器(如应用程序处理器)时,嵌入式软件体系结构可以利用整个操作系统。例如,嵌入式Linux可以被认为是一个完整的操作系统。我没有将RTOS包括在这一类别中,因为RTOS是一种专用的、资源受限的操作系统,与嵌入式Linux不同。设计师可以完全访问库和操作系统资源,这是他们在开发桌面或移动应用程序时所需要的。
你通常会在32位应用程序处理器(如Raspberry Pi)上找到操作系统软件设计。然而,这些处理器非常复杂,需要一个操作系统来管理它们的所有资源。现在,这并不意味着你不能裸奔或使用RTOS;这仅仅意味着复杂性和开发时间大大增加。
完整的操作系统可以减轻嵌入式开发人员的内存限制负担。此外,你通常可以让非嵌入式软件人员参与进来。对于构建在操作系统上的应用程序,软件专业化要少得多。
对于没有严格实时要求、使用现代微处理器、受益于高抽象级别、需要扩展或重用应用程序片段的产品,建议使用完整的操作系统架构和实现。
分类4 — 容器/微服务
微服务和容器是云、移动和桌面计算中常见的设计类型。然而,他们正在迅速找到进入嵌入式系统的途径。我把这两个放在一起,因为我们使用的架构设计策略是相似的,尽管底层技术不同。
微服务公司
微服务将应用程序构造为松散耦合的服务的集合,可以独立部署并且易于维护(如果做得好)。微服务将应用程序构建为为业务领域开发的小型自治服务的集合。微服务提供了一个松散耦合的服务,并考虑了特定的特性。
在嵌入式开发中,相对资源受限的嵌入式系统(如微控制器)可以运行微服务。然而,它们通常需要至少相同数量的内存来运行RTOS。微服务包括服务本身、入站和出站消息队列以及日志和状态信息。
微服务可以通过需要协调器和运行时环境来增加设计的复杂性。这绝不是破坏交易,但你必须小心使用资源,并仔细监控系统的实时响应。然而,微服务可以提供非常可扩展的系统,易于现场维护和更新。
我建议在需要现场更新、可扩展性和现代敏捷流程并受益于分布式模型的应用程序中使用微服务。
容器
容器是一种可以托管微服务的实现范式。每个容器都是一个独立的沙盒,可以运行一个或多个微服务。容器通常可独立部署,易于维护。一系列容器为更广泛的应用奠定了基础。同样,容器和微服务是密切相关的;容器为要运行的微服务提供了额外的隔离和分离层。
至少需要一个现代微控制器来利用容器。每个技术供应商都略有不同,但有些嵌入式开发人员声称能够使用与RTOS一样少的内存。然而,我调查过的大多数目标物联网应用程序预计闪存大约为256 KB。
容器是一种现代体系结构实现,可以为嵌入式应用程序增加灵活性、可扩展性和可移植性。它们已成功地应用于其他软件领域数年。迄今为止,最大的限制是规模和性能。
我建议在需要现场更新、可扩展性、额外安全性和现代敏捷流程的应用程序中使用容器。
分类5 — 混合
混合系统同时利用多种分类。例如,你可能有一个使用嵌入式Linux的应用程序处理器。然而,该处理器可能具有内置微控制器,该微控制器使用裸机方法来管理实时响应。
混合系统允许开发人员利用多种设计方法从多种系统类型中获益。不幸的是,如果嵌入式开发团队不仔细管理其设计的各个部分之间的交互,这种灵活性往往会增加系统复杂性。
对于具有复杂处理和实时需求的产品,建议使用混合体系结构和实现,这些产品使用多核处理器,受益于高级别的抽象,并且需要扩展或重用应用程序。
结论
嵌入式软件系统可分为多种类型。如何设计和构建嵌入式软件将取决于你选择的分类。每个分类都将规定用于构建和实现系统的设计模式和工具。在嵌入式开发人员设计或讨论系统时,请先指定系统类型,然后再继续,会发现这个简单的练习会帮助你找到正确的方向。