CanNm报文的触发发送详解

文摘   2024-11-07 07:08   上海  

前言

在《Can/Lin报文的触发发送(Trigger Transmit)》一文中我们介绍了报文(Can, Lin)的触发发送机制Trigger Transmit,在《AUTOSAR架构下CanNm User Data详解》一文中我们介绍了CanNm User Data的使用方法。而CanNm的报文就是可以以trigger transmit方式触发发送,且和CanNmUser data强相关,所以,本文就来详细介绍下CanNm报文的发送方式,并回答以下问题:

问题1CanNm通过以下哪个API外发CanNm报文?

CanNm_Transmit

CanNm_TriggerTransmit

CanIf_Transmit

以及CanNm_TransmitCanNm_TriggerTransmit用来干嘛的?

问题2CanNm User Data的触发方式获取有什么好处?

由于CanNm报文的发送和Com, PduR, CanIf, Can Driver模块都相关,所以,我们先介绍这些相关模块和CanNm报文发送相关的内容,然后结合实际AUTOSAR实现方案(Vector, Etas)看实际项目中CanNm报文是如何发送的。

目录


注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!

正文

1.Com模块的触发发送

背景知识1:通过《AUTOSAR架构下CanNm User Data详解》一文我们知道,CanNm报文的User Data可以通过SWC --> Com_SendSignal的方式来设置(也就是通过Com模块来更新CanNmUser Data),也可以通过Cdd直接调用CanNm_SetUserData的方式来设置(不用经过Com模块),本文假设通过Com模块来设置User Data,也就是需要Com模块的参与。

 


背景知识2User通过SWC --> Com_SendSignal只会设置User DataCom模块的缓存,CanNm模块通过调用PduR_CanNmTriggerTransmit -> Com_TriggerTransmit主动从Com模块拿取User Data数据。


2.PduR模块的触发发送

PduR模块应通过调用Com_TriggerTransmit,将通信接口模块发出的PduR_CanNmTriggerTransmit 请求转发到上模块。


也就是CanNm模块通过PduR模块将触发发送请求路由到Com模块。


问题:为什么不直接通过CanNm -> Com模块获取User Data了,而是要通过一个感觉多月的PduR模块了?


:因为Autosar是一套通用的架构,Com模块不仅仅单独为CanNm模块服务,比如Lin报文的发送也是触发发送模式,也需要通过Lin -> PduR -> Com来获取PDU数据。所以,设计一个中间路由模块PduR, 可以通过PduR将底层模块路由到任意上层模块。


Lower Module(Com, Cdd e.g.) -> PduR -> Upper Module (Can, Lin, Eth e.g.)



3.CanNm模块的触发发送

3.1. CanNm_TriggerTransmit()

Case 1:  (CanNmComUserDataSupport == TRUE) && (CanIfTxPduTriggerTransmit == FALSE)


  • Step 1: CanNm_Mainfunction -> PudR_CanNmTriggerTransmit -> Com_TrggerTransmit 获取User Data数据。

  • Step 2:  CanNm_Mainfunction -> CanIf_Transmit(PduIdType TxPduId, const PduInfoType* PduInfoPtr )发送CanNm报文。

注意PduInfoPtr-> SduDataPtr != NULL


Case 2:  (CanNmComUserDataSupport == TRUE) && (CanIfTxPduTriggerTransmit == TRUE)


Step 1:CanNm_Mainfunction -> CanIf_Transmit(PduIdType TxPduId, const PduInfoType* PduInfoPtr ) -> Can_Write(). 发送数据。

注意PduInfoPtr-> SduDataPtr ==NULL


Step2: Can_Write() -> CanIf_TriggerTransmit() -> CanNm_TriggerTransmit() -> PudR_CanNmTriggerTransmit -> Com_TrggerTransmit()获取User Data数据。



3.2. CanNm_Transmit

通常情况下,CanNm处于RepeatMessage State或者NormalOperation State的时候会外发NM报文,且其报文周期是固定的。如果有其他User调用了CanNm_Transmit,则会触发NM报文的发送。



3.3. CanNm Transmission Sequence

CanNm报文的发送都是通过CanNm_Mainfunction调用CanIf_Transmit,但是会根据CanIfTxPduTriggerTransmit配置参数来决定PduInfo -> SduDataPtr指针参数是否为空,从而决定User Data数据的获取方式。



4.CanIf模块的触发发送

如果CanIfTxPduTriggerTransmit配置参数为TRUE, 上层调用CanIf_TransmitPduInfo -> SduDataPtr指向参数应该为NULL指针。


Conditions:  (CanNmComUserDataSupport == TRUE) && (CanIfTxPduTriggerTransmit == TRUE)

  • Step 1:CanNm_Mainfunction -> CanIf_Transmit(PduIdType TxPduId, const PduInfoType* PduInfoPtr ) -> Can_Write(). 发送数据。


注意PduInfoPtr ==NULL


  • Step2: Can_Write() -> CanIf_TriggerTransmit() -> CanNm_TriggerTransmit() -> PudR_CanNmTriggerTransmit -> Com_TrggerTransmit()获取User Data数据。



CanIf模块提供了CanIfTriggerTransmitSupport CanIfTxPduTriggerTransmit

配置参数类配置报文的触发发送。



5.Can Driver模块的触发发送

如果CanTriggerTransmitEnable配置为TRUE且上层模块(CanIf_Transmt)传递的PduInfo -> SduDataPtrNULL, Can_Write会调用CanIf_TriggerTransmmit来获取要发送的PDU数据.




6.总

6.1. CanNm获取User Data方式1

Condition:

CanNmComUserDataSupport ==TRUE &&

CanNmUserDataEnabled ==TRUE &&

NmComUserDataSupport ==TRUE &&

NmUserDataEnable ==TRUE &&

CanIfTriggerTransmitSupport ==TRUE &&

CanIfTxPduTriggerTransmit ==TRUE &&

CanTriggerTransmitEnable ==TRUE



6.2. CanNm获取User Data方式2

Condition:

CanNmComUserDataSupport ==TRUE &&

CanNmUserDataEnabled ==TRUE &&

NmComUserDataSupport ==TRUE &&

NmUserDataEnable ==TRUE &&

CanIfTriggerTransmitSupport == FALSE &&

CanIfTxPduTriggerTransmit == FALSE &&

CanTriggerTransmitEnable ==FALSE



问题1CanNm通过以下哪个API外发CanNm报文?

CanNm_Transmit

CanNm_TriggerTransmit

CanIf_Transmit

以及CanNm_TransmitCanNm_TriggerTransmit用来干嘛的?


CanNm通过CanIf_Transmit来发送CanNm报文。User可以调用CanNm_Transmit触发Nm报文的发送;以6.2中的方式2发送CanNm报文时通过CanNm_TriggerTransmit来获取user data数据。


问题2CanNm User Data的触发方式获取有什么好处?


:可以在Can Driver也就是硬件发送CanNm报文的时候获取user data的数据,能最实时的将user data的数据发送到Can总线上。注意:只有6.2章节中的方式2才是真正意义上的触发发送方式。



End


谦益行
分享汽车研发日常,助力你我共同成长。
 最新文章