1. 简介
E2E 保护的概念:
保护运行时安全相关的数据交换,免受通信链路内故障的影响。
造成故障可能的原因包括:
- 硬件随机故障(CAN Trcv 的寄存器故障)
- 硬件EMC干扰
- 软件设计/运行故障
为了保证接收端 能够接收到正确的数据,或者在收到错误的数据时能够进行识别。
2. E2E P01 介绍
E2E 模块提供了多种不同的E2E 范式,可以运用在不同的场景下。
- 1.E2E P01
- 2.E2E P02
- 3.E2E P04
- 4.E2E P05
- 5.E2E P06
- 6.E2E P07
- 7.E2E P11
- 8.E2E P12
数字越大,可以保护的数据量越大。
E2E 是通过对数据元素计算CRC 以及Counter 来进行保护,接收方在根据接收到数据来判断是否正确
以报文DBC为例,在下图中受保护的数据实际是Signal ADCU_ACC_SYS_FAILURE
但实际报文中还有Counter 以及 CheckSum 和DATA ID(报文ID)
Counter 值随着报文的发送计数,Checksum 根据 DATA ID +Rollingcnt+ ADCU_ACC_SYS_FAILURE 计算得出。
2.1 P01 特性
P01的主要特性如下
- 1.Counter的阈值 是0-14
- 2.Timeout 监控
- 3.DATA ID 16位
- 4.CRC 采用 CRC-8-SAE J1850(非AUOTSAR 标准CRC8, 起始值和异或值都是0x0)
Note: 有些主机厂的规范并不会按照AUTOSAR规范来实施,按需要修改代码即可。
2.2 E2E_P01ConfigType 介绍
E2E P01 通过E2E_P01ConfigType 以适配不同的被保护数据元素,如下图
E2E 保护数据的都是以数组的形式体现(连续的Bit位),如下图
因此需要通过E2E_P01ConfigType 来进行对应参数的配置
- 1.CounterOffSet Counter 的起始Bit 位
- 2.CrcOffset CRC 值的起始Bit 位
- 3.DataIDNibbleOffset DataID 的起始Bit 位
- 4.DataIDMode ID的CRC计算模式,有如下选项
4.1 E2E_P01_DATAID_BOTH DATA ID 两个Byte 都参与CRC计算
4.2 E2E_P01_DATAID_ALT 奇数Counter.Low Byte 参与计算,偶数Counter High Byte 参与计算
4.3 E2E_P01_DATAID_LOW 仅Low Byte 有效
4.4 E2E_P01_DATAID_NIBBLE Low Byte 参与CRC计算,高Byte的半个Byte+Low Byte 随着数据传递
5. MaxDeltaCounterInit 当前后两帧数据的Counter差值大于该值,就被判定为数据接收跳变
5. MaxnoNewOrRepeatedData 当接收到重复数据次数小于该配置参数,则接收端不需要执行数据同步处理
6. SyncCounterInit 当执行数据同步处理时,接收到正确数据次数必须大于该配置参数,才能将状态有同步状态转移到OK状态
2.3 E2E_P01CheckStateType 介绍
4 E2E 的接口
E2E 主要利用两个接口进行数据的保护和验证
- 1.E2E_P01Protect 用于数据发送前的保护
- 2.E2E_P01Check 用于数据接收后的校验
5 E2E 故障状态
E2E P01通过 E2E_P01CheckStatusType 来表示当前E2E的状态。
一共有一下几个故障状态
E2E_P01MapStatusToSM
将 E2E_P01CheckStateType 映射成 E2E_P01CheckStateType
E2E Data Layout
E2E受保护的数据中所有的元素应保证Byte对齐
6 E2E 使用示例
E2E 最典型的使用场景就是配合Com Tx /Rx Callout 进行报文的E2E计算与校验。
ComCallout E2E 发送
ComCallout E2E 接收
Com_ReceiveSignalGroup(SignalGroupA); Com_ReceiveSignal(SignalGroupA_Sig1, &SignalGroupBuffer->sig1Val); Com_ReceiveSignal(SignalGroupA_Sig2, &SignalGroupBuffer->sig2Val); Com_ReceiveSingal(SignalGroupA_Sig3, &SignalGroupBuffer->sig3Val); ret_u8 = E2E_P01Check ( Config_SignalGroupA , State_SignalGroupA , SignalGroupBuffer );