[Classic AUTOSAR学习] Bus Mirror 总线消息镜像
发布网友
发布时间:1天前
我来回答
共1个回答
热心网友
时间:12小时前
Bus Mirror模块在AUTOSAR 4.4版本规范中被设计用于从不同总线收集消息,复制后转发至目标总线,主要应用于将内部通信消息镜像至外部总线,方便上位机进行调试。转发过程为单向,避免消息循环。底层软件需要确保ComMChannel不同时属于MirrorSourceNetwork和MirrorDestNetwork,以保证模块正常运行。
Bus Mirror模块支持多种转发场景,包括过滤源总线的消息以避免目标总线负载过高。LIN和CAN(FD)消息被原封不动转发至CAN(FD)总线,但可能需要映射到新ID以避免ID冲突。LIN消息的PID总是映射至CAN ID,而数据则原样转发。当消息转发至FlexRay、以太网或CDD时,会根据协议封装在更大的消息中。转发至FlexRay时,仅支持小于目标FlexRay消息大小的帧。
基本使用流程包括初始化模块、分配周期调用MainFunction以及激活源总线以开始收集消息。在初始化完成之后,Bus Mirror模块处于非激活状态,需激活源总线以开始消息收集。生成对应arxml文件,包含接口,用于打开镜像通道,并配置Network ID。停止SourceNetworks操作会停止收集,已收集消息继续转发。离线或切换目标总线时,所有配置的过滤条件失效。
切换目标总线需调用Mirror_SwitchDestNetwork接口。此操作会导致源总线失效,静态配置过滤条件失效,动态过滤条件移除,等待发送的消息被丢弃,确保只有预期消息被发送到新目标总线,避免过载。静态过滤条件停用或动态过滤条件移除后,已接收但未发出的消息仍会继续发送。
Bus Mirror模块支持CAN、LIN、FlexRay作为源总线,通过与相应总线接口模块交互获取消息和状态信息,进行过滤后镜像至目标总线。以CAN通信为例,与CanIf模块交互获取CAN消息,并在满足过滤条件后进行转发。同样,LIN通信通过获取消息和状态信息,设置Mask或ID范围过滤条件实现转发。FlexRay通信则通过slotID范围和周期等信息实现消息转发。
当向FlexRay、以太网等总线进行镜像时,会将多个长度较小的消息封装在一个大的FlexRay/以太网消息中发送。镜像后消息包含头部信息,如协议版本、序列号、时间戳和数据长度等。序列号从0开始,每新增并发送一个目标消息,序列号加1。时间戳从Stbm模块获取,数据长度指头部信息后所有数据长度的总和。每个数据包含时间戳、网络状态、消息ID、payload长度等字段,其中网络状态、消息ID和payload长度在转发网络状态变化信息时可以省略。
目标总线为CAN总线时,收到的CAN/LIN消息会被直接转发,可能需要映射CAN ID以避免ID冲突。映射列表在配置工具中配置,支持ID-ID映射或ID Mask-ID映射。所有要从目标总线上发出的消息按队列方式处理,队列大小由MirrorDestQueueSize决定。如果队列满,Bus Mirror会丢弃消息并设置错误代码MIRROR_E_QUEUE_OVERRUN。当前一次发送未确认成功时,不会发送下一条消息。若设置MirrorStatusCanId,则在源总线状态变化时,Bus Mirror会创建消息发送总线状态。