| 编辑推荐: |
本文主要主要介绍了AUTOSAR通信栈全家桶:COM、PduR、CanIf、CanDrv到底谁负责什么等相关内容。希望对你的学习有帮助。
本文来自于微信公众号老司机的智驾工程笔记,由火龙果软件Alice编辑,推荐。 |
|
前言
刚接触AUTOSAR的时候。
很多新人都有过这样的经历。
打开代码。
看到:
心想:
“原来CAN发送这么简单。”
结果继续往下跟。
发现:
-
COM
-
↓
-
PduR
-
↓
-
CanIf
-
↓
-
CanDrv
-
↓
-
CAN Controller
|
瞬间懵了。
于是开始产生灵魂拷问:
COM是什么?
PduR干什么的?
CanIf和CanDrv有什么区别?
为什么发一个CAN报文要经过这么多层?
今天我们就用最容易理解的方式,把AUTOSAR通信栈讲清楚。
先看结论
如果把CAN发送比作快递。
那么:
-
COM = 打包员
-
PduR = 快递分拣中心
-
CanIf = 快递网点
-
CanDrv = 快递员
-
CAN控制器 = 快递车
|
理解这句话。
你已经掌握50%了。
一个车速信号是怎么发送出去的?
假设:
应用层有个车速信号:
需要发送到CAN总线。
应用层调用:
从这一刻开始。
通信栈开始接管。
第一站:COM
COM模块全称:
Communication Module
很多新人以为:
COM负责发CAN报文。
其实不准确。
COM负责的是:
信号管理
例如:
一个CAN报文ID:
里面可能有:
-
VehicleSpeed
-
VehicleGear
-
VehicleMode
-
VehicleState
|
四个信号。
COM负责:
可以理解成:
快递打包员
应用层说:
COM负责:
形成:
-
CAN ID = 0x100
-
Data:
-
64 03 00 01 00 00 00
00
|
然后交给下一层。
COM到底长什么样?
图1:COM负责信号与报文转换
第二站:PduR
PduR全称:
PDU Router
协议数据单元路由器。
新人第一次看到这个名字:
实际上:
PduR就是路由器
它根本不关心数据内容。
它只关心:
例如:
COM发来一个PDU。
PduR可能决定:
或者:
或者:
所以:
PduR是整个AUTOSAR通信栈的交通指挥中心。
看图。
图2:PduR路由中心
第三站:CanIf
CanIf全称:
CAN Interface
CAN接口层。
这里是新人最容易搞混的地方。
很多人分不清:
到底有什么区别。
记住一句话:
CanIf负责统一接口
CanDrv负责操作硬件
例如:
主机厂今天使用:
明天换:
如果应用直接调用驱动。
整个项目都要修改。
CanIf的作用就是:
屏蔽底层差异。
对于上层来说:
永远只看到:
底层换什么芯片。
完全无感知。
这就是经典的软件解耦思想。
CanIf就像快递网点
快递到了网点。
网点不会亲自送货。
它只负责:
真正送货的是下面的快递员。
第四站:CanDrv
CanDrv:
CAN Driver
驱动层。
终于来到最底层了。
CanDrv负责:
-
配置寄存器
-
配置Mailbox
-
发送报文
-
接收报文
-
处理中断
|
这里已经开始接触硬件。
对于TC397来说。
CanDrv会操作:
控制器。
对于S32K来说。
CanDrv会操作:
控制器。
所以:
CanDrv是真正干活的人。
看图。
图3:CanIf与CanDrv关系
最后一站:CAN控制器
CanDrv调用硬件。
最终进入:
然后发送到:
这时候。
另一台ECU就能收到数据。
整个发送流程
把前面内容串起来。
一个车速信号发送过程:
-
Application
-
↓
-
COM
-
↓
-
PduR
-
↓
-
CanIf
-
↓
-
CanDrv
-
↓
-
CAN Controller
-
↓
-
CAN Bus
|
是不是突然清晰很多?
接收流程呢?
发送和接收其实正好相反。
CAN控制器收到报文:
-
CAN Controller
-
↓
-
CanDrv
-
↓
-
CanIf
-
↓
-
PduR
-
↓
-
COM
-
↓
-
Application
|
看图。
图4:Can通信完整收发链路
为什么AUTOSAR要设计这么多层?
新人最常问:
因为汽车软件最大的敌人:
不是性能。
而是复杂度。
想象一下。
一个域控制器:
-
500+
-
CAN信号
-
100+
-
CAN报文
-
几十个功能模块
|
如果所有模块直接操作驱动。
项目半年就会失控。
AUTOSAR通过分层:
- COM负责信号
- PduR负责路由
- CanIf负责接口
- CanDrv负责硬件
每层只干一件事。
整个系统才有可能维护十年以上。
新人应该怎么学通信栈?
推荐顺序:
第一步:
理解完整数据流。
不要背规范。
第二步:
重点学习:
第三步:
学会跟踪一个报文。
从:
一路跟到:
当你能独立追踪一次完整通信链路。
通信栈基本就入门了。
写在最后
很多人学习AUTOSAR通信栈。
最大的误区就是:
背模块。
实际上:
通信栈不是模块集合。
而是一条数据流。
记住今天这句话:
- COM负责打包。
- PduR负责路由。
- CanIf负责统一接口。
- CanDrv负责操作硬件。
当你真正理解这四层。
AUTOSAR通信栈的大门才算真正打开。
|