AUTOSAR 在 CAN 上的处理与我们传统的使用还是有比较大的差异,过去我们写 CAN的代码,也就是写了 CAN 基本的 Tx 和 Rx 驱动,收到原始 8 个 bytes 的数据后,进行什么处理或者在哪一层处理都由自己随意来定,有的甚至 8bytes 数直接在 APP 层用建模进行解析处理,这种情况也不少见,也没有不对。而 AUTOSAR 出于解耦,隔离及统一接口的因素考虑,将 CAN 做了多个层次的处理,不再只是一个底层驱动+应用层(或增加一个中间层)。
下面是 AUTOSAR 常见的介绍:
红框部分是和通讯相关的内容,包含 LIN,CAN,Eth 等,我们重点介绍 CAN。和汽车领域中大家熟知的,和 CAN 相关最重要的三部分就是诊断、标定及 COM。
我们来看 AUTOSAR 中的分层和数据走向:
CAN 在不同的层次的数据包分为了
- 数据链路层:L-PDU,link pdu
- 网络层(通常用的是 TP 层):N-PDU,network pdu
- 交互层:I-PDU,interaction pdu
可以看到 CAN Driver 和 CAN Interface 部分 COM,XCP,UDS 仍然是共用的,再往上
就有不同的分支: - UDS 需要通过 TP 层,再进入 PDUR 进行分配进入 DCM
- XCP 相对独立直接由 CAN interface 进入后独立处理,不经过 PDUR
- COM 则从 CAN Interface 进入 PDUR 然后分配至 COM
是否已经被各种 PDU 弄蒙圈了,下面是 PDU 和 PDUR 的官方解释,一起来理解一下:
简单的说,PDU 中包含地址信息(当前层和目标层的地址信息)和数据信息,PDUR通过地址信息分配到不同的目标地。
包含 PCI 和 SDU,PCI 包含源地址和目标地址信息,SDU 是数据信息。
在我们关注的CAN传输中最关键的信息I-PDU,I-PDU并不是某一层单独所有的信息,
也不是 CAN 单独所有的内容,可以看出 I-PDU 是进出 PDUR 的信息。而 I-PDU是包含地址信息和数据信息的。
最后拿大家最关注的 COM 来说明各层的数据走向,以收取报文来举例:由 CAN Driver收取报文生成 L-PDU,而后进入 CAN Interface 进行抽象隔离处理,生成 I-PDU,进入 PDUR
进行分配,根据地址信息(PCI)将进入 COM 模块的 I-PDU 传入 COM,COM 对 I-PDU 的数据信息 SDU 进行解析,生成 signals,signals 通过 RTE 传输给 APP 层,发送则正好相反。