集成和重用正在将重点从最小占用转移到可重用性和灵活性。
每个优秀的硬件或软件设计都始于整个设计周期的结构化方法,但随着芯片架构和应用程序开始专注于特定领域,并包括某些版本的AI,这种结构变得越来越难以定义。嵌入式软件在过去是为非常狭窄的功能编写的,占用空间很小,现在越来越多地融入到整个系统设计中,并在任何可能的地方重用。
嵌入式软件通常包括实时操作系统、驱动程序和固件,其中大多数都是定制开发的,一次加载到设计中,很少再使用。但随着越来越多的芯片被用于更长的时间,以及用于安全和关键任务应用,嵌入式软件可能需要更新。因此,嵌入式软件不再是单一的体系结构,而是变得越来越灵活,适应性越来越强,在某些情况下,效率更低,速度更慢。现在的挑战是弄清楚需要优化什么,以及如何最好地实现这一目标。
“问题变成了,‘系统在做什么?’如果你需要开发软件,但可能是隐藏的,硬件和软件一起实现所需的功能,”Tensilica IP at的技术和战略营销集团总监皮埃尔-泽维尔·托马斯(Pierre-Xavier Thomas)说节奏.“在今天的许多嵌入式系统中,当系统中有一个微控制器时,就必须优化嵌入式软件。软件的作用是协调输入、输出,也许还有一些处理,让系统完成它应该做的事情,这通常是从环境中收集信息,做一些事情,然后提供一些新信息来激活一些事情。在工业领域,甚至在智能家居中都不是这样的,在智能家居中,你感知,你做一些事情,你查看感知数据,然后激活一些东西。我们面临的挑战是优化、低成本和良好的功能。在这里,软件变得非常特定,而且非常特定于接口,在某种程度上也特定于体系结构本身。当你控制输入或输出时,有寄存器可以控制、通信等,所以软件可以非常具体,软件人员和固件开发人员与硬件非常接近。”
但随着设计变得越来越个性化,芯片制造商试图在设计中增加一些灵活性,使一切都不是昂贵的一次性设计,同时构建硬件和灵活的软件变得更加困难。
“看看20年前的嵌入式软件领域,嵌入式设备往往没有连接,没有管理,在专门建造的设备中,”Scot Morrison说西门子嵌入式解决方案.“工程团队试图优化特定功能。可能会有一些可重用性的概念,这样他们就可以为同一家公司的类似设备编写代码。开源在当时并不是一个真正的选择。这意味着嵌入式软件开发从非常手工的、甚至是雕刻的、以性能为中心的、以优化足迹为中心的软件开始。”
图1:嵌入式软件正变得越来越可重用,但挑战在于优化。图片来源:西门子嵌入式解决方案
这些类型的应用程序仍然存在。像起搏器这样的医疗设备只有一项工作要做,而且它们使用尽可能小的占地面积和尽可能少的能量来实现这一目标,因为电池很难更换。但是现在许多其他设备也使用了嵌入式软件,而且这些软件需要在任何使用它的系统的上下文中工作。
那么,当今的嵌入式软件究竟是什么呢?嵌入式软件行业的最佳定义可能是,开发者共同设计硬件和软件以优化解决方案,同时考虑到每一方的资源平衡,"的首席执行官Simon Davidmann说治之软件.“硬件抽象层是一种有用的方法,可以让每一方都对整体操作有一些了解,而不会被不必要的细节所淹没。硬件是基于半导体材料和晶体管的物理特性,但对于大多数数字设计来说,RTL抽象的门级视图是最有用的。软件基于处理器的指令集体系结构(ISA),并使用汇编级微体系结构来实现必要的功能,但软件是使用硬件抽象层和高级语言(如C)的抽象以及由RTOS或OS管理的操作基础设施开发的。”
简单地说,嵌入式软件和硬件之间的联系已经变得更加复杂和微妙。“传统上,当我们考虑软件开发时,总是先考虑硬件,”微软产品营销高级总监约翰内斯•斯塔尔(Johannes Stahl)表示Synopsys对此.“有一个指令集,有一个构建在指令集上的CPU,有一个硬件架构,然后本质上,它将首先构思,然后创建指令集。软件必须移植和开发,这实际上是一件痛苦的事情,但它发生在极少数指令集生态系统中。”
随着时间的推移,软件通常已经发展到驱动更多关于硬件的决策,而嵌入式软件已经成为整个系统软件体系结构中不可分割的一部分。但随着AI/ML现在几乎被添加到所有东西中,它也变得更加模糊。在这个世界中,指令集没有定义,但是软件和算法有定义。“在那里,系统架构师说,‘我有一些软件,现在为我构建最好的架构来执行它,”斯塔尔说。“顺便说一下,用最低的能量。’现在确实是软件优先,这是一个有趣的变化,因为工程团队会考虑他们需要执行的软件堆栈,客户对这个软件堆栈的关心,以及最适合它的架构。”
里程可能有所不同
在汽车这样的市场中,有很多非常复杂的ecu,嵌入式软件更难分离出来。
西门子的Morrison说:“我雇佣的一个人刚参加完一个项目,在这个项目中,他想到了一个增加功能的想法。“这位工程师必须向德国汽车公司展示要添加到代码中的字节数。他想增加的字节还不到10个字节,但这引起了编写程序的人的巨大争论。在汽车领域,他们现在使用了大量的32位处理器,内存比以前便宜得多,他们更关注的是如何快速设计汽车,因为代码优化和定制得越多,所需的时间就越长。如果你可以添加一些功能强大的东西,但你不需要优化它,也许你从过去的程序中重用它,所以它带来了一些额外的代码,而不是高度优化。但它可以完成工作,即使它会消耗你更多的内存或性能。重点已经转向了可重用性、降低成本和缩短上市时间。”
部分原因是,越来越多的系统持续时间更长,而且它们正在以较小的批量开发。因此,与移动电话不同的是,一个芯片的销量可能达到数亿个,对特定领域应用的关注大大降低了这些销量。芯片制造商已经通过增加设计的灵活性进行了调整,但也通过扩大向客户销售的产品——这是通过直接向原始设备制造商(oem)销售解决方案而不是向一级或二级公司销售解决方案而实现的。
该公司执行副总裁Sailesh Chittipeddi表示:“我们在赢得组合和系统解决方案上投入了大量时间瑞萨.“这可以像特定系统的原理图布局一样简单,将微控制器/微处理器定时设备组合在一块板上用于特定应用。一个很好的例子就是房间的加湿器,一个简单的布局就能把它全部搞定。另一方面,这将是一个系统解决方案,例如,你将定义一个完整的机械臂,将所有设备放在一起,交付软件包,以及它如何与其他东西连接。这是我们以前从未做过的事情。在过去,我们会出售一些应用所需的WiFi芯片。现在,我们带着所有的东西进去。”
嵌入式软件在这类设备中起着关键作用。“总的来说,软件架构是一个非常重要的话题,尤其是在嵌入式软件中,因为它有一个主要的角色,并且非常依赖于硬件,”Haris Turkmanovic说Vtool他同时也是贝尔格莱德大学电气工程学院电子系的助教。同时,好的嵌入式软件不依赖于硬件。为什么?因为如果你创建了一个非常好的软件架构,那么软件就不会依赖于硬件。”
对于Turkmanovic来说,一个好的软件架构必须由多个层组成,包括驱动层、中间件层、服务层和应用层。“一般来说,所有软件都必须有一些层次。在嵌入式软件中,它甚至更重要,因为它经常发生硬件更改的情况。如果您设计的软件编写得很好,那么更改就很小。但是如果你没有一个计划和一个好的软件设计,你就会有大问题。另一方面,如果这是一个大项目。在这里,设计好软件是至关重要的,因为很多人都会使用它。版本控制系统也使得管理软件开发更加容易,合并关键分支时的冲突数量将大大降低。”
他说,第三个方面是软件部门的建立。“假设划分是垂直和水平的。水平层是上面提到的层,垂直部分设置为服务,它是几个层的复合。如果您创建这样的软件,那么在最后的开发步骤中维护和测试该软件就容易得多,因为它是有组织的和有文档的。无论我们选择什么作为软件的基础,都必须在多个层次上进行设计。但是这些层的复杂性取决于主程序流。它是纯金属还是基于RTOS的软件?”
艰难的权衡
鲁伯特·贝恩斯,首席营销官Codasip他认为很多硬件工程师都没有意识到软件的重要性。“在你正在设计的SoC的购买决策中,软件副总裁可能对你使用哪个IP核或供应商有最终决定权。如果她说,‘不,我们不使用那个,因为没有可用的工具,你没有使用那个核心。硬件工程师会说,‘但它的核心真的很可爱。它是可爱的。“没关系。软件副总裁有更多的工程师,也有更多的痛苦,需要iar、lauterbach、Seggers、llvm和Clangs才能真正成熟。软件蚕食硬件,即使作为一家主要靠硬件授权赚钱的公司,归根结底,一切都是软件,软件才是最重要的。”
这使得权衡尤为棘手。软件可以以一种非常特定于硬件的方式编写,以便对特定应用程序进行优化。但它也可以被写成在更多的领域适用。
贝恩斯说:“就像工程领域的所有事情一样,这是一种权衡。“工程的全部意义在于你试图优化什么。您正在权衡开发效率和性能。对于目前大量的应用程序和程序,您正在尝试做的事情已经被很好地理解,很好地标准化,并且您正在使用标准库和标准软件语言来利用已经存在的东西。50年前,你可能已经编写了自己的语言。现在,你可以用C或c++或Python或Java或其他标准语言编写。现在用原始汇编编写几乎是不可想象的,因为现在的编译器和工具链都很好。那你为什么要费心呢?你将使用现有的库和驱动程序。对于很多应用程序来说,这可能已经足够了,这将使你的工作非常出色。”
然而,这并不意味着硬件不那么重要。Cadence公司的托马斯说:“它需要坚固、低成本、节能等等。”“但现在,由于各种原因,当你做一些具体的事情时,你可能没有能力销售它,所以人们希望制作一些更灵活的系统,能够做更多的事情。为此,你需要知道你的目标是谁,以便销售更多。可能是你的系统变成了一个更大的系统,软件中的区别是很重要的。这一点——再加上人工智能和机器学习所需要的智能传感器检测能力,以及在安全、隐私等方面进行操作的能力——要求嵌入式系统具有越来越大的灵活性。要研究这种类型的系统,你首先需要了解如何对其进行编程,以及如何实现差异化。”
例如,考虑一个拥有多个传感设备的智能家居——智能扬声器、摄像头和其他安全和安全传感器。它们可以用来感知特定的东西,然后做出决定。
托马斯说:“这可以应用于一种设备,可以针对不同的产品进行重新定位,但芯片本身可能是相同的。”“在这种情况下,你将被要求为那些想要为智能设备开发应用程序的人开放你的软件,以做一些不同于智能门铃的事情。然后你开始有一个嵌入式系统,它在设计的方式上更加灵活,因此它可以针对不同的产品。在那里,您希望软件开始更容易接收高端应用程序,并拥有可以编程和重用的应用程序,以便面向高端软件开发人员。这可能是在底层之上的另一层,负责处理所有硬件。”
没那么简单
Vtool的Turkmanovic说,当今嵌入式软件开发的一个问题是没有统一的方法。“这是非常有问题的。一般来说,人们试图遵循一些方法,但没有一个标准的方法来做这些事情。特别是当它不是一些时间关键或安全关键的软件时,项目团队没有任何规则。这对于维护、升级和改进都是很有问题的。当你得到一堆代码,却无法将其可视化时,就很难理解它是如何工作的。这对于开发软件的工程师来说是很重要的,这些软件对安全要求不高,或者在Linux领域。如果是介于两者之间,就没有什么规则可言,所以归根结底还是要满足功能需求。这就是问题所在。”
他说,对嵌入式软件有一个系统的方法要好得多。“从项目的开始到结束,你必须花很多时间来组织它。首先需要考虑有问题的关键路径。事情是实时的还是非实时的?你有多少个中断程序?你将如何组织他们?你将如何优先考虑它们?在开始阶段,我们有很多问题需要考虑。很多问题都是由项目的需求决定的。它们中的大多数都受到我们使用的平台的限制,因为我们不能在每个平台上使用RTOS,只能针对某些特定的平台。 If some requirements are very strict time-wise, then you don’t have too much choice. You must follow one direction. If you have limited resources, you also need to better organize your code. What is needed is a unified framework for embedded software.”
在汽车行业,这被称为“面向服务的架构”,西门子的Morrison说。“在汽车领域,多年来出现在全软件领域的某些架构被越来越多地采用,但在过去10到20年出现在嵌入式领域的是分层架构的概念。最近在汽车领域,这已经演变成面向服务的体系结构。在成熟的软件开发程序中正确应用分层的整个概念是,您仍然会得到一些软件,这些软件将非常依赖于硬件,但应该有一个定义非常清晰的API,甚至可能是一个行业标准API。例如,使用AUTOSAR,您可以获得MCAL(微控制器抽象层),这通常与半导体公司的芯片或SoC一起提供。这是因为AUTOSAR标准组织在定义这方面做得很好,这样你就可以把不同的AUTOSAR实现放在那里,它们通常都是工作的。这意味着您基本上将所有不可重用的或特定于芯片的软件捆绑在最低级别,并在其之上构建。你把AUTOSAR放在上面,它大部分时间都在运行。当然,你必须验证它。然后,在AUTOSAR之上,有一些定义非常清晰的api。 This means you can take applications and re-use them from past programs, or move them onto different ECUs. You can reconfigure the software in the vehicle, and with AUTOSAR Adaptive, it takes it to the next level as more of a service-oriented architecture, where it can basically find the information that it needs. That leads to more updateability.”
结论
随着嵌入式软件和传统软件之间界限的模糊,开发职责也在发生变化。
“传统上,嵌入式开发是OEM或硬件开发商的来源,即硬件生产商,”at的物联网和嵌入式副总裁Mohamed Awad说手臂.“从历史上看,软件团队和硬件团队会紧密结合在一起,可能在一天结束时向同一个经理报告,一起工作来构建一个产品。这条界限现在开始变得模糊,我们看到很多云服务提供商或软件服务提供商——无论是ML还是其他用例——都希望访问端点上的所有计算,并在向不同数量的硬件设备交付软件方面带来很多价值,而这些硬件设备他们不一定能控制。”
阿瓦德说,为了让这些软件供应商能够提供这种价值,并在所有硬件之上进行创新,必须有一定程度的一致性,这样他们才能实现规模,并证明这些投资是合理的。“对他们来说,为设备开发定制硬件是没有意义的,这些设备可能只会出货1,000或10,000台,即使它们的销量达到数百万甚至数十亿台。精简的流程在这里至关重要。这就好比每个手机制造商都必须为自己的手机开发每个应用程序,而他们无法进入现有的应用程序生态系统。最重要的是,这些手机供应商只出货了他们出货设备数量的一小部分。你可以想象这些生态系统有多小,它们也不会那么丰富。”
这就解释了为什么半导体生态系统中的许多参与者都在围绕一个通用框架进行联合,以便软件开发人员可以轻松地从一个设备移植到另一个设备,将软件从一个设备转移到另一个设备,并使设备易于测试,最终为软件生态系统创造规模经济。
相关的
嵌入式软件:有时更简单,但通常更复杂
依赖关系和分区可以把一段简单的代码变成一个复杂的系统挑战。
软件更新的隐藏影响
无线代码更改会以意想不到的方式给系统带来压力。
软件定义的汽车
这种方法将简化开发和升级,但也增加了设计的复杂性。
留下回复