AUTOSAR Classic Platform架构解析:BSW、RTE与ASW——分层、配置、代码生成

文章目录

    • 每日一句正能量
    • 一、前言:为什么汽车电子需要AUTOSAR
    • [二、AUTOSAR Classic Platform分层架构](#二、AUTOSAR Classic Platform分层架构)
      • [2.1 应用层(ASW - Application Layer)](#2.1 应用层(ASW - Application Layer))
      • [2.2 运行时环境(RTE - Runtime Environment)](#2.2 运行时环境(RTE - Runtime Environment))
      • [2.3 基础软件层(BSW - Basic Software)](#2.3 基础软件层(BSW - Basic Software))
      • [2.4 微控制器驱动层(MCAL - Microcontroller Driver)](#2.4 微控制器驱动层(MCAL - Microcontroller Driver))
    • 三、BSW基础软件层深度解析
      • [3.1 服务层(Services Layer)](#3.1 服务层(Services Layer))
      • [3.2 ECU抽象层(ECU Abstraction Layer)](#3.2 ECU抽象层(ECU Abstraction Layer))
      • [3.3 微控制器驱动层(Microcontroller Drivers)](#3.3 微控制器驱动层(Microcontroller Drivers))
      • [3.4 复杂驱动(CDD - Complex Device Drivers)](#3.4 复杂驱动(CDD - Complex Device Drivers))
    • 四、RTE运行时环境与VFB通信机制
      • [4.1 虚拟功能总线(VFB)概念](#4.1 虚拟功能总线(VFB)概念)
      • [4.2 RTE通信接口类型](#4.2 RTE通信接口类型)
      • [4.3 RTE事件触发机制](#4.3 RTE事件触发机制)
    • 五、SWC软件组件设计与Runnable映射
      • [5.1 SWC内部结构](#5.1 SWC内部结构)
      • [5.2 Runnable到OS任务的映射](#5.2 Runnable到OS任务的映射)
    • 六、AUTOSAR方法论:从配置到代码
      • [6.1 阶段一:系统配置(System Configuration)](#6.1 阶段一:系统配置(System Configuration))
      • [6.2 阶段二:ECU设计与配置(ECU Design & Configuration)](#6.2 阶段二:ECU设计与配置(ECU Design & Configuration))
      • [6.3 阶段三:代码生成(Code Generation)](#6.3 阶段三:代码生成(Code Generation))
    • 七、代码生成实战:从ARXML到C代码
      • [7.1 工具链生态](#7.1 工具链生态)
      • [7.2 RTE代码生成示例](#7.2 RTE代码生成示例)
      • [7.3 应用层代码实现](#7.3 应用层代码实现)
    • [八、AUTOSAR与功能安全(ISO 26262)集成](#八、AUTOSAR与功能安全(ISO 26262)集成)
      • [8.1 E2E(End-to-End)保护](#8.1 E2E(End-to-End)保护)
      • [8.2 WdgM(Watchdog Manager)看门狗管理](#8.2 WdgM(Watchdog Manager)看门狗管理)
      • [8.3 SafeBSW安全基础软件](#8.3 SafeBSW安全基础软件)
    • 九、常见问题与最佳实践
    • 十、总结与展望

每日一句正能量

人生就像一只风筝,线握在自己手中,去哪都由自己决定。

风筝有风(环境、运气)的影响,但线的终点始终在你手里。你可以放高,也可以收近;可以逆风调整,也可以顺风滑翔。重要的是别把线交给别人,也别在风中慌乱松手。决定方向的主动权,永远别丢。


一、前言:为什么汽车电子需要AUTOSAR

现代汽车电子系统正在经历前所未有的复杂度爆炸。一辆高端智能汽车可能搭载超过100个ECU(电子控制单元),运行数亿行代码,涵盖动力总成、底盘控制、车身电子、智能驾驶、信息娱乐等数十个域。在AUTOSAR出现之前,每个ECU的软件都是"孤岛"------硬件与软件深度耦合,供应商各自为政,OEM(整车厂)难以掌控核心技术 。

AUTOSAR(AUTomotive Open System ARchitecture) 应运而生。它通过标准化的分层架构和开发方法论,实现了三大核心目标 :

  1. 软硬件解耦:软件资产可复用、可验证、可维护,硬件更换仅需替换最底层驱动
  2. 供应商协同:统一的ARXML数据交换格式,使OEM与Tier1/Tier2在同一"设计语言"下协作
  3. 功能安全与网络安全:内置ISO 26262支持,E2E端到端保护,看门狗管理等安全机制

本文将从分层架构、BSW详解、RTE机制、ASW设计、配置方法论到代码生成,系统性地拆解AUTOSAR Classic Platform的技术内核。


二、AUTOSAR Classic Platform分层架构

AUTOSAR Classic Platform采用四层架构,实现从应用逻辑到硬件寄存器的逐层抽象 :

2.1 应用层(ASW - Application Layer)

ASW是AUTOSAR架构的最顶层,承载与车辆功能直接相关的应用软件。其核心元素是软件组件(Software Component, SWC)

概念 说明 示例
原子组件(Atomic SWC) 不可再分的最小功能单元,映射到单个ECU 电机转速计算组件
组合组件(Composition SWC) 由多个原子组件组合而成的逻辑单元 整车动力域控制器
可运行实体(Runnable) SWC内的执行单元,由事件触发 10ms周期执行的PID算法
端口(Port) 组件间通信的接口端点 接收转速信号的RPort
接口(Interface) 端口的数据类型与操作定义 Sender-Receiver接口

2.2 运行时环境(RTE - Runtime Environment)

RTE是ASW与BSW之间的中间件层 ,也是AUTOSAR架构的灵魂所在。它实现了虚拟功能总线(Virtual Functional Bus, VFB) 的概念------SWC之间的通信不依赖物理拓扑,RTE负责将逻辑通信映射到实际的CAN/LIN/Ethernet总线或内部函数调用 。

2.3 基础软件层(BSW - Basic Software)

BSW是AUTOSAR架构中体量最大、最复杂的部分,提供硬件抽象、通信服务、诊断服务、存储服务等基础能力。BSW本身又细分为三层,详见下一节。

2.4 微控制器驱动层(MCAL - Microcontroller Driver)

MCAL是BSW的最底层,直接操作微控制器的寄存器,包括时钟、GPIO、ADC、PWM、CAN控制器等驱动。MCAL由芯片厂商提供(如NXP S32K、Infineon AURIX、Renesas RH850),是硬件替换时唯一需要修改的层


三、BSW基础软件层深度解析

BSW占整个AUTOSAR代码量的60%~70%,理解其内部结构是掌握AUTOSAR的关键。

3.1 服务层(Services Layer)

服务层是BSW的上层,为应用层和RTE提供标准化的服务接口:

模块 功能 典型应用
COM 信号打包/解包、路由、周期发送 将应用信号打包为CAN PDU
PDU Router PDU路由决策(网关功能) 跨域CAN-FD到Ethernet路由
DCM 诊断通信管理(UDS协议栈) 故障码读取、刷写服务
DEM 诊断事件管理 故障检测、去抖、存储
NVM 非易失存储管理 标定参数、故障码持久化
NM 网络管理(OSEK/AUTOSAR NM) ECU休眠/唤醒协调
OS 操作系统(OSEK/VDX标准) 任务调度、中断管理、资源保护

3.2 ECU抽象层(ECU Abstraction Layer)

ECU抽象层将板级硬件(如外设芯片、收发器、存储器)抽象为标准化接口:

模块 功能 典型应用
IoHwAb I/O硬件抽象(ADC/DIO/PWM) 统一传感器/执行器接口
CanIf CAN接口抽象 屏蔽不同CAN控制器的差异
LinIf LIN接口抽象 车门/座椅LIN节点通信
EthIf 以太网接口抽象 ADAS域高速数据传输
Fee Flash EEPROM仿真 用Flash模拟EEPROM存储
Ea EEPROM抽象 外部EEPROM芯片驱动

3.3 微控制器驱动层(Microcontroller Drivers)

MCAL直接操作MCU内核与外设寄存器,由芯片厂商提供:

模块 功能 典型应用
MCU 时钟、复位、电源管理 系统初始化、低功耗模式
PORT GPIO端口配置 引脚复用、方向、上下拉
DIO 数字I/O读写 LED控制、数字信号输入
ADC 模数转换 温度/电压/电流传感器
PWM 脉宽调制输出 电机驱动、电磁阀控制
ICU 输入捕获 编码器信号、频率测量
CAN CAN控制器驱动 报文发送/接收、中断处理
SPI SPI控制器驱动 外设芯片(ADC/Flash)通信

3.4 复杂驱动(CDD - Complex Device Drivers)

CDD是BSW中的"特殊通道",允许绕过标准BSW栈直接访问MCAL,用于高性能或非标外设场景:

  • 电机控制:FOC算法需要μs级PWM更新,标准PWM驱动无法满足
  • 传感器融合:多路ADC同步采样,需要自定义触发逻辑
  • 安全相关算法:ASIL-D级功能需要独立于标准BSW的监控通道

四、RTE运行时环境与VFB通信机制

RTE是AUTOSAR架构中最精妙的设计,它实现了"一次开发,多处部署"的组件复用理念。

4.1 虚拟功能总线(VFB)概念

VFB是AUTOSAR的逻辑通信视图------在系统设计阶段,SWC之间的连接仅描述"谁与谁通信、通信什么数据",完全不涉及物理拓扑(是否在同一个ECU、通过什么总线通信)。RTE在ECU配置阶段将VFB映射为实际的通信实现:

VFB逻辑连接 同ECU实现 跨ECU实现
SWC_A → SWC_B 直接函数调用(RTE_Write/RTE_Read) COM信号 → CAN总线 → COM信号
Client → Server 同进程函数调用 远程过程调用(RPC)序列化

4.2 RTE通信接口类型

(1)Sender-Receiver(S/R)接口:单向数据流,适用于传感器数据、控制指令等

c 复制代码
/* RTE生成的S/R接口代码 */
Std_ReturnType Rte_Write_MotorControl_TorqueCommand(uint16 torque);
Std_ReturnType Rte_Read_MotorControl_SpeedSensor_Speed(uint16* speed);

(2)Client-Server(C/S)接口:请求-响应模式,适用于诊断服务、标定参数读取等

c 复制代码
/* RTE生成的C/S接口代码 */
Std_ReturnType Rte_Call_MotorControl_DiagService_ReadDTC(
    uint16* dtc, 
    uint8* status
);

(3)Mode-Switch接口:模式切换通知,适用于系统状态管理(如休眠/唤醒)

4.3 RTE事件触发机制

事件类型 触发条件 典型应用
TimingEvent 周期性定时触发(如10ms) 控制算法周期执行
DataReceivedEvent 接收到新数据时触发 事件驱动处理
OperationInvokedEvent 客户端调用服务器操作时触发 C/S接口服务
ModeSwitchEvent 模式切换时触发 系统状态转换
InitEvent 组件初始化时触发 一次性初始化代码

五、SWC软件组件设计与Runnable映射

5.1 SWC内部结构

SWC的内部结构包含三个核心部分:

(1)端口(Port):组件的对外接口

  • Required Port(RPort):组件需要的数据或服务(输入)
  • Provided Port(PPort):组件提供的数据或服务(输出)

(2)内部行为(Internal Behaviour, IB):定义组件的运行时特性

  • Runnable实体及其触发事件
  • 数据访问点(Data Access Points)
  • 互斥区域(Exclusive Areas)

(3)实现(Implementation):Runnable的具体代码

  • 可由Simulink自动生成
  • 可由开发者手写(遵循MISRA-C规范)

5.2 Runnable到OS任务的映射

Runnable是SWC中的执行单元,但本身不直接调度------RTE将Runnable映射到OS任务中执行:

映射策略 说明 优缺点
周期映射 相同周期的Runnable放入同一OS任务 减少任务切换开销,但耦合度高
功能映射 相关功能的Runnable放入同一任务 提高内聚性,但周期可能不一致
优先级映射 高优先级Runnable放入高优先级任务 满足实时性,但设计复杂

关键设计原则

  • 避免优先级反转:高优先级任务不应等待低优先级任务释放资源
  • 任务抖动控制:周期任务的实际执行时间偏差应<5%
  • 栈空间优化:同任务内Runnable共享栈空间,减少RAM占用

六、AUTOSAR方法论:从配置到代码

AUTOSAR不仅定义了架构,还定义了完整的开发方法论------三阶段流程

6.1 阶段一:系统配置(System Configuration)

输入 :整车功能需求、网络拓扑、ECU资源描述

输出:System ARXML(系统级描述文件)

核心活动

  1. 定义SWC及其接口(使用DaVinci Developer或MATLAB)
  2. 设计通信矩阵(CAN/LIN/Ethernet报文分配)
  3. 将SWC映射到ECU(部署决策)
  4. 定义ECU间通信关系
xml 复制代码
<!-- System ARXML片段:SWC与ECU映射 -->
<MAPPING>
    <SWC-TO-ECU-MAPPING>
        <SHORT-NAME>Mapping_MotorControl</SHORT-NAME>
        <COMPONENT-REF DEST="SWC">/MotorControl/SWC_MotorControl</COMPONENT-REF>
        <ECU-REF DEST="ECU">/Topology/ECU_MotorController</ECU-REF>
    </SWC-TO-ECU-MAPPING>
</MAPPING>

6.2 阶段二:ECU设计与配置(ECU Design & Configuration)

输入 :System ARXML中提取的目标ECU信息(ECU Extract)

输出:ECU Configuration ARXML

核心活动

  1. BSW配置:选择需要的BSW模块(如COM、NM、DCM等),配置参数
  2. MCAL配置:配置MCU时钟、GPIO、中断、通信外设
  3. OS配置:定义任务、事件、资源、调度策略
  4. RTE配置:生成RTE所需的连接信息

6.3 阶段三:代码生成(Code Generation)

输入 :ECU Configuration ARXML

输出:可编译的C代码 + 可执行的ELF/HEX文件

生成内容

生成器 输出 说明
RTE Generator Rte_*.c/h 组件间通信接口代码
BSW Generator 各模块代码 COM、NM、OS等模块实现
MCAL Generator Mcal_*.c/h 微控制器驱动代码
Simulink Coder SWC算法代码 控制算法C代码

七、代码生成实战:从ARXML到C代码

7.1 工具链生态

工具类型 代表产品 功能
架构设计 Vector DaVinci Developer, ETAS ISOLAR-A SWC设计、ARXML编辑
BSW配置 Vector DaVinci Configurator, EB tresos BSW/MCAL参数配置
代码生成 RTE Generator (内置), Simulink Coder 自动生成RTE和应用代码
编译调试 HighTec, GCC, Green Hills 编译链接、调试下载
测试验证 Vector CANoe, dSPACE HIL 总线测试、硬件在环

7.2 RTE代码生成示例

以下是由RTE Generator自动生成的代码片段,展示了S/R接口和C/S接口的实现:

c 复制代码
/*==================================================================
 * 文件: Rte_MotorControl.h
 * 描述: RTE生成的接口头文件(自动生成,禁止手动修改)
 * 生成工具: RTE Generator 4.0
 * 生成时间: 2026-07-08
 *================================================================*/

#ifndef RTE_MOTORCONTROL_H
#define RTE_MOTORCONTROL_H

#include "Rte_Type.h"           /* AUTOSAR标准类型定义 */
#include "Rte_DataHandleType.h"  /* 数据句柄类型 */

/*==================================================================
 * Sender-Receiver接口: 电机转速读取
 * 提供方: SpeedSensor_SWC
 * 需求方: MotorControl_SWC
 *================================================================*/
#define Rte_Read_MotorControl_SpeedSensor_Speed(data) \
    (Rte_Read_R_MotorControl_SpeedSensor_Speed(data))

/* 实际实现(Rte.c中) */
extern Std_ReturnType Rte_Read_R_MotorControl_SpeedSensor_Speed(
    Rte_Instance_MotorControl instance, 
    uint16* const data
);

/*==================================================================
 * Client-Server接口: 诊断服务调用
 * 提供方: DiagService_SWC
 * 需求方: MotorControl_SWC
 *================================================================*/
#define Rte_Call_MotorControl_DiagService_ReadDTC(dtc, status) \
    (Rte_Call_R_MotorControl_DiagService_ReadDTC(dtc, status))

/* 实际实现 */
extern Std_ReturnType Rte_Call_R_MotorControl_DiagService_ReadDTC(
    Rte_Instance_MotorControl instance,
    uint16* dtc,
    uint8* status
);

/*==================================================================
 * Runnable入口函数声明
 * 由OS任务调度器周期性调用
 *================================================================*/
void Rte_MotorControl_Runnable_10ms(void);   /* 10ms周期任务 */
void Rte_MotorControl_Runnable_20ms(void);   /* 20ms周期任务 */
void Rte_MotorControl_Runnable_Init(void);   /* 初始化任务 */

#endif /* RTE_MOTORCONTROL_H */

7.3 应用层代码实现

开发者需要实现的Runnable代码(遵循RTE接口规范):

c 复制代码
/*==================================================================
 * 文件: MotorControl_SWC.c
 * 描述: 电机控制SWC的Runnable实现(开发者编写)
 *================================================================*/

#include "Rte_MotorControl.h"
#include "PidController.h"      /* 私有PID算法库 */

/* 内部状态变量 */
static uint16 g_targetSpeed = 0;    /* 目标转速 */
static uint16 g_actualSpeed = 0;    /* 实际转速 */
static sint16 g_torqueCommand = 0;  /* 扭矩指令 */

/*==================================================================
 * Runnable: 10ms周期执行(传感器读取与预处理)
 *================================================================*/
void Rte_MotorControl_Runnable_10ms(void)
{
    uint16 rawSpeed;
    Std_ReturnType status;
    
    /* 通过RTE读取传感器数据 */
    status = Rte_Read_MotorControl_SpeedSensor_Speed(&rawSpeed);
    
    if (status == RTE_E_OK) {
        /* 信号滤波与单位转换 */
        g_actualSpeed = SpeedSensor_Filter(rawSpeed);
        g_actualSpeed = SpeedSensor_RpmToRadps(g_actualSpeed);
    } else {
        /* 读取失败:使用安全默认值 */
        g_actualSpeed = 0;
        /* 报告通信错误 */
        (void)Rte_Call_MotorControl_DiagService_ReadDTC(&g_lastDTC, &g_dtcStatus);
    }
}

/*==================================================================
 * Runnable: 20ms周期执行(控制算法)
 *================================================================*/
void Rte_MotorControl_Runnable_20ms(void)
{
    sint16 torque;
    
    /* 获取目标转速(来自上层SWC) */
    (void)Rte_Read_MotorControl_VehicleMode_TargetSpeed(&g_targetSpeed);
    
    /* 执行PID控制算法 */
    torque = PidController_Calculate(
        g_targetSpeed,      /* 设定值 */
        g_actualSpeed,      /* 反馈值 */
        0.5f,               /* Kp */
        0.1f,               /* Ki */
        0.01f               /* Kd */
    );
    
    /* 输出限幅 */
    g_torqueCommand = SATURATE(torque, -1000, 1000);
    
    /* 通过RTE输出扭矩指令 */
    (void)Rte_Write_MotorControl_TorqueCommand((uint16)g_torqueCommand);
}

/*==================================================================
 * Runnable: 初始化(一次性执行)
 *================================================================*/
void Rte_MotorControl_Runnable_Init(void)
{
    /* PID参数初始化 */
    PidController_Init();
    
    /* 状态变量清零 */
    g_targetSpeed = 0;
    g_actualSpeed = 0;
    g_torqueCommand = 0;
}

八、AUTOSAR与功能安全(ISO 26262)集成

汽车电子系统的功能安全要求日益严格,AUTOSAR Classic Platform内置了多项安全机制:

8.1 E2E(End-to-End)保护

E2E保护确保跨ECU通信数据的完整性,防止传输过程中的位翻转、延迟、重复、丢失等故障:

保护机制 说明 ASIL等级
CRC校验 循环冗余校验,检测数据位错误 ASIL-D
序列计数器 检测消息丢失、重复、乱序 ASIL-D
Alive计数器 检测通信延迟/超时 ASIL-D
数据ID 防止消息路由错误 ASIL-D

8.2 WdgM(Watchdog Manager)看门狗管理

WdgM提供四种监控机制,确保软件执行的确定性:

监控类型 功能 实现方式
Alive监控 检测任务是否周期性执行 任务计数器递增检查
Deadline监控 检测任务执行时间是否超标 开始/结束时间戳比较
Logical监控 检测程序执行顺序是否正确 预定义的顺序图检查
程序流监控 检测代码块是否按预期执行 控制流图(CFG)检查

8.3 SafeBSW安全基础软件

AUTOSAR提供安全相关的BSW变体:

  • SafeCOM:安全通信,集成E2E保护
  • SafeOS:安全操作系统,支持内存保护、时间保护
  • SafeRTE:安全运行时环境,支持安全相关的S/R通信

九、常见问题与最佳实践

Q1:AUTOSAR开发周期为什么比传统开发长?

原因 :ARXML配置、工具链学习、标准化流程增加了前期工作量。

对策

  • 复用成熟的SWC模板和BSW配置
  • 采用MBD(模型驱动开发)自动生成代码
  • 建立企业级AUTOSAR平台,沉淀通用配置

Q2:RTE性能开销是否影响实时性?

分析 :同ECU内的RTE通信是函数调用,开销极小;跨ECU通信涉及COM栈序列化,开销较大。

优化

  • 高频信号(>100Hz)尽量部署在同一ECU
  • 使用COM的"直接传输"模式减少缓冲延迟
  • 优化PDU打包,减少总线负载

Q3:MCAL更换芯片时如何最小化修改?

原则 :仅修改MCAL层,上层的ECU抽象层、服务层、RTE、ASW均无需修改。

步骤

  1. 获取新芯片的MCAL包(从芯片厂商)
  2. 使用MCAL配置工具重新配置时钟、GPIO、外设
  3. 重新生成MCAL代码
  4. 全量回归测试(BSW + RTE + ASW)

Q4:如何调试AUTOSAR系统?

工具链

  • Vector CANoe:总线监控、节点仿真、诊断测试
  • Lauterbach TRACE32:MCU级调试,支持OS-Aware调试
  • ETAS INCA:标定与测量,实时监控内部变量

十、总结与展望

本文系统性地解析了AUTOSAR Classic Platform的核心技术:

  1. 分层架构:ASW(应用逻辑)→ RTE(通信中间件)→ BSW(基础服务)→ MCAL(硬件驱动)的四层解耦设计
  2. BSW详解:服务层(COM/DCM/NM)、ECU抽象层(IoHwAb/CanIf)、微控制器驱动(PORT/ADC/PWM)的三层BSW结构
  3. RTE机制:VFB虚拟功能总线实现逻辑通信与物理拓扑的分离,S/R和C/S两种接口类型
  4. SWC设计:端口、内部行为、Runnable的组件模型,以及到OS任务的映射策略
  5. 方法论:系统配置 → ECU提取 → ECU配置 → RTE生成 → 代码编译的五阶段开发流程
  6. 功能安全:E2E端到端保护、WdgM看门狗管理、SafeBSW安全模块的ISO 26262支持

未来演进

  • AUTOSAR Adaptive Platform(AP):面向高性能计算和自动驾驶,支持动态更新、SOA架构
  • CP/AP混合部署:Classic Platform负责实时控制,Adaptive Platform负责AI推理和云端连接
  • 鸿蒙车机生态:OpenHarmony与AUTOSAR的跨域融合,实现座舱域与整车域的统一软件底座

AUTOSAR Classic Platform历经20年发展,已成为汽车电子领域的事实标准。掌握其分层架构、配置方法论和代码生成机制,是每一位汽车嵌入式工程师的核心竞争力。


转载自:https://blog.csdn.net/u014727709/article/details/162691511

欢迎 👍点赞✍评论⭐收藏,欢迎指正

相关推荐
梦想的旅途21 小时前
企业微信外部群智能自动回复:基于RPA接口的关键词匹配方案
java·开发语言·数据库·机器人·自动化·企业微信
江华森1 小时前
【玩转 AtomCode】源码编译与架构解析:深入理解开源 AI 编码代理的内核设计
架构·开源
得物技术1 小时前
得物 OceanBase 落地实践
数据库·分布式·架构
娇气的红酒1 小时前
关于.NET VS JavaEE平台争论的沉思录
java·java-ee·.net
折哥的程序人生 · 物流技术专研1 小时前
第3篇:手写一个饮品制作模板(附代码)
java·设计模式·行为型模式·模版方法模式·钩子方法·代码复用·编程实战
SamDeepThinking1 小时前
为什么很多人学了Java,还是没真正理解类和对象?
java·后端·面试
许彰午2 小时前
从Oracle看MySQL聚簇索引的架构性缺陷与缓解之道
mysql·oracle·架构
zzh___zzh2 小时前
Spring Boot资源路径与ClassPathResource详解
java
XUHUOJUN2 小时前
Storage Spaces on Shared SAS JBOD 在 Azure Local 解耦架构中的重新定位
microsoft·架构·azure·s2d