前言
在《Can/Lin报文的触发发送(Trigger Transmit)》一文中我们介绍了报文(Can, Lin)的触发发送机制Trigger Transmit,在《AUTOSAR架构下CanNm User Data详解》一文中我们介绍了CanNm User Data的使用方法。而CanNm的报文就是可以以trigger transmit方式触发发送,且和CanNm的User data强相关,所以,本文就来详细介绍下CanNm报文的发送方式,并回答以下问题:
问题1:CanNm通过以下哪个API外发CanNm报文?
CanNm_Transmit
CanNm_TriggerTransmit
CanIf_Transmit
以及CanNm_Transmit和CanNm_TriggerTransmit用来干嘛的?
问题2:CanNm 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模块来更新CanNm的User Data),也可以通过Cdd直接调用CanNm_SetUserData的方式来设置(不用经过Com模块),本文假设通过Com模块来设置User Data,也就是需要Com模块的参与。
背景知识2:User通过SWC --> Com_SendSignal只会设置User Data在Com模块的缓存,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_Transmit的PduInfo -> 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 -> SduDataPtr为NULL, 则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
问题1:CanNm通过以下哪个API外发CanNm报文?
CanNm_Transmit
CanNm_TriggerTransmit
CanIf_Transmit
以及CanNm_Transmit和CanNm_TriggerTransmit用来干嘛的?
答:CanNm通过CanIf_Transmit来发送CanNm报文。User可以调用CanNm_Transmit触发Nm报文的发送;以6.2中的方式2发送CanNm报文时通过CanNm_TriggerTransmit来获取user data数据。
问题2:CanNm User Data的触发方式获取有什么好处?
答:可以在Can Driver也就是硬件发送CanNm报文的时候获取user data的数据,能最实时的将user data的数据发送到Can总线上。注意:只有6.2章节中的方式2才是真正意义上的触发发送方式。
End