CanNm报文的触发发送详解

admin 2024年10月14日17:30:11评论34 views字数 3782阅读12分36秒阅读模式

前言

在《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报文是如何发送的。

目录

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模块的参与。

CanNm报文的触发发送详解

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

CanNm报文的触发发送详解

CanNm报文的触发发送详解

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.)

CanNm报文的触发发送详解

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数据。

CanNm报文的触发发送详解

3.2. CanNm_Transmit

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

CanNm报文的触发发送详解

3.3. CanNm Transmission Sequence

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

CanNm报文的触发发送详解

4.CanIf模块的触发发送

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

CanNm报文的触发发送详解

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数据。

CanNm报文的触发发送详解

CanNm报文的触发发送详解

CanIf模块提供了CanIfTriggerTransmitSupport CanIfTxPduTriggerTransmit

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

CanNm报文的触发发送详解

CanNm报文的触发发送详解

5.Can Driver模块的触发发送

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

CanNm报文的触发发送详解

CanNm报文的触发发送详解

6.总

6.1. CanNm获取User Data方式1

Condition:

CanNmComUserDataSupport ==TRUE &&

CanNmUserDataEnabled ==TRUE &&

NmComUserDataSupport ==TRUE &&

NmUserDataEnable ==TRUE &&

CanIfTriggerTransmitSupport ==TRUE &&

CanIfTxPduTriggerTransmit ==TRUE&&

CanTriggerTransmitEnable ==TRUE

CanNm报文的触发发送详解

6.2. CanNm获取User Data方式2

Condition:

CanNmComUserDataSupport ==TRUE &&

CanNmUserDataEnabled ==TRUE &&

NmComUserDataSupport ==TRUE &&

NmUserDataEnable ==TRUE &&

CanIfTriggerTransmitSupport == FALSE&&

CanIfTxPduTriggerTransmit == FALSE&&

CanTriggerTransmitEnable ==FALSE

CanNm报文的触发发送详解

问题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

原文始发于微信公众号(汽车电子嵌入式):CanNm报文的触发发送详解

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月14日17:30:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CanNm报文的触发发送详解https://cn-sec.com/archives/3263929.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息