AUTOSAR实战干货:如何提高车载以太网性能
附赠自动驾驶最全的学习资料和量产经验:链接
前言
本文思维大纲如下:
在车载以太网开发过程中,我们最为常见的应用层协议主要是SOMEIP与DOIP两大类协议,其中SOMEIP协议作为实现SOA架构的一种重要实现手段被广泛应用,DOIP协议则针对大文件的刷写场景,大大提高了刷写效率。
特别对于SOMEIP协议作为涉及到整个系统多方交互的重要协议,随着域集中式不断发展,其通信带宽瓶颈也是日趋紧张, 这里指的通信带宽瓶颈更多的指的是SOMEIP应用的最大吞吐量。只要最大吞吐量提高了,那么车载以太网带宽利用率也就上去了,通信带宽瓶颈问题也就能够解决。
本文主要聚焦如何进一步提高基于SOMEIP应用的整体车载以太网性能,目前主要从如下几个方面进行展开优化,以便能够大大提高车载以太网性能:
-
物理层优化;
-
数据链路层优化;
-
网络层优化;
-
传输层优化;
-
SOMEIP应用层优化;
1. 物理层优化方向
1.1 提高物理层通信带宽能力
我们都知道车载以太网的PHY需要与对应的MAC层速率相匹配,如果MAC最大通信速率仅为100Mbps,那么其与之匹配的物理层芯片PHY最大仅需满足100Mbps即可。
如果MAC层最大支持1000Mbps,那么此时的PHY则同步需要设置成1000Mbps,才能够大大提高物理层通信带宽能力。
当前需要注意的是在整车情况下,如果ECU A设置成1000Mbps,但是对手件仅为100Mbps,在使能自协商的前提下那么最终协调的通信速率将仅为100Mbps,则大大降低了整个系统的通信带宽。
因此,对于整车以太网设计而言,应当针对通信数据需求场景,合理的设计好通信带宽,无需过多,够用即可。如果一味的追求高带宽而不考虑应用场景的需求,那么就会无形中增加成本,对产品竞争力造成影响。
如下图所示为几种不同通信速率下的MAC与PHY芯片的组合场景:
-
车载以太网MAC层与PHY层两者通信速率要确保设置一致,最大通信速率取决于MAC层与PHY层之间共同能够达到的最大值;
-
一般对于整车通信而言,为了减少车载以太网通信双方Linkup时间,一般都会关闭自协商,统一强制设置好Master与Slave,通信速率以及双工模式等;
2. 数据链路层(MAC)优化方向
2.1 使能DMA传输
以英飞凌TC3XX芯片为例,其芯片内部的Eth MAC层存在DMA机制,该DMA完全处于Eth控制器内部,与外部的DMA无关,通过使能多通道DMA机制,可以大大提高通信速率并确保高优先级报文能够优先发送。
Tx DMA通道及优先级配置:
Rx DMA通道及优先级配置:
2.2 设置硬件最大传输效率
以英飞凌TC3XX芯片为例,看看如何修改并设定MAC层最大通信速率,其他芯片类似,可调整设定成最大传输效率1000Mbps,即1Gbps:
3. 网络层(IP)优化方向
3.1 使能硬件CRC计算
对于网络层我们发送数据是需要需要针对IP层数据进行组包同时需要进行CRC计算,我们知道如果包较长的话,那么CRC耗时就会变长,当前英飞凌TC3XX系列芯片MAC层支持IP层硬件CRC计算功能,这样IP层软件层的CRC可以不用计算,直接在MAC硬件中直接计算即可。
在AUTOSAR Eth Driver 规范中就有关于CRC Offloading的这种软件需求,如下图所示:
英飞凌TC3XX系列Eth Driver中的CRC Offloading使能配置如下:
在使能底层MAC硬件自身的CRC计算能力之后,软件层的TCP/IP协议栈各协议层的CRC计算也需要关闭掉,否则就无法真正发挥底层硬件的功能了,如下所示:
注意事项:使能其中一个时,四个均需要同时使能,这个可能是硬件特性导致,也是跟AUTOSAR规范有些偏差的地方,不过为了提高性能,全部使能也没啥大问题。
4. 传输层(TCP/UDP)优化方向
4.1 减少数据拷贝
对于TCP或者UDP层可能会存在一些数据拷贝的地方,针对这些数据拷贝,一般会有如下两种思路:
-
是不是必须要数据拷贝,有没有零拷贝方案,因为对于以太网这种上千字节的拷贝是很花时间的,应该尽可能做到零拷贝,除了必要的组包跟解包以外;
-
如果无法避免数据拷贝,需要考虑源地址与目标地址是否在CPU取值效率最高的地方,比如TC397的DSPR就会比LMU区域快很多,因尽可能将源地址与目标地址均放入到DSPR中;
-
如果无法避免数据拷贝,看看是否可以采用单指令多操作数方式(SIMD)方式来实现Memcpy动作,应该也在一定程度上能够加速数据拷贝。
4.2 使能硬件CRC计算
同3.1小节,一并使能TCP以及UDP报文的硬件CRC计算功能,关闭软件CRC计算特性,这样CPU就可以做更多的事情,也不会接收到无效报文的中断。
5. SOMEIP应用层优化方向
5.1 优化序列化算法
SOMEIP应用中有一个必须要做的步骤就是序列化,但是我们都知道对于SOMEIP而言,特别是报文长度达到1400左右个字节的时候,序列化所花费的时间就会非常长,因此需要优化序列化算法,一般可以从如下几个方面入手进行优化:
-
优化内存对齐方式,这个需要结合芯片架构特性来决定,比如当前MCU为32bit,那么采用4字节对齐则更为合适,采用1字节对齐则会增加系统处理时间,影响序列化效率;
-
采用更为高效的序列化算法,如Protobuf或者Nanopb等方式来进行序列化,能够在某种程度上提高序列化水平,同时能够实现跨平台的数据解析功能;
5.2 采用结构体对齐方式序列化
- 不进行SOMIP特有的序列化,采用结构体对齐的方式来进行序列化,不过这个对于结构体的良好设计会有些要求,当然也会增加较多填充字符,影响每次传输过程中的有效带宽;