ARTICLE · 1013140
第 3 章 虚拟功能总线与软件组件建模
第 3 章 虚拟功能总线与软件组件建模
本章地图:回答三个问题——为什么把功能拆成"软件组件"?组件靠什么通信(VFB)?组件"长什么样"?本章是第 2 章分层架构的深化、第 4 章 RTE 的铺垫。建议课时:2 课时对应资料:
General/AUTOSAR_EXP_VFB.pdf、General/AUTOSAR_TR_SWCModelingGuide.pdf、General/AUTOSAR_RS_SWCModeling.pdf
3.1 学习目标
学完本章,你将能够:
1. 解释"组件思维"的价值,说清 VFB(Virtual Functional Bus,虚拟功能总线)与 RTE 的分工; 2. 画出"端口—端口接口—连接器"关系,区分 P-Port(提供端口)与 R-Port(需求端口); 3. 列举主要端口接口类型(S/R、C/S、Mode、NvData、Parameter 等)并说明用途; 4. 描述 Runnable 与组件实现(SWC Implementation)的关系,以及组合与原子组件的区别; 5. 说出 S/R 与 C/S 的通信语义要点(广播/过滤/时序、同步/异步、错误类型)与变体处理的绑定时间。
3.2 从"组件思维"讲起
车窗、空调、防抱死……若写成"一坨代码",任何改动都牵一发动全身。AUTOSAR 的答案是组件思维:把功能拆成一个个软件组件 SWC(Software Component,软件组件),每个封装一段完整或部分功能,只通过明确接口与外界打交道。
人话版:像乐高积木——每块只负责自己的形状,靠标准凸点咬合。
组件思维有三个红利:可独立开发测试、可复用、可重定位(relocatability)——组件住哪颗 ECU 可到设计后期再定。
组件之间怎么通信?AUTOSAR 引入关键抽象——VFB(Virtual Functional Bus,虚拟功能总线):设计阶段所有组件挂到一条"虚拟总线"上,任意组件与任意组件通信,无需知道对方在哪颗 ECU、走什么总线。
人话版:VFB 像快递系统——寄件人只写收件人和内容,不关心包裹怎么走;官方称之为"应用程序与基础设施严格分离"。
注意:VFB 是设计期概念;落地时由 RTE(Runtime Environment,运行时环境)+ BSW 实现——ECU 内由 RTE 完成,跨 ECU 交给 BSW 通信栈(Com、PduR 等)变报文。此"虚拟到物理"映射叫 Configure System(配置系统)。
图 3-1 VFB 概念:设计期的虚拟总线,部署后由 RTE+BSW 实现┌────────────────────────────────────────────────────────────────┐│ VFB 视图(设计时) ││ ││ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ││ │ SWC-A │────▶│ SWC-B │────▶│ SWC-C │────▶│ SWC-D │ ││ └────────┘ └────────┘ └────────┘ └────────┘ ││ (发送) (处理) (处理) (接收) ││ ││ 组件只见端口与连接器,不关心对方在哪个 ECU、走哪条总线 │└────────────────────────────────────────────────────────────────┘ │ 部署(Configure System) ▼┌────────────────────────────────────────────────────────────────┐│ ECU 1 ECU 2 ││ ┌────────┐ ┌────────┐ ┌────────┐ ││ │ SWC-A │ │ SWC-B │ │ SWC-C │ ││ └───┬────┘ └───┬────┘ └───┬────┘ ││ └── RTE ─────┘ │ ││ └─────── BSW ─────────────────────┘ │└────────────────────────────────────────────────────────────────┘ │ ▼ CAN / FlexRay / LIN 物理总线3.3 组件的"外观":端口与端口接口
组件与外界交互的唯一途径是端口 Port;官方需求写明:组件只能通过端口互相交互(EXP_Vfb_00002)。
端口按"方向"分三类:
每个端口由恰好一个端口接口(Port Interface)类型化。端口接口是"契约":定义端口提供/需求什么——数据元素集合(S/R)或操作集合(C/S)。AUTOSAR 支持的主要端口接口类型:
容易混淆①:端口是实例,端口接口是类型——同一接口可类型化很多端口,像一张插座规格书对应无数插座。容易混淆②:P-Port/R-Port 是"方向",接口类型是"内容"——P-Port 配 C/S 接口即服务器端口,配 S/R 接口即发送端口。一个端口只承载一种通信模式。
3.4 组件内部:Runnable 与组件实现
组件在 VFB 上是"黑盒";实现层面,原子组件内部由若干个可运行实体 Runnable Entity(Runnable)组成——组件提供的一段指令序列(通常是 C 函数),由 RTE 启动,触发分周期性(如每 10ms)与事件触发(收到新数据、操作被调用等)。
人话版:SWC 是公司,Runnable 是员工,RTE 是任务分发系统——"每 10ms 让小王跑一趟,门铃响了让小李开门"。
Runnable 运行在 OS 的 **Task(任务)**上下文中,由 OS 调度器决定谁占 CPU。组件实现 SWC Implementation 含三部分:组件模型(端口/接口)、实现代码(Runnable 函数)、软件组件描述(对 RTE 的需求清单)。
RTE 会"按单生产":为组件生成读写端口数据的 API、按约定调用 Runnable。Runnable 与端口、事件的映射称内部行为(Internal Behavior)。
3.5 组件的"骨架":组合与原子、连接器
AUTOSAR 的组件类型分两类:
• 原子组件(Atomic Component):不可再拆分,必须整体映射到一个 ECU("原子性"); • 组合组件(Composition):由若干"原型(Prototype)"与连接器拼装,本身也是组件类型,可层层嵌套。
组合内部用**连接器(Connector)把端口钩起来:装配连接器(Assembly Connector)连接一个 P-Port/PR-Port 与一个 R-Port/PR-Port,没有连接器就没有通信(EXP_Vfb_00009)。组合端口通过委托连接器(Delegation Connector)**对外可见。
注意:组合组件不允许出现"服务端口",服务连接在 ECU 配置阶段才建立。
图 3-2 端口—端口接口—连接器关系 SWC-A(发送者) SWC-B(接收者) ┌────────────────────┐ ┌────────────────────┐ │ P-Port(提供) │ │ R-Port(需求) │ └─────────┬──────────┘ └─────────┬──────────┘ │ ▲ └──────── 连接器 Connector ─────────┘ (装配连接器,一个 P 连一个 R) │ │ 两个端口由同一个端口接口类型化 ▼ ┌────────────────────────────┐ │ SenderReceiverInterface │ │ 数据元素:VehicleSpeed │ └────────────────────────────┘3.6 SWC 的种类
VFB 层面定义了多种组件类型:
容易混淆:这里的"服务组件"与第 2 章"服务层 BSW"不是一回事——服务组件是把 NvM、Dcm 等标准服务"包装成组件"后的 VFB 表示,通过标准化接口被应用调用;确切机制以官方规范为准。
3.7 VFB 通信语义要点
S/R(Sender-Receiver,发送者-接收者):发送者把数据元素广播给一个或多个接收者,不知道接收者是谁,接收者自主决定何时消费——双方强解耦。数据元素有两种语义:
• Last-is-best(最新值优先):接收者只关心最新值;可配初始值、无效化(Invalidation)与"活性"(Alive Timeout 超时判过时); • Queued(队列):发送值进入接收侧 FIFO 队列,读取即消费;队满丢新值,可通知接收者。
接收侧可配过滤器(Filter)(与 OSEK COM 相同,仅限基本类型),不满足的值直接丢弃。注意:过滤器在接收侧建模,但实现时可在发送侧提前过滤(如仅一个接收者时)。
时序保证:同一连接器内,同一数据元素的连续变更保持顺序;不同元素、不同连接器之间不保证任何顺序。
C/S(Client-Server,客户端-服务器):客户端调用服务器实现的操作,只支持 n:1(n 个客户端、1 个服务器)。调用方式:同步(阻塞等待)或异步(不阻塞——在"等待点"唤醒,或响应到达时激活一个 Runnable 处理)。
同一操作在同一 R-Port 上前一次调用未返回时不允许再调;不同操作间顺序无保证(响应须能关联对应调用)。服务器侧有请求队列,队满时新请求被丢弃,客户端收到超时错误。
错误类型:分两类——基础设施错误(Infrastructure Error)(如超时,由 AUTOSAR 标准化)与应用错误(Application Error)(接口中定义,如"硬件故障")。C 实现层经标准返回类型(如 E_OK/E_NOT_OK)上报,具体以官方规范为准。
图 3-3 S/R 广播与 C/S 请求-响应对比 S/R(广播数据流) C/S(调用) ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ SWC-A │─────▶│ SWC-B │ │ SWC-A │──①──▶│ SWC-B │ │ 发送者 │ │ 接收者 │ │ 客户端 │ 调用 │ 服务器 │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ ▲ │ ▼ ▼ └───②返回/错误◀──────┘ ┌──────────┐ ┌──────────┐ │ SWC-C │ │ SWC-D │ 同步:阻塞等待响应 │ 接收者 │ │ 接收者 │ 异步:等待点/激活 Runnable └──────────┘ └──────────┘ n:1(多客户端、1 服务器) 发送者不知道接收者数量与身份变体处理(Variant Handling):同一套模型支持"超集 + 选择",在变体点(Variation Point)上决定启用哪部分,决定的时间点叫绑定时间(Binding Time):System Design(系统设计)、Code Generation(代码生成)、Pre Compile(预编译)、Link Time(链接)、Post Build(构建后);组件可变性最晚到 Post Build,端口最晚到 Pre Compile,连接器可到 Post Build。
3.8 本章小结
1. 组件思维 = 拆功能、定接口、独立开发、可复用、可重定位; 2. VFB 是设计期抽象,落地由 RTE(ECU 内)+ BSW 通信栈(跨 ECU)实现; 3. 端口是交互点(P/R/PR),端口接口是契约,一个端口恰好一个接口、一种通信模式; 4. 原子组件内部由 Runnable 组成,RTE 负责调度;组件实现 = 模型 + 代码 + 需求描述; 5. 组合组件由原型与连接器拼装,可层层嵌套;没有连接器就没有通信; 6. S/R 广播解耦(last-is-best/queued、过滤、单元素保序);C/S 请求-响应(n:1、同步/异步、两类错误);变体处理按绑定时间选择变体。
3.9 思考与练习
1. 用"快递系统"类比解释:为什么 VFB 能让组件"不知道对方在哪"?组件从 ECU1 迁到 ECU2,代码需要改吗? 2. 画出"端口—端口接口—连接器"关系图,并说明两个端口能连接的前提。(提示:接口兼容性) 3. 对比 last-is-best 与 queued 语义,各举一个适用场景。(提示:转速信号 vs 按键事件) 4. C/S 通信中,为什么官方建议把操作设计成"幂等"(可重复执行)? 5. 查阅 General/AUTOSAR_EXP_VFB.pdf第 3 章,列出全部端口接口类型,并指出哪些端口组合存在兼容性限制。
3.10 延伸阅读
• General/AUTOSAR_EXP_VFB.pdf:第 2 章(VFB 与 Configure System)、第 3 章(组件/端口/接口/连接器/组合/组件种类/Runnable/变体)、第 4 章(通信语义与错误类型)• General/AUTOSAR_TR_SWCModelingGuide.pdf:第 5 章(建模规则:接口复用、变体建模、聚类)、第 6 章(命名规范)• General/AUTOSAR_RS_SWCModeling.pdf:软件组件建模的需求文档(RS_SWMG_xxxx)• 预告:第 4 章讲 RTE,可先浏览 RTE/AUTOSAR_SRS_RTE.pdf通信概念部分