嵌入式软件架构

Posted 车端

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式软件架构相关的知识,希望对你有一定的参考价值。



总目录链接==>> AutoSAR入门和实战系列总目录

总目录链接==>> AutoSAR BSW高阶配置系列总目录

文章目录


嵌入式软件架构设计意图通常伴随着基于个人经验的假设。软件开发人员可能会从资源受限的基于微控制器的系统的角度来看待架构设计。系统人员可能会从应用处理器的角度考虑架构。如何设计架构将取决于系统的嵌入式软件分类。

我们可以通过多种不同的方式对嵌入式软件进行分类。我发现有五种简单的嵌入式软件分类可以帮助我调整视角以最好地理解手头的系统。

让我们探索 5 个简单的嵌入式软件分类,您需要了解这些分类才能成功地交流和设计您的系统。

1 嵌入式软件分类 – BAREMETAL

裸机嵌入式系统利用不依赖于操作系统的软件架构。通常,裸机架构将是事件驱动的,严重依赖状态机,和/或使用非常简单的协作任务调度。开发人员需要非常了解底层处理器,因为没有操作系统可以抽象出底层细节。

您通常会在资源受限的设备(例如 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 不同,它是一种专用的、资源受限的操作系统,。设计人员可以像开发桌面或移动应用程序那样完全访问库和操作系统资源。

您通常会在 Raspberry Pi 等 32 位应用程序处理器上找到这种操作系统软件设计。然而,这些处理器非常复杂,需要一个操作系统来管理它们的所有资源。现在,这并不意味着您不能使用裸机或使用 RTOS;它只是意味着复杂性和开发时间急剧增加。

完整的操作系统可以消除开发人员的内存限制负担。此外,您通常可以让非嵌入式软件人员参与进来。对于基于操作系统构建的应用程序,软件开发涉及的专业化知识要少得多。

对于没有严格实时要求、使用现代微处理器、受益于高级抽象以及需要扩展或重用应用程序部分的产品,建议使用完整的操作系统架构和实现。

4 嵌入式软件分类 – 容器/微服务

微服务和容器是云、移动和桌面计算中常见的设计类型。然而,他们正在迅速找到进入嵌入式系统的途径。我将这两者混为一谈,因为它们使用的架构设计策略相似,尽管底层技术不同。

微服务

微服务将应用程序构建为一组松散耦合的服务,可独立部署且易于维护(如果做得好)。微服务将应用程序构建为为业务领域开发的小型自治服务的集合。微服务提供具有特定功能的松散耦合服务。

资源相对受限的嵌入式系统(例如微控制器)可以运行微服务。但是,它们通常至少需要与运行 RTOS 所需的内存量相同的内存量。微服务包括服务本身、入站和出站消息队列以及日志和状态信息。

需要编排器和运行时环境会增加微服务设计的复杂性,必须谨慎使用您使用的资源并仔细监控系统的实时响应。然而,微服务可以提供非常可扩展的系统,易于现场维护和更新。

我建议在需要现场更新、可扩展性和现代敏捷流程并受益于分布式模型的应用程序中使用微服务。

容器

容器是一种可以承载微服务的实现范式。每个容器都是一个独立的沙箱,可以运行一个或多个微服务。容器通常可独立部署且易于维护。一系列容器为更广泛的应用奠定了基础。同样,容器和微服务密切相关;容器为微服务运行提供了额外的隔离层。

至少需要一个现代微控制器来利用容器。每个技术供应商都略有不同,但有些供应商声称能够使用与 RTOS 一样少的内存。然而,我调查过的大多数目标物联网应用程序预计大约有 256 KB 的闪存。

容器是一种现代架构实现,可以为嵌入式应用程序增加灵活性、可扩展性和可移植性。多年来,它们已成功用于软件的其他领域。迄今为止最大的限制是尺寸和性能。

我建议在需要现场更新、可扩展性、额外安全性和现代敏捷流程的应用程序中使用容器。

图 1 – 容器架构堆

5 嵌入式软件分类 – 混合系统

混合系统同时利用多个分类。例如,您可能有一个使用嵌入式 Linux 的应用程序处理器。但是,该处理器可能有一个内置的微控制器,它使用裸机方法来管理实时响应。

混合系统允许开发人员利用多种设计方法从多种系统类型中获益。如果不仔细管理其设计的各个部分之间的交互,这种灵活性通常会增加系统的复杂性。

对于具有复杂处理和实时要求的产品,建议使用混合架构和实现,这些产品使用多核处理器,受益于高级抽象并需要扩展或重用应用程序部分。

6 结论

嵌入式软件系统可以分为多种类型。如何设计和构建嵌入式软件将取决于您选择的分类。每个分类都将规定您用来构建和实施系统的设计模式和工具。当设计或讨论系统时,请先指定系统类型,然后再继续进行设计。

嵌入式开发 | 软件架构的重要性

关注+星标公众,不错过精彩内容

作者 | strongerHuang

来源 | 嵌入式在左c语言在右

在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发、维护

我相信在嵌入式或单片机软件开发的初期大多数开发者采用的都是简单的前后台顺序执行架构(我就是这样的)。在嵌入式软件开发中,程序架构主要分为三种,本篇文章将对这三种程序架构做出详解。

软件架构存在的意义

可以说一个好的程序架构,是一个有经验的工程师和一个初学者的分水岭。软件架构对于开发人员是友好的,你希望先执行什么任务后执行什么任务,或者这一个时间点执行什么任务下一个执行什么任务,又或者什么事件会同步到某个任务等等,在不同的软件架构下,解决上述问题的具体方法都是有所区别的。

软件架构对开发者最大的帮助是:帮助开发者掌控整个工程的框架,当你熟练使用其中某一个程序架构后,对于系统中出现的bug你一定能够快速的定位并解决。当然,我建议要根据需要选择合适的软件架构进行开发,具体原因在文章后面会进行介绍。

介绍三种不同的程序架构

三种常用的软件架构有:

  • 顺序执行的前后台系统

  • 时间片轮询系统

  • 多任务操作系统

为了让大家有一个更为清晰的认识,我分别用三种软件架构对一个实例进行介绍说明。这个实例如下:它有4个任务,这4个任务为按键扫描、声光报警、显示屏刷新和超声波测距。这个实例的具体功能是通过按键设置测量距离的阈值,当测距距离低于设置的阈值时,触发声光报警并且将测量距离实时显示在显示屏上(这个应用是汽车倒车雷达的具体体现)。

1.顺序执行的前后台系统

在顺序执行的前后台系统中,我会把键盘扫描用查询的方式放在while(1)中,而显示屏刷新和超声波测距使用中断,在中断服务函数中获取测量距离后进行显示,在主函数的循环中进行按键的检测,声光处理也放在主循环中。

这样整个程序就以变量标志的同步方式在主循环和后台中断中执行,对应的程序代码如图所示:

顺序执行前后台系统的主函数

顺序执行前后台系统的中断服务函数

这种架构的优点是使用简单易于理解,而缺点是每个任务所占的CPU时间过长的话,会导致程序的实时性能差,就比如按键的检测等。

2.时间片轮询系统和多任务操作系统

时间片轮询法实际上通常出现在操作系统中,也就是说他属于操作系统,但在这里所说的是基于前后台系统的时间片轮询。时间片轮询法的实质其实就是选出一个定时器,没进一次定时中断对计数值进行自加,在主循环中根据这个计数值执行任务,这个计数值也就是任务轮询的时间片。

在这个实例中,如果采用时间片轮询系统的话,首先选用主控芯片的任一定时器,定时器定时时间周期由我们决定,为了保证实时性和运行效率,这个值通常取10ms、30ms、50ms等,我会将按键扫描轮值值设置为20ms,因为按键抖动的时长一般为20ms,这样处理既达到了消抖的目的,又不会漏掉按键的检测;而显示屏的刷新设置为30ms,如果你觉得刷新反应慢了也可以修改这一轮询值得到改善;而超声波测距的轮询值设置为100ms,即每隔100模式触发测距一次,这个测距频率已经能够满足大多数的情况了。

程序代码如下:

时间片轮询系统的主函数

时间片轮询系统的定时器中断函数

可以看出时间片轮询法相比顺序执行还是有很大优势的,既有顺序执行法的优点,也有操作系统的部分优点。

3.多任务操作系统

操作系统的本身是一个比较复杂的东西,任务的管理和调度实现的底层是很复杂和困难的。但是呢,我们一般都是把操作系统本身作为一个工具一个平台,我们的目的是使用它的功能而不是开发一个操作系统。

我使用过ucos和freertos小型的实时操作系统,也使用过Linux大型的操作系统,有了操作系统,不管是对于程序的稳定性和开发的效率都会好很多。我们在使用操作系统的时候更多的需要去学习和理解它的一些调度和通信的方式。实际上真正能使用操作系统的人并不多,反而是跑裸机的占大多数,这也和产品的具体要求有关,很多简单的系统只需要裸机即可满足。

在这里本我不过多的介绍操作系统本身,因为操作系统确实挺复杂的,下面图例中的代码是在freertos中创建按键控制LED亮灭的程序结构,大家可以对比一下:

freertos多任务系统中主函数

freertos多任务操作系统中的任务回调函数

如何选择合适的软件架构

我使用过多种不同MCU做项目开发,例如:STM32、STC15、新唐等,也接触过复杂的设计需求,例如:车载智能系统和智能家居,跑过操作系统ucos、freertos和Linux等等。

在回到裸机开发时,就会不然而然的去思考完整系统的软件架构的设计问题,相信在读者中开发裸机的也占大多数。

我认为没有最好的软件(程序)架构,而只有最合适的软件架构。因为在不同的应用场景中适合采用不同的程序设计,而单纯的去比较哪种程序架构是最好的没有什么实际的意义。

那接下来我们来对具体的应用场景进行分析,在一些逻辑清晰功能单一的系统中就很适合选择顺序执行的前后台架构,这个软件架构往往能够满足我们大部分的需求,比如电饭煲、电磁炉和声控灯泡等;而在一些资源缺乏的单片机并且对系统可靠性要求较高的情况下非常适合,因为这种方法的系统耗费比较小,只是牺牲了一个定时器而已,但是选择此种程序架构需要我们对时间片进行深思熟虑的划分;

最后,在一些功能复杂,逻辑控制较为困难的系统中就适合选择多任务操作系统,比如视频监控系统、无人机等等应用场景。

作为一名嵌入式软件工程师,掌握这三种软件架构是非常有必要的,它们可以让我们在设计程序时拥有更多的选择和思考,而每一种不同的程序架构都具备它自己的优势与不足,这需要我们去用心实践方可体会到它的奥妙。

声明:本文来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

------------ END ------------

关注公众号后台回复『嵌入式开发』『单片机』阅读更多相关文章。

回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。


点击“阅读原文”查看更多分享

以上是关于嵌入式软件架构的主要内容,如果未能解决你的问题,请参考以下文章

软件架构存在的意义

[架构之路-112]-《软考-系统架构设计师》-软件架构设计-5-软件工程与基于架构的软件开发流程ABSD

Java的三种技术架构是什么?

[架构之路-131]-《软考-系统架构设计师》-软件工程-1-软件工程方法大全(软件开发过程方法软件开发过程模型逆向工程净室软件工程)

[架构之路-56]:目标系统 - 平台软件 - 总体架构概述

真棒!这几个嵌入式程序架构太好用了