随着汽车电子系统日益复杂,微控制器变得越来越强大,通常集成多个内核。这就需要在软件架构层面考虑如何在多个内核之间分配基本软件(BSW)。AUTOSAR 作为汽车电子软件的重要标准,也需要支持 BSW 在多核环境下的分配。本文主要讨论在 AUTOSAR 系统中如何将 BSW 模块分配到不同的分区(Partition)和内核。主要解决了以下问题:相比单核系统,多核 BSW 分配需要解决的主要问题是:AUTOSAR 提供了一系列机制来解决这些问题,支持高效、安全的 BSW 多核分配。
AUTOSAR 支持将 BSW 功能相关的模块分配到不同的分区,这既可以提升性能,也可以增强安全性。每种功能集群包含一组相关的 BSW 模块,可以包含通信、存储、IO、看门狗等等。同一类型的功能集群可以存在于多个分区中。
为支持分区分配,BSW 模块实体分为主模块和从模块,可以分配到不同分区中,主模块与从模块通过非标准化的 AUTOSAR 接口进行跨分区通信。将 BSW 功能集群的子集分配到多个分区,提高并发性
通过将 BSW 模块分配到多个分区和内核,可以提升系统性能,减少资源占用。主要的性能优化场景包括:
将通信相关的模块集群分配到一个内核,将 I/O 相关的模块集群分配到另一个内核。如果硬件资源只能被一个内核访问,则将对应的 BSW 用户、服务和驱动都部署在该内核上可以提高性能。实现多个通信集群之间的信号网关功能,需要在不同内核上同步不同的通信模块。
AUTOSAR 定义了一些新概念,并扩展了部分模块,来支持多核BSW分配:
BSW 功能集群:一组功能相关的 BSW 模块,包含通信、存储、IO、看门狗等模块组。分区间通信:使用调度器(SchM)提供的函数实现跨分区调用。服务执行定位:通过事件到任务的映射来确定服务执行的分区。主从模块:将模块拆分为主模块和从模块,分配到不同分区并通过非标准化接口通信,如下图所示:
要点是,模块之间的接口保持不变,分区分配引起的变化主要内藏在模块内部。
为支持多核并行执行,BSW 模块需要实现以下机制:基于核 ID 进行执行代码,实现定制的核相关行为。在无内存保护的系统中,允许直接跨分区调用,但需要用互斥区保护共享数据。
为每个 BSW 分区配置一个 OsApplication。
当 BSW 模块分配到不同分区后,最重要的问题是如何处理跨分区调用。主要的处理手段包括:
使用激活 Task 或设置 Event 的方式,转至被调用分区执行实际调用。调用方使用 CallTrustedFunction 进入被调用分区。参数在分区间传递需要使用复制或特殊硬件机制来保证无干扰。
在启动阶段,内存保护是未启用的,此时需要注意避免重要数据被覆盖。
可以配置分区延迟上报的时间,避免过早引发系统重启。
AUTOSAR 定义了 5 种多核支持类型,用于指明 MCAL 模块的多核处理方式:
Type I:MCAL 模块仅在单核上可用,不可全局使用,如 FLS、FEE 模块Type II:MCAL 模块可按核执行,作用于独立的硬件元素,如 CAN、FlexRay等Type III:可作用于全局可用的硬件元素,如 Dio DriverType IV:可在任何核上使用模块的接口,但仅通过一个核来访问映射元素,如 ADC、PWM、ICU 和 OCUType V:可在任何核上使用模块的接口,通过相应的核单独访问可映射元素不同类型采用不同的资源分离策略,例如硬件级分离或软件级互斥保护。各类 MCAL 模块可以分配为上述 5 种类型中的一种,以指明其多核支持方式。配合多核类型,开发者需要定义可映射的硬件元素,以及元素到内核的映射关系,作为多核支持的基础。
通信栈(Com-Stack)可以分配到不同的分区中,以提高负载分配效率。分配方式包括:根据网络类型,将 I-PDU 分配到不同的 MainFunction 中。状态、模式和网络管理由 ComM和Nm 集中处理。
加密服务栈(Crypto-Stack)也可以分配到不同分区中,每个分区部署一个 MainFunction。Csm 模块与 SecOC 模块需要分配到同一分区,避免分区切换开销。
AUTOSAR 支持通过分区隔离来构建安全关键系统。最高 ASIL 级别的 BSW 模块被放入专用分区,低 ASIL 级别的模块放入公共分区,从而最小化软件开发的代码量。
分区调用需要检查是否符合 Safety 要求。可以使用 Stub 函数封装被调用的功能,处理分区切换问题。
QM 调用 ASIL:使用 Stub 函数进入 ASIL 分区,如下图所示。
ASIL 调用 QM:使用包装函数进入QM 分区,如下图所示。
ASIL 调用 ASIL:类似地需要 Stub 函数或包装函数。
分区调用可能产生新的错误场景,需要检测内存溢出、超时等问题。
可以配置分区的 Timing 保护,避免过早重启。
分区隔离会增加调用开销。可以通过减少分区数量、优化模块映射和 calls 来获得最佳平衡。

调用其他模块接口前需获取分区 ID,根据 ID 区分主从代码
每个 BSW 分区需配置一个 OS 应用程序
调用方使用 CallTrustedFunction 进入被调方分区
本系列图文已上架至 "搞一下汽车电子"图文板块,建议结合中文标准一起观看,中文标准观看方式:电脑:Edge/Safari 浏览器输入:gyxqcdz.com (搞一下汽车电子首拼),资料板块直接搜。
手机:各大应用商店下载 "搞一下汽车电子"APP,资料板块直接搜。
