前言
在《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:通过《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数据。
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.)
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处于RepeatMessage State或者NormalOperation State的时候会外发NM报文,且其报文周期是固定的。如果有其他User调用了CanNm_Transmit,则会触发NM报文的发送。
CanNm报文的发送都是通过CanNm_Mainfunction调用CanIf_Transmit,但是会根据CanIfTxPduTriggerTransmit配置参数来决定PduInfo -> SduDataPtr指针参数是否为空,从而决定User Data数据的获取方式。
如果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
配置参数类配置报文的触发发送。
如果CanTriggerTransmitEnable配置为TRUE且上层模块(CanIf_Transmt)传递的PduInfo -> SduDataPtr为NULL, 则Can_Write会调用CanIf_TriggerTransmmit来获取要发送的PDU数据.
Condition:
CanNmComUserDataSupport ==TRUE &&
CanNmUserDataEnabled ==TRUE &&
NmComUserDataSupport ==TRUE &&
NmUserDataEnable ==TRUE &&
CanIfTriggerTransmitSupport ==TRUE &&
CanIfTxPduTriggerTransmit ==TRUE &&
CanTriggerTransmitEnable ==TRUE
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
「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」
点击文章最后左下角的阅读原文可以获取更多信息
或者复制如下链接到浏览器获取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.为便于技术交流,创建了汽车电子嵌入式技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入;
注:本文引用了一些第三方工具和文档,若有侵权,请联系作者删除!
推荐阅读
汽车电子嵌入式精彩文章汇总第一期:20210530-20230703
汽车电子嵌入式精彩文章汇总第2期
汽车电子嵌入式精彩文章汇总第3期
【OS】AUTOSAR OS Event实现原理
【OS】AUTOSAR OS Spinlock实现原理(下篇)
【OS】AUTOSAR OS Spinlock实现原理(上篇)
CanNm处于PBS状态下接收到一帧诊断报文DCM会响应吗
TC3xx芯片CAN模块详解
AUTOSAR OS Alarm实现原理
AUTOSAR OsTask切换原理
TC3xx 芯片SPI模块详解
AUTSOAR ComStack如何实现PDU只收不发的
AUTOSAR OsStack监控原理
AUTOSAR架构下ICU唤醒详解
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号