本文主要讨论在 AUTOSAR 系统中如何将 BSW 模块分配到不同的分区(Partition)和内核。主要解决了以下问题:
- 如何修改 BSW 模块以支持多核并行执行
- 如何配置将 BSW 模块分配到不同分区
- MCAL(微控制器抽象层)模块的多核支持方式
- 通信栈(Com-Stack)的分配方案
- 加密服务(Crypto-Stack)的分配方案
- 在安全关键系统中进行 BSW 分配的方式
相比单核系统,多核 BSW 分配需要解决的主要问题是:
- 并行执行带来的数据一致性问题
- 跨分区调用的内存访问权限问题
- 如何分配核心的硬件资源访问权
- 启动/关闭时对安全性的影响
- 由分区引入的新的错误场景
AUTOSAR 提供了一系列机制来解决这些问题,支持高效、安全的 BSW 多核分配。
BSW 在多核系统中的分配
支持的分配场景
AUTOSAR 支持将 BSW 功能相关的模块分配到不同的分区,这既可以提升性能,也可以增强安全性。每种功能集群包含一组相关的 BSW 模块,可以包含通信、存储、IO、看门狗等等。同一类型的功能集群可以存在于多个分区中。
为支持分区分配,BSW 模块实体分为主模块和从模块,可以分配到不同分区中,主模块与从模块通过非标准化的 AUTOSAR 接口进行跨分区通信。
AUTOSAR 支持下列分配场景:
将 BSW 功能集群分配到一个分区,提高性能
将 BSW 功能集群的子集分配到多个分区,提高并发性
可以将主从模块实体分配到多个分区
性能优化场景
通过将 BSW 模块分配到多个分区和内核,可以提升系统性能,减少资源占用。主要的性能优化场景包括:
将通信相关的模块集群分配到一个内核,将 I/O 相关的模块集群分配到另一个内核。
如果硬件资源只能被一个内核访问,则将对应的 BSW 用户、服务和驱动都部署在该内核上可以提高性能。
实现多个通信集群之间的信号网关功能,需要在不同内核上同步不同的通信模块。
技术实现概览
AUTOSAR 定义了一些新概念,并扩展了部分模块,来支持多核BSW分配:
BSW 功能集群:一组功能相关的 BSW 模块,包含通信、存储、IO、看门狗等模块组。
分区间通信:使用调度器(SchM)提供的函数实现跨分区调用。
服务执行定位:通过事件到任务的映射来确定服务执行的分区。
主从模块:将模块拆分为主模块和从模块,分配到不同分区并通过非标准化接口通信,如下图所示:
要点是,模块之间的接口保持不变,分区分配引起的变化主要内藏在模块内部。
BSW 模块的并行执行
为支持多核并行执行,BSW 模块需要实现以下机制:
基于核 ID 进行执行代码,实现定制的核相关行为。
使用主从模块设计模式,主模块负责协调从模块。
使用 SchM 提供的跨分区函数实现模块间通信。
在无内存保护的系统中,允许直接跨分区调用,但需要用互斥区保护共享数据。
每个分区使用本地的驱动访问硬件资源
BSW 分区配置
为管理分区中的 BSW 模块,需要进行如下配置:
为每个 BSW 分区配置一个 OsApplication。
在 EcuC 中配置分区以及模块到分区的映射。
为每个 BSW 分区单独配置 BswM。
每个内核一个 EcuM 实例。
跨分区调用处理
当 BSW 模块分配到不同分区后,最重要的问题是如何处理跨分区调用。主要的处理手段包括:
使用激活 Task 或设置 Event 的方式,转至被调用分区执行实际调用。
调用方使用 CallTrustedFunction 进入被调用分区。
若被调用函数不访问本地数据,则可直接调用。
参数在分区间传递需要使用复制或特殊硬件机制来保证无干扰。
启动、关闭和睡眠/唤醒处理
在启动阶段,内存保护是未启用的,此时需要注意避免重要数据被覆盖。
在关闭阶段,内存保护已经启用,可以检测问题。
睡眠和唤醒处理也需要考虑安全需求。
错误处理
引入分区后,一些新的错误场景需要检测和处理:
分区内代码引发的内存错误。
分区内代码执行超时引起的定时错误。
尝试访问没有权限的硬件资源。
可以配置分区延迟上报的时间,避免过早引发系统重启。
MCAL及协议栈分配
MCAL 模块的多核支持
AUTOSAR 定义了 5 种多核支持类型,用于指明 MCAL 模块的多核处理方式:
Type I:MCAL 模块仅在单核上可用,不可全局使用,如 FLS、FEE 模块
Type II:MCAL 模块可按核执行,作用于独立的硬件元素,如 CAN、FlexRay等
Type III:可作用于全局可用的硬件元素,如 Dio Driver
Type IV:可在任何核上使用模块的接口,但仅通过一个核来访问映射元素,如 ADC、PWM、ICU 和 OCU
Type V:可在任何核上使用模块的接口,通过相应的核单独访问可映射元素
不同类型采用不同的资源分离策略,例如硬件级分离或软件级互斥保护。
各类 MCAL 模块可以分配为上述 5 种类型中的一种,以指明其多核支持方式。配合多核类型,开发者需要定义可映射的硬件元素,以及元素到内核的映射关系,作为多核支持的基础。
通信协议栈分配
通信栈(Com-Stack)可以分配到不同的分区中,以提高负载分配效率。分配方式包括:
根据网络类型,将 I-PDU 分配到不同的 MainFunction 中。
PduR 负责处理不同网络之间的分区通信。
状态、模式和网络管理由 ComM和Nm 集中处理。
加密服务分配
加密服务栈(Crypto-Stack)也可以分配到不同分区中,每个分区部署一个 MainFunction。Csm 模块与 SecOC 模块需要分配到同一分区,避免分区切换开销。
为处理新鲜度值,可以采用如下手段:
保留一个跨分区的新鲜度管理 SWC
每个分区一个新鲜度 SWC
使用 SecOC 的可配置 C 语言 API
安全关键系统中的 BSW 分配
概述
AUTOSAR 支持通过分区隔离来构建安全关键系统。最高 ASIL 级别的 BSW 模块被放入专用分区,低 ASIL 级别的模块放入公共分区,从而最小化软件开发的代码量。
AUTOSAR 安全分配的主要机制包括:
使用多个分区,进行空间隔离。
对执行实体进行监控,防止阻塞或顺序错误。
端到端保护,避免通信数据被修改。
特定模块提供额外的安全机制。
跨分区调用
分区调用需要检查是否符合 Safety 要求。可以使用 Stub 函数封装被调用的功能,处理分区切换问题。
具体来说,分区调用可以有如下情况:
QM 调用 ASIL:使用 Stub 函数进入 ASIL 分区,如下图所示。
ASIL 调用 QM:使用包装函数进入QM 分区,如下图所示。
ASIL 调用 ASIL:类似地需要 Stub 函数或包装函数。
参数传递需要使用复制或特殊硬件机制来保证安全。
启动/关闭和睡眠/唤醒
启动阶段需要注意数据隔离。
关闭时可以检测隔离问题。
睡眠/唤醒处理也需要考虑安全需求。
错误处理
分区调用可能产生新的错误场景,需要检测内存溢出、超时等问题。
可以配置分区的 Timing 保护,避免过早重启。
性能考量
分区隔离会增加调用开销。可以通过减少分区数量、优化模块映射和 calls 来获得最佳平衡。
未来的 AUTOSAR 版本
未来 AUTOSAR 可能进行如下改进:
标准化 BSW 功能集群及其接口,如下图所示。
支持更高效的分区间调用
支持用例分区提升安全性
等等
注意事项
BSW模块设计
对共享数据的访问需要加互斥保护
调用其他模块接口前需获取分区 ID,根据 ID 区分主从代码
主模块负责协调从模块,可监控和过滤请求
主从模块间使用非标准化接口通信
多核场景下接口需要支持异步调用
BSW配置
每个 BSW 分区需配置一个 OS 应用程序
需要配置 BSW 模块到分区的映射
需要配置每个分区的 BswM 实例
需要配置核心的 EcuM 实例
需要配置分区的 BSW 启动/关闭顺序
跨分区调用
使用激活任务或事件切换调用上下文
调用方使用 CallTrustedFunction 进入被调方分区
检查直接调用是否安全
小心处理参数传递的内存访问权限
安全系统相关
启动阶段内存保护尚未启动,需谨慎操作
最小化启动前执行的代码量
安全相关机制只在必要分区上实现
检查分区调用是否被符合 Safety 要求
准确配置调用的 Stub 函数或包装函数
谨慎处理睡眠唤醒的安全需求
检测由分区引入的新错误场景
平衡分区数量和性能
-
微控制器
+关注
关注
48文章
7487浏览量
151024 -
看门狗
+关注
关注
10文章
559浏览量
70733 -
AUTOSAR
+关注
关注
10文章
350浏览量
21466 -
BSW
+关注
关注
0文章
15浏览量
3502 -
调度器
+关注
关注
0文章
98浏览量
5237
发布评论请先 登录
相关推荐
评论