AUTOSAR 总线镜像模块详解
目录
1. 引言
AUTOSAR Bus Mirroring(总线镜像)模块是AUTOSAR经典平台中的一个基础软件模块,其主要功能是将内部总线的流量和状态复制到外部总线,使得连接到外部总线的测试设备能够监控内部总线以进行调试。
总线镜像功能可通过诊断命令来配置,确保只有通过安全检查的测试设备才能启用镜像功能。该模块支持多种源总线类型(CAN、LIN、FlexRay)和目标总线类型(CAN、FlexRay、IP、自定义设备驱动CDD)。
图1.1 AUTOSAR Bus Mirroring 模块架构
上图展示了AUTOSAR Bus Mirroring模块的整体架构,包括模块内部组件、源总线接入方式以及目标总线输出方式。模块通过初始化、过滤、状态管理和数据处理等功能实现总线数据的镜像转发。
2. 模块架构
2.1 总体架构
AUTOSAR Bus Mirroring模块采用分层设计,主要包括以下核心组件:
- 初始化模块:负责模块的初始化和去初始化
- 源总线接入:负责从不同类型源总线获取帧数据
- 目标总线处理:负责创建、队列管理和传输目标帧
- 过滤器管理:负责过滤和选择需要镜像的特定总线帧
- 状态管理:负责控制镜像功能的启动、停止和切换
这些组件共同协作,实现从源总线到目标总线的数据镜像功能。
2.2 功能组件
-
源总线接入组件
- CAN接入:获取CAN总线帧并应用过滤规则
- LIN接入:获取LIN总线帧并应用过滤规则
- FlexRay接入:获取FlexRay总线帧并应用过滤规则
-
目标总线处理组件
- 目标帧创建:根据源总线帧创建适合目标总线的帧格式
- 帧队列管理:管理待发送帧的队列
- 帧传输:将帧发送到目标总线
-
模块管理组件
- 初始化:通过
Mirror_Init
和Mirror_DeInit
函数管理模块生命周期 - 过滤器管理:控制哪些帧需要被镜像
- 状态管理:控制镜像功能的状态切换
- 初始化:通过
2.3 层次关系
Bus Mirroring模块在AUTOSAR架构中处于基础软件层,与通信栈和诊断模块有紧密的交互关系:
- 与CAN、LIN、FlexRay等底层驱动模块交互,获取源总线数据
- 与上层诊断模块交互,接收并处理镜像配置命令
- 与目标总线驱动交互,发送镜像数据
通过这种层次化设计,模块可以灵活适应不同的源总线和目标总线组合。
3. 过滤器管理
3.1 过滤器类型
Bus Mirroring模块支持多种过滤器类型,用于选择性地镜像特定的总线帧。根据不同总线类型,提供了不同的过滤器实现:
图3.1 Bus Mirroring 过滤器管理结构
-
CAN过滤器
- 范围过滤器:基于CAN ID范围过滤,包含
LowerCanId
和UpperCanId
- 掩码过滤器:基于掩码和值过滤,使用
CanIdMask
和CanIdValue
- 范围过滤器:基于CAN ID范围过滤,包含
-
LIN过滤器
- 范围过滤器:基于LIN ID范围过滤,包含
LowerLinId
和UpperLinId
- 掩码过滤器:基于掩码和值过滤,使用
LinIdMask
和LinIdValue
- 范围过滤器:基于LIN ID范围过滤,包含
-
FlexRay过滤器
- 基于
FrameId
和Channel
(A、B或两者)过滤FlexRay帧
- 基于
3.2 过滤器操作接口
模块提供了一组API用于管理过滤器:
Mirror_GetStaticFilterState
:获取静态过滤器状态Mirror_SetStaticFilterState
:设置静态过滤器状态Mirror_AddCanRangeFilter
:添加CAN范围过滤器Mirror_AddCanMaskFilter
:添加CAN掩码过滤器Mirror_AddLinRangeFilter
:添加LIN范围过滤器Mirror_AddLinMaskFilter
:添加LIN掩码过滤器Mirror_AddFlexRayFilter
:添加FlexRay过滤器Mirror_RemoveFilter
:移除特定过滤器
这些API允许在运行时动态添加和移除过滤器,提供了灵活的帧选择机制。
3.3 过滤器配置
过滤器可以通过两种方式配置:
-
静态配置:通过配置容器预定义过滤器
MirrorSourceCanFilterRange
MirrorSourceCanFilterMask
MirrorSourceLinFilterRange
MirrorSourceLinFilterMask
MirrorSourceFlexRayFilter
-
动态配置:通过API在运行时添加过滤器
- 可以根据诊断请求动态添加或移除过滤器
- 每个过滤器创建后会返回一个过滤器ID,用于后续管理
过滤器的使用极大地提高了带宽利用效率,只镜像必要的帧数据。
4. 状态管理
4.1 状态转换流程
Bus Mirroring模块具有完整的状态管理机制,控制模块的生命周期和工作状态:
图4.1 Bus Mirroring 模块状态转换图
模块的主要状态包括:
- 未初始化状态:模块尚未初始化
- 已初始化状态:模块已初始化,但可能处于离线或在线状态
- 离线状态:镜像功能未激活
- 在线状态:镜像功能已激活,可以进行源总线和目标总线操作
状态转换通过以下API触发:
Mirror_Init()
:将模块从未初始化状态转为已初始化状态Mirror_DeInit()
:将模块从已初始化状态转为未初始化状态Mirror_Offline()
:将模块从在线状态切换到离线状态
4.2 源总线状态
源总线具有自己的状态管理机制:
- 源总线停止状态:源总线未被监控
- 源总线启动状态:源总线被激活并开始监控
- CAN源启动:监控CAN总线数据
- LIN源启动:监控LIN总线数据
- FlexRay源启动:监控FlexRay总线数据
源总线状态通过以下API管理:
Mirror_IsSourceNetworkStarted()
:检查源总线是否已启动Mirror_StartSourceNetwork()
:启动指定源总线Mirror_StopSourceNetwork()
:停止指定源总线
Bus Mirroring模块支持同时启动多个源总线,每个源总线可以独立控制。
4.3 目标总线状态
目标总线状态表示当前激活的镜像目标:
- 无目标总线:未设置目标总线
- CAN目标:将数据镜像到CAN总线
- FlexRay目标:将数据镜像到FlexRay总线
- IP目标:将数据镜像到IP网络
- CDD目标:将数据镜像到自定义设备驱动
目标总线状态通过以下API管理:
Mirror_GetDestNetwork()
:获取当前目标总线Mirror_SwitchDestNetwork()
:切换到指定目标总线
在任一时刻,只能有一个活跃的目标总线。
5. 协议数据结构
5.1 镜像协议帧
镜像协议帧用于将源总线数据传输到目标总线(主要用于FlexRay、IP和CDD目标总线):
图5.1 Bus Mirroring 协议数据结构
镜像协议帧由两部分组成:
-
协议头部
ProtocolVersion
:协议版本号SequenceNumber
:序列号HeaderTimestamp
:头部时间戳DataLength
:数据长度
-
数据部分
Timestamp
:数据项时间戳- 标志位字段:
NetworkStateAvailable
:网络状态是否可用FrameIDAvailable
:帧ID是否可用PayloadAvailable
:负载是否可用
NetworkType
:网络类型(CAN、LIN、FlexRay)NetworkID
:网络IDNetworkState
:网络状态(依赖网络类型)FrameID
:帧ID(依赖网络类型)PayloadLength
:负载长度Payload
:实际负载数据
5.2 状态协议帧
状态协议帧用于CAN目标总线,针对CAN总线带宽限制进行了优化:
-
状态协议头部
ProtocolVersion
:协议版本号
-
状态数据项
- 标志位字段:
NetworkStateAvailable
:网络状态是否可用FrameIDAvailable
:帧ID是否可用
NetworkType
:网络类型NetworkID
:网络IDNetworkState
:网络状态FrameID
:帧ID
- 标志位字段:
相比镜像协议帧,状态协议帧更简洁,占用更少带宽。
5.3 特定总线数据结构
不同总线类型的数据结构有所不同:
-
CAN网络状态
BusOff
:总线关闭标志Warning
:警告标志Passive
:被动标志
-
LIN网络状态
SleepPending
:睡眠挂起标志Error
:错误标志
-
FlexRay网络状态
ChannelA_Sync
:通道A同步状态ChannelB_Sync
:通道B同步状态ChannelA_Running
:通道A运行状态ChannelB_Running
:通道B运行状态
-
帧ID结构
- CAN帧ID:包含扩展ID标志和ID值
- LIN帧ID:8位ID值
- FlexRay帧ID:包含通道、循环计数器和帧ID
这些数据结构设计确保了协议的灵活性和扩展性。
6. API接口
6.1 功能分类
Bus Mirroring模块提供了一组结构良好的API,按功能可分为以下几类:
图6.1 Bus Mirroring API结构
-
通用功能
- 初始化函数
- 版本信息函数
-
过滤器处理
- 过滤器管理函数
-
状态处理
- 状态管理函数
-
支持功能
- 辅助函数
-
回调通知
- 回调函数
-
调度函数
- 周期执行函数
6.2 主要接口
-
初始化接口
Mirror_Init(config)
:初始化模块Mirror_DeInit()
:去初始化模块Mirror_GetVersionInfo(versioninfo)
:获取版本信息
-
状态管理接口
Mirror_IsMirrorActive()
:检查镜像功能是否激活Mirror_Offline()
:关闭镜像功能Mirror_GetDestNetwork()
:获取当前目标网络Mirror_SwitchDestNetwork(network)
:切换目标网络Mirror_IsSourceNetworkStarted(network)
:检查源网络是否已启动Mirror_StartSourceNetwork(network)
:启动源网络Mirror_StopSourceNetwork(network)
:停止源网络
-
过滤器接口
Mirror_GetStaticFilterState(network, filterId)
:获取静态过滤器状态Mirror_SetStaticFilterState(network, filterId, state)
:设置静态过滤器状态Mirror_AddCanRangeFilter(network, lower, upper)
:添加CAN范围过滤器Mirror_AddCanMaskFilter(network, mask, value)
:添加CAN掩码过滤器Mirror_AddLinRangeFilter(network, lower, upper)
:添加LIN范围过滤器Mirror_AddLinMaskFilter(network, mask, value)
:添加LIN掩码过滤器Mirror_AddFlexRayFilter(network, frameid, channel)
:添加FlexRay过滤器Mirror_RemoveFilter(filterId)
:移除过滤器
-
辅助接口
Mirror_GetNetworkType(network)
:获取网络类型Mirror_GetNetworkId(type, handle)
:获取网络IDMirror_GetNetworkHandle(id)
:获取网络句柄
6.3 回调函数
模块使用回调函数从底层驱动接收帧数据:
-
帧接收回调
Mirror_ReportCanFrame(network, canid, data, dlc)
:报告CAN帧Mirror_ReportLinFrame(network, linid, data, dlc)
:报告LIN帧Mirror_ReportFlexRayFrame(network, frameid, channel, cc, data, len)
:报告FlexRay帧Mirror_ReportFlexRayChannelStatus(network, channel, status)
:报告FlexRay通道状态
-
传输回调
Mirror_TxConfirmation(pduId)
:传输确认回调Mirror_TriggerTransmit(pduId, data)
:触发传输回调
-
调度函数
Mirror_MainFunction()
:主功能周期执行
这些回调函数构成了模块与底层驱动之间的接口。
7. 总结
AUTOSAR Bus Mirroring模块是一个强大的诊断工具,通过将内部总线流量和状态镜像到外部总线,为开发人员提供了对汽车网络系统进行调试和监控的能力。
主要优势
-
灵活性
- 支持多种源总线类型(CAN、LIN、FlexRay)
- 支持多种目标总线类型(CAN、FlexRay、IP、CDD)
- 可同时监控多个源总线
-
效率
- 提供多种过滤器机制,优化带宽使用
- 针对不同目标总线优化协议格式
- 支持动态配置过滤器
-
安全性
- 通过诊断命令启用,确保安全访问
- 完善的状态管理机制
- 错误处理和分类机制
-
完整的API
- 结构良好的功能分组
- 丰富的控制接口
- 回调函数支持
Bus Mirroring模块作为AUTOSAR经典平台的一部分,展示了AUTOSAR架构的灵活性和可扩展性,为汽车电子系统开发提供了强大的支持工具。通过该模块,开发人员可以更有效地对复杂的总线系统进行调试和诊断,提高开发效率和系统质量。