AutoSar Com模块

文章目录

  • Com模块功能
  • 通信传输控制
  • [整体 communication 结构](#整体 communication 结构)
  • [Signal 发送流程](#Signal 发送流程)
  • [Signal 发送时序图](#Signal 发送时序图)
  • [Signal 接收流程](#Signal 接收流程)
    • [接收信号的 UpdateBit](#接收信号的 UpdateBit)
  • [Signal 接收时序图](#Signal 接收时序图)
  • [Com_TxPduInfo / Com_RxPduInfo、Com_PduGrpVector 数据来源](#Com_TxPduInfo / Com_RxPduInfo、Com_PduGrpVector 数据来源)
  • [Com_TxSigGrpInfo / Com_RxSigGrpInfo](#Com_TxSigGrpInfo / Com_RxSigGrpInfo)
    • [1. Signal Group 概念](#1. Signal Group 概念)
    • [2. Com_TxSigGrpInfo / Com_RxSigGrpInfo](#2. Com_TxSigGrpInfo / Com_RxSigGrpInfo)
  • I-PDU、N-PDU、L-PDU关系

Com模块功能

Com 模块为汽车控制单元中的应用软件提供了一个统一的通信环境, 为内部和外部通信定义了公共的软件通信接口, 增强了汽车控制单元中应用软件模块的可移植性。

通信传输控制

Com 模块控制 I-Pdu 数据的接收和发送, 在系统网络状态激活以后可由 BswMCDD 模块调用 Com 提供的 Com_IpduGroupControl 服务函数控制 I-PduGroup 是否需要激活, 只有在 I-PduGroup 的状态为激活 状态时, 对应的 I-Pdu 才能进行数据的接收和发送。

通信传输控制主要实现以下功能点:

  1. 可将 I-Pdu 按照不同的功能或者不同的通道划分到不同的 I-PduGroup 中, 在启动 I-PduGroup 时对应该组内的所有 I-Pdu 才能进行数据的接收和发送。
  2. 可通过调用 Com_IpduGroupControl 服务函数将信号缓存数据设置为初始值。
  3. 可通过调用 Com_SetIpduGroup 服务函数控制单个 I-PduGroup 的激活状态。
  4. 可通过调用 Com_ClearIpduGroupVector 服务函数将所有的 I-PduGroup 状态设置为未激活状态, 停止报文的接收和发送处理。

整体 communication 结构

communication 自上到下,数据的传递过程是:

ASW --> RTE--> COM --> PDUR --> CANTP --> CAN Interface --> CAN Driver --> CAN controller --> CAN transceiver --> CAN BUS Line

  1. Com 模块获取应用层的信号(Signal),经一定处理封装为 IPDUInteraction Layer Protocol Data Unit)发送到 PduR 模块;

  2. PduR 根据路由协议中所指定的 I-PDU 目标接收模块,将接收到的 I-PDU 经一定处理后发送给 CanIfPduR 也可以将部分I-PDU 发送给 CAN TP 模块,处理之后再发送给 CANIf

  3. CanIf 将信号以 L-PDUData Link Layer Protocol Data Unit)的形式发送给 CAN 驱动模块;

  4. CAN 驱动模块将 Message 报文发送给 CAN controller

  5. CAN controller 与外部硬件的 CAN transceiverCAN 收发器) 进行 CAN 报文的收发;

  6. 外部硬件 CAN 收发器-- CAN Transceiver Hardware主要工作内容为,接收 CAN bus 上的网络信息(通常叫做 CAN Frame)相关的信号电平并将其转化为逻辑信息电平转发给CAN Controller , 接收从CAN Controller 传输过来的逻辑电平信息并将其转化为信号电平传从到 CAN bus 上。CAN Transceiver 有两条线,一条连CAN 总线的高电平,一条低电平;

Signal 发送流程

NeuSar 为例,梳理 signal 更新发送流程:

  1. NeuSar 中,每一个 signal 都有一个 buffer 用来存储数据
  2. 调用 Rte_Write_XXX_XXX 更新 RTE Signal 的全局变量,并调用 Com 层接口
  3. 调用 Com_SendSignal(SignalId, SignalDataPtr) -> Com_SendSignal_Process(SignalId, SignalDataPtr) ; 将需要发送的信号值,保存到相应 signalbuffer
  4. task 中周期调用 Com_MainFunctionTx(void) -> Com_PduTxProcess(com_astPdu) ,在 Com_PduTxProcess 中根据 PDU 的发送触发方式,进行相应处理
  5. 以 周期 触发为例,调用 Com_PduPeriodicTxProcess(PduInfo, PduCycle) -> Com_PduCycleSend(PduInfo, PduCycle) -> Com_OnePduSend(PduInfo) -> Com_PduTxSetVal(PduInfo) ,调用 Com_PduTxSetVal ( PduInfo ) 把信号值放入 PDU 中(Com_TxPduInfo[txSigInfoPtr->acPduId].dataraw 这个指针指向存储 PDU 数据的地址)
  6. 调用 PduR_ComTransmit(PduId, PduInfo) -> PduR_UpTransmit(PduId, PduInfo) -> PduR_Route_LoTransmit(dstPduPtr, pduInfoPtr) ,在调用 PduR_Route_LoTransmit 中,根据路由通道不同,可以选择 CanIf 或者 CanTp 两种方式。
  7. CanTp 为例:CanTp_Transmit(CanTpTxSduId, CanTpTxInfoPtr) -> CanTp_Transmit_WithData(CanTpTxSduId, CanTpTxInfoPtr, ErrorId), 在 CanTp_Transmit_WithData 函数中,将 I-PDU 数据封装成 N-PDU 数据(增加 帧类型、长度、目的地址等信息)
  8. CanTp_TxStateTask(CanTpTxSduId, TRUE:代表使用数据) , 调用 CanTp_TxStateTask 发送数据,根据 CAN 类型不同,选择 Can 2.0 或者 CanFd,继续封装 N-PDU 信息
  9. CanIf_Transmit(CanIfTxSduId, CanIfTxInfoPtr) -> CanIf_Transmit_Process(txPduPtr, pduInfoPtr) -> CanIf_TxQueueFilling(txPduPtr, pduInfoPtr, sduLen, canId) ,在 CanIf_TxQueueFilling 中将待发送的数据写入 Can Driver 的数据缓冲区内
  10. Can Driver 成功发送报文,通过 CanIf_TxConfirmation 函数回调通知 CanIf
  11. CanIf 通过调用 PduR_CanIfTxConfirmation -> PduR_LoTxConfirmation 回调通知 PduR 发送成功
  12. PduR 调用 PduR_Route_UpTxConfirmation -> Com_TxConfirmation 通知 Com 层发送成功
  13. Com 通过发送消息确认来调用 Com_TxPduClearUb_Process 清除更新位。如果该 signal 绑定了回调函数,则执行回调函数,执行相关操作

设置信号的 UpdateBit

Update BitCom 信号或信号组数据更新位, 在通信矩阵中以一个信号形式存在, 占用 1 个 bit, 当信号数据发送时将 Update Bit 值设置为 1, 发送完成后将 Update Bit 设置为 0。

UpdateBit 作为判断信号或信号组数据是否被更新的标志,可通过配置项 ComUpdateBitPosition 进行配置 UpdateBit 在该 I-Pdu 所在的位置,用户在调用 Com 提供的发送服务接口函数时将信号对应的 Update Bit 设置为更新状态。

信号对应 UpdateBit 的清除, 根据该信号所在的 I-Pdu 配置项 ComTxIPduClearUpdateBit 配置的清除方式进行清除。
UpdateBit 的清除方式如下:

  1. Confirmation: 在 Com 模块调用 PduR 提供的 I-Pdu 发送服务接口函数 PduR_ComTransmit 时, 且收到发送完成确认(Com_TxConfirmation) 后进行清除。
  2. Transmit: 在 Com 模块调用 PduR 提供的 I-Pdu 发送服务接口函数 PduR_ComTransmit 时, 且发送成功后进行清除。
  3. TriggerTransmitPduR 模块调用 Com 提供的回调函数 Com_TriggerTransmit, 在调用成功后进行清除。

信号的超时处理

Com 发送信号的超时监控, 用于监控信号是否在配置的超时时间内发送完成。 在一个 I-Pdu 内的所有信号如果配置不同的超时监控时间, 则根据该 I-Pdu 内信号配置的最小超时时间进行计算。

I-Pdu 的超时监控在调用 PduR 发送数据服务接口函数时启动, 在接收到发送完成确认后该周期的 I-Pdu 发送超时监控结束, 如果 Com 监控到 I-Pdu 发送超时, 可根据信号配置的 ComTimeoutNotification 回调函数将超时状态通知给 Rte 层。

信号的传输方式

Com 模块可通过 ComTransferProperty 配置项配置发送模式, 详细模式配置如下:

发送模块 PERIODIC(周期) DIRECT(触发) MIXED
PENDING 当用户请求信号的发送时, 不会立即触发对应的 I-Pdu 发送, 只能根据 I-Pdu 配置的发送周期进行周期性发送。
TRIGGERED I-Pdu 进 行 周 期发送 在信号有发送请求时, I-Pdu 会触发发送一次。 如果ComTxModeNumberOfRepetitions配置了重复发送次数, 且配置ComTxModeRepetitionPerio 重复发送周期, 则进行周期触发发送 I-Pdu 进行周期和触发发送
TRIGGERED_WITHOUT_REPETITION I-Pdu 进 行 周 期发送 I-Pdu 只会触发发送一次 I-Pdu 触发发送一次,然后继续按照周期进行发送
TRIGGERED_ON_CHANGE I-Pdu 进 行 周 期发送 当信号数据与上次发送的信号数据的值或长度不同时, 触发发送一次。 如果 ComTxModeNumberOfRepetitions 配置了重复发送次数, 且配置ComTxModeRepetitionPerio 重复发送周期, 则进行周期触发发送 I-Pdu 进行周期和触发发送
TRIGGERED_ON_CHANGE_WITHOUT_REPETITION I-Pdu 进 行 周 期发送 当信号数据与上次发送的信号值或长度不同时, 触发发送一次 I-Pdu 进行周期和触发发送

Signal 发送时序图

时序图较大,查看时可以在图片上右键选择 "在新标签页中打开图片"

Signal 接收流程

NeuSar 为例,梳理 signal 接收流程:

  1. Can 驱动模块接收到报文会调用接口 CanIf_RxIndication 通知 CanIf 模块
  2. 在通过所有过滤器和验证检查后,成功接收到发送给 CanIfCAN Rx LPDU ,调用 CanIf_RxIndication_ProcessPDU 进行解析
  3. CanIf 调用 PduR_CanIfRxIndication -> PduR_LoRxIndication 回调函数,将数据上传到 PduR
  4. 调用 PduR_Route_UpRxIndication ,表示收到下层通信接口模块的 I-PDU。即,当 PduR_<Lo>RxIndication 被调用时,PDU Router 模块将为每个目的上层模块调用 <Up>_RxIndication
  5. 调用 Com_RxIndication ,通知 Com ,表示收到下层通信接口模块的 I-PDU
  6. 调用 Com_RxIndicationProcess 处理 I-PDU 数据
  7. 调用 Com_RxSignalAnalysis_Process 解析信号,调用 Com_RxSigRead_Normal 获取解析出来的 Signal 值,再根据数据类型调用 Com_RxSigUbInvFilterProcessI8 或其他对应函数将接收到的数据存储在 Com_RxSignalInfo[sigIdx].sigRTEValue
  8. 调用 Com_RxSigNotification_Handle 回调函数,通知 RTE 接收完成,更新 RTE 层的 全局变量
  9. 通过 RTE 接口调用 Rte_Read_XXX_XXX 函数,内部再调用 Com_ReceiveSignal -> Com_ReceiveSignal_Process ,将存储在 RX BuffSignal 值赋给 RTE 中的全局变量

接收信号的 UpdateBit

如果接收的信号或者信号组配置有对应的 UpdateBit 数据更新位, Com 先解析对应 UpdedateBit 对应的信号数据, 如果 UpdedateBit 为 1, 代表对应的信号数据有更新并进行解析。

Signal 接收时序图

Com_TxPduInfo / Com_RxPduInfo、Com_PduGrpVector 数据来源

配置 COM 模块,需要导入 DBC 文件

一般来说,一个 DBC 文件中含有多个 Node;一个 PDU 相当于一个 message,而 COM 模块由多少个 PDU ,与导入 DBC 时选择的 Main Node 有关。

BMS 节点为例:

Node Tx Messages 有10个,Rx Messages 有2个,所以

c 复制代码
extern CONST(COM_TxPduInfo_st, COM_CONFIG_DATA) Com_TxPduInfo[COM_TXPDU_NUM]; // COM_TXPDU_NUM = 10
extern CONST(COM_RxPduInfo_st, COM_CONFIG_DATA) Com_RxPduInfo[COM_RXPDU_NUM]; // COM_RXPDU_NUM = 10

Node 下,Tx Messages 共有 29 个 signalRx Messages 共有 4 个 signal,所以

c 复制代码
extern CONST(COM_TxSignalInfo_st, COM_CONFIG_DATA) Com_TxSignalInfo[COM_TXSIG_NUM];  // COM_TXSIG_NUM = 29
extern CONST(COM_RxSignalInfo_st, COM_CONFIG_DATA) Com_RxSignalInfo[COM_RXSIG_NUM]; // COM_RXSIG_NUM = 4

Com_TxSigGrpInfo / Com_RxSigGrpInfo

1. Signal Group 概念

Com 模块控制 I-Pdu 数据的接收和发送, 在系统网络状态激活以后可由 BswMCDD 模块调用 Com 提供的 Com_IpduGroupControl 服务函数控制 I-PduGroup 是否需要激活, 只有在 I-PduGroup 的状态为激活状态时, 对应的 I-Pdu 才能进行数据的接收和发送。

多个 Signal 可以组成一个 Signal Group。一个 Signal Group 中只能包含同一消息中的 Signal

从下面可以看出,信号组和普通信号的图标不同

下面问答参考:https://www.elecfans.com/d/1936426.html

  1. 问题1:什么是Signal Group,为什么要用Signal Group?
  • 答:为了支持复杂数据类型的AUTOSAR概念,AUTOSAR COM提供了信号组的解决方案。AUTOSAR COM模块一致地发送和接收信号组,为复杂数据类型提供必要的一致性。通俗的来讲,Signal Group就是一个IPDU里面的几个Signal的集合,这几个Signal的操作需要保持一致性(也就是如果外部发送方有对这几个数据中一个或多个数据有改动,那么接收方也需要同时更新,比如车道线的一阶参数、二阶参数、三阶参数、常数项是4个不同的Signal,这4个Signal就需要保持一致性,不然到最后仪表上画出来的车道线就会偶发的和实际不一样)。
  1. 问题2:什么是Shadow buffer,Shadow buffer机制为什么能保证数据的一致性?
  • 答:本来COM模块为每个Rx SignalRx Signal都设有一个Signal Buffer的,Signal数据的收发都通过这个Signal来实现。如果Signal GroupCOM模块为每个Signal Group又额外设置了一片Signal Group Buffer,这片Buffer就是所谓的Shadow buffer。在发送Signal Group的时候,将Signal Group拷贝到IPDU Buffer的时候是原子操作(也就是拷贝前关闭全局中断,拷贝后打开全局中断,保证拷贝过程不被中断干扰)保证了Signal Group数据的一致性。
  1. 问题5:RTE在获取一个Signal时,如果这个Signal属于一个Signal Group,那么Signal的值从Signal的buffer获取还是Shadow buffer获取?
  • 答:从Shadow buffer中获取。

2. Com_TxSigGrpInfo / Com_RxSigGrpInfo

COM_TXGRP_NUMCOM_RXGRP_NUM 分别表示发送和接收信号组的个数

c 复制代码
extern CONST(COM_TxSigGrpInfo_st, COM_CONFIG_DATA) Com_TxSigGrpInfo[COM_TXGRP_NUM + 1U];
extern CONST(COM_RxSigGrpInfo_st, COM_CONFIG_DATA) Com_RxSigGrpInfo[COM_RXGRP_NUM + 1U];

I-PDU、N-PDU、L-PDU关系

更多参考:https://blog.csdn.net/initiallizer/article/details/130040286

  • L-PDU:对应链路层的PDU,一般来说,我们称接口层(Interface,XX_If)为链路层,比如:CanIf、FlexrayIf等。更确切地说是 Driver和Interface 构成链路层。

  • N-PDU:网络层对应的 PDU,一般来说,我们称传输层(Transport,XX_Tp)为网络层,比如:CanTp、FlexrayTp等。

  • I-PDU:交互层(表示层)对应的 PDU

XX_If以上模块的信息交互依赖 I-PDUXX_IfXX_Tp模块的交互依赖 N-PDU

一般来说,小数据传输时,用XX_If;大数据传输时,用XX_Tp。所以,在诊断的多帧传输时,XX_Tp层会将多个N-PDU缓存,直到一个完整的I-PDU接收完,之后通过 PduR送给DCM ,即:I-PDU = n * N-PDU(n是大于1的正整数)。

相关推荐
酷酷的boy31 分钟前
AUTOSAR下网络时间(CAN)与本地 RTC 同步。
autosar·汽车电子
AUTOSAR组织16 天前
AUTOSAR CP NvM 模块解析
汽车·autosar·软件架构·软件·标准
赞哥哥s20 天前
2025年终总结简版
autosar
汽车软件工程师00122 天前
ChatGpt指导嵌入式软件开发能力——2、TriCore深度专项训练
人工智能·chatgpt·autosar
汽车软件工程师00125 天前
ChatGpt指导嵌入式软件开发能力
人工智能·chatgpt·autosar
汽车软件工程师00125 天前
vector autosar,CAN 总线上能看到报文RTE 收不到信号COM 层 IPDU Callout 不触发
autosar
汽车软件工程师00125 天前
vector autosar配置一个CAN接收报文,RTE层发现并未接收到信号,怎样查这个问题
开发语言·autosar
Dotrust东信创智1 个月前
汽车安全通信的行业标准密码-E2E
e2e·autosar·preevision
yuanmenghao1 个月前
Linux 性能实战 | 第 8 篇 上下文切换、内核线程与调度延迟
linux·服务器·性能优化·autosar
linweidong1 个月前
AUTOSAR Adaptive中应用容器Crash如何恢复?
嵌入式·autosar