ECU 应用层软件模型之CAN报文接收数据流12

文摘   2024-12-24 07:03   上海  

当我做应用层软件开发时,想着要搞清楚与应用层软件交互的底层软件内容,不忘这个初心,因此在初步介绍了ECU应用层模型的CAN报文信号处理,我必须要揭秘下CAN报文数据是如何从底层软件传输到应用层模型/软件的。

1 CAN报文的接收过程

其实之前文章也有介绍过:

简单回顾下CAN报文的接收过程:

  1. BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Read函数;CAN Driver模块的Can_MainFunction_Read函数将访问CAN控制器的寄存器,比如仲裁寄存器,数据寄存器和数据长度寄存器等,并读取其数据;
  2. 数据读取结束后调用CAN Interface模块的CanIf_RxIndication函数,将数据从CAN Driver模块传给了上一层的CAN Interface模块,CAN Interface模块再调用PduR模块的PduR_RxIndication函数,将数据传到PduR模块;PduR模块路由到Com模块,调用Com_RxIndication函数,将数据传到Com模块,Com模块将会把数据存入其缓存。
  3. 应用层软件/模型通过RTE接口获取Com模块缓存的数据。
这是CAN报文接收的控制流,而数据流呢?

个人认为本质上是三个关键变量:报文ID, 报文数据长度和报文数据。大致如下的数据形式体现:

source: https://blog.csdn.net/bruce_qee/article/details/118740124

从图来看,数据形式并不简单,但我们可以简单化,从PDU来了解。

2 PDU SDU和PCI

在AUTOSAR中,用PDU(Protocol Data Unit)、SDU(Service Data Unit)和PCI(Protocol Control Information)来描述不同层次之间的数据交换机制。

协议数据单元 PDU是由服务数据单元 SDU和协议控制信息 PCI的组成。SDU 是上下层数据传递过程中的纯数据单元,可以理解为CAN数据帧(报文)中的数据域,PCI 是含有源地址和目的地址信息等控制信息,可以理解为CAN数据帧中的控制域。一个PDU就是一组完整有明确含义的信息。如下图所示:

source: AUTOSAR Layer

PDU根据ISO的分层又有明确的称谓,在数据链路层传递的PDU为L-PDU,在网络层传递的PDU为N-PDU,在交互层传递的PDU为I-PDU。基于AUTOSAR架构,CAN通讯相关的PDU如下所示:

怎么理解这些PDU?通过一个国际快递的例子来了解PDU的传输过程。

假设你托朋友在国外买了几罐奶粉,然后你朋友去DHL邮寄,邮寄地址为:中国上海嘉xx路xx弄 某某 手机号18888888888。由于DHL到国内转EMS,那么DHL打印贴包裹的快递单信息:


当快递到达上海,按照约定DHL转国内EMS,这时根据原始邮寄地址,EMS快递单信息如下:

注:这里对于EMS来说,源头是DHL的单号1,即单号1与单号2有映射关系
当快递到了邮政营业点,营业点为了方便管理,根据XX路来新编号,比如对于同一条路采用从1开始编号,这时快递员不会根据单号2去派件,而是根据新编号去派件。

注:这里对于编号来说,源头是EMS的单号2,即单号2与编号有映射关系
这样一个从寄快递到派件完成的过程,就如同一个PDU的过传输过程,大致对应关系是:

了解了PDU、SDU和PCI的概念,以及L-PDU,I-PDU和N-PDU之后,我们再回归到CAN报文接收的数据。

3 CAN报文的PDU 

了解PDU的概念之后,对应到CAN报文,其实可以这样来理解,PCI主要包括CAN数据帧的仲裁段和部分控制段,对应着CAN ID,而SDU主要包括部分的控制段和数据段,对应着CAN报文的长度和数据,如下所示:

source: 可以混合使用Classical CAN格式和CAN FD格式的诊断报文吗?

对于每增加一条CAN接收或发送的报文,需要在不同的模块增加相应的配置,分别要在COM、PDUR、CANIF、CAN层添加报文相关内容如下示意:

source: ISOLAR中手动添加Can报文(ETAS工具链)_etas导入重复canid
这里,我们把关注点还是放在PDU上,因为它们报文数据从CAN层往上传输,或者从应用层软件往下传输的数据载体,就以AUTOSAR架构中的CAN通信函数为例,会涉及到多个关键函数用于处理数据的收发。
以下是其中有关的重要函数说明,比如通知 CanIf 模块收到报文及对应报文的信息函数CanIf_RxIndication,其中Mailbox提供 HRH,CAN 控制器 ID,CAN ID 等信息,PduInfoPtr提供接收数据的首地址与数据长度信息,如下所示:
再比如在将调用CanIf_RxIndication函数之前,访问CAN控制器的寄存器,提取CAN报文数据时,即调用ExtractData函数,注意两个变量类型也是CAN_HWType和PduInfoType这两个结构体类型,如下所示:

所以理解好PDU的概念,将会很有利于理解CAN报文数据是如何从CAN驱动层传输到应用层软件/模型。

4 小结

本文没有讲解ECU应用层软件模型开发,而是扩展了CAN报文的接收过程,主要与底层软件相关,掌握好PDU的概念将很有助于理解CAN通讯的数据流。
为什么写这篇文章,初心还是希望咱在做模型开发或应用层软件开发时,视野仅仅局限于于此,可以做了一些扩展,以此能够更好地理解自己在应用层软件所实现的内容,在整个功能起到了什么作用,有什么影响,以此建立一个全局的视野和系统的认识,更好地回归到应用层软件开发。

创作不易,欢迎点赞再看收藏关注


汽车研发交流群,有兴趣的朋友请添加群主:prOmiseyes,备注:公司+职务入群。仅限汽车从业人员。


ECU 应用层软件模型系列文章不断更新中,从零开始教你做应用层开发:

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