夜雨聆风学习资料网

ARTICLE · 1013140

第 3 章 虚拟功能总线与软件组件建模

第 3 章 虚拟功能总线与软件组件建模

本章地图:回答三个问题——为什么把功能拆成"软件组件"?组件靠什么通信(VFB)?组件"长什么样"?本章是第 2 章分层架构的深化、第 4 章 RTE 的铺垫。建议课时:2 课时对应资料:General/AUTOSAR_EXP_VFB.pdfGeneral/AUTOSAR_TR_SWCModelingGuide.pdfGeneral/AUTOSAR_RS_SWCModeling.pdf


3.1 学习目标

学完本章,你将能够:

  1. 1. 解释"组件思维"的价值,说清 VFB(Virtual Functional Bus,虚拟功能总线)与 RTE 的分工;
  2. 2. 画出"端口—端口接口—连接器"关系,区分 P-Port(提供端口)与 R-Port(需求端口);
  3. 3. 列举主要端口接口类型(S/R、C/S、Mode、NvData、Parameter 等)并说明用途;
  4. 4. 描述 Runnable 与组件实现(SWC Implementation)的关系,以及组合与原子组件的区别;
  5. 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)。

端口按"方向"分三类:

端口
含义
P-Port(Provide Port,提供端口)
向外提供接口定义的内容
R-Port(Require Port,需求端口)
向外需求接口定义的内容
PR-Port
既提供又需求(参数接口不支持 PR-Port)

每个端口由恰好一个端口接口(Port Interface)类型化。端口接口是"契约":定义端口提供/需求什么——数据元素集合(S/R)或操作集合(C/S)。AUTOSAR 支持的主要端口接口类型:

端口接口类型
官方术语
用途
发送-接收
Sender-Receiver Interface
数据元素(信号/事件)的发布与接收
客户端-服务器
Client-Server Interface
客户端调用服务器实现的操作
模式切换
Mode Switch Interface
模式管理者通知模式切换(Mode Request/Indication 模式请求/指示)
非易失数据
Non Volatile Data Interface
对非易失数据的元素级读写(NvData)
参数
Parameter Interface
访问常量、固定值或标定数据
触发
Trigger Interface
触发其他组件执行(如曲轴位置触发)

容易混淆①:端口是实例,端口接口是类型——同一接口可类型化很多端口,像一张插座规格书对应无数插座。容易混淆②: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 层面定义了多种组件类型:

组件种类
作用
应用组件 Application SW-C
实现应用逻辑,通过 S/R、C/S 与外界交互(数量最多)
传感器/执行器组件 Sensor-Actuator SW-C
屏蔽传感器/执行器细节,直接与 ECU 抽象层交互(IO 边界)
参数组件 Parameter SW-C
提供常量、固定值或标定数据
服务组件 Service SW-C
通过标准化接口提供标准服务(如 NvM、Dcm 等 BSW 服务的组件化包装)
ECU 抽象组件 ECU Abstraction SW-C
提供 ECU 特定的 I/O 能力(通常用 C/S 端口)
复杂驱动组件 Complex Device Driver SW-C
处理非标准/高实时功能,可直接与 BSW 交互(例外)
NVBlock 组件 NvBlock SW-C
在 VFB 层建模非易失数据块的访问
服务代理组件 Service Proxy SW-C
在系统中分发模式(每个 ECU 部署一份)
组合组件 Composition SW-C
封装组件协作,隐藏内部细节

容易混淆:这里的"服务组件"与第 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. 1. 组件思维 = 拆功能、定接口、独立开发、可复用、可重定位;
  2. 2. VFB 是设计期抽象,落地由 RTE(ECU 内)+ BSW 通信栈(跨 ECU)实现;
  3. 3. 端口是交互点(P/R/PR),端口接口是契约,一个端口恰好一个接口、一种通信模式;
  4. 4. 原子组件内部由 Runnable 组成,RTE 负责调度;组件实现 = 模型 + 代码 + 需求描述;
  5. 5. 组合组件由原型与连接器拼装,可层层嵌套;没有连接器就没有通信;
  6. 6. S/R 广播解耦(last-is-best/queued、过滤、单元素保序);C/S 请求-响应(n:1、同步/异步、两类错误);变体处理按绑定时间选择变体。

3.9 思考与练习

  1. 1. 用"快递系统"类比解释:为什么 VFB 能让组件"不知道对方在哪"?组件从 ECU1 迁到 ECU2,代码需要改吗?
  2. 2. 画出"端口—端口接口—连接器"关系图,并说明两个端口能连接的前提。(提示:接口兼容性)
  3. 3. 对比 last-is-best 与 queued 语义,各举一个适用场景。(提示:转速信号 vs 按键事件)
  4. 4. C/S 通信中,为什么官方建议把操作设计成"幂等"(可重复执行)?
  5. 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 通信概念部分

相关学习资料

返回首页浏览学习资料