针对E2E 数据校验目前存在2种方式,如下
E2E Lib + E2E PW: 采用这种方式的校验E2E_Check接口将返回E2E PXX Status(例子可参见E2E PXX Status Estimation) ,App 需要自行根据返回的E2E PXX Status来判断采取什么Action , 对于这种组合在AUTOSAR 4.3 之后就不再采用了
E2E Lib +E2EXf+ E2ESM: 对于AUTOSAR 4.3 之后的版本都将采用这种组合,和前面提到的那种方式相比这种方式提供了滑动窗和动态判断“错误”的机制,使得APP 不用自己去技术和实现机制来完成一些功能
比如: 我们要判断5 次里有3次CRC 错误,我们就采取措施,如果采用E2E Lib + E2E PW 方式。APP 需要自行实现这个滑动窗动态监测机制,但是在E2E Lib +E2EXf+ E2ESM模式下只需要配置对应的属性即可完成
NOTE: 虽然E2E Lib +E2EXf+ E2ESM 可以减少APP的实现,但是需要相关人员对于这套组合具有非常好的理解才行。相比E2E Lib + E2E PW 虽然实现简单了,但是配置复杂度增加了
E2E Xf 处理流程
本文将结合Prefile 5 &1 来介绍E2E Lib +E2EXf+ E2ESM:究竟怎么理解,怎么做
Profile 5
Important Attribute
MaxDeltaCounter:
最大容忍Rolling Cnt 的变化数,对于E2E 中的Rolling Cnt我们希望他是线性变化的,因此如果连续两条的Rolling Cnt的变化值如果>1,则考虑有报文丢失,对于丢失报文的容忍度为(MaxDeltaCounter-1)帧报文。
Window Size:
只用最后N条报文对应的OkCount and ErrorCount参与评估E2ESM State
(详细内容见OkCount and ErrorCount Calculation 章节)
MaxErrorStateInit/ MaxOkStateInit:
在E2E SM_INT 状态下用于比较OkCount /ErrorCount的门限值
MaxErrorStateValid/ MaxOkStateValid:
在E2E SM_Valid 状态下用于比较OkCount /ErrorCount的门限值
MaxErrorStateInvalid/ MaxOkStateInvalid:
在E2E SM_Invalid 状态下用于比较OkCount /ErrorCount的门限值
E2E P05 Status Estimation
E2E_P05STATUS_OK: CRC 验证成功且 DaltaCounter =1, 即数据没有任何丢失且CRC 验证成功
E2E_P05STATUS_OKSOMELOST: CRC 验证成功,但是Rolling Cnt不连续且在容忍范围内(<=MaxDeltaCounter)即丢(MaxDeltaCounter-1)帧数据可接受
E2E_P05STATUS_REPEATED: 当DaltaCounter =0 ,即收到的Rolling Cnt和上一条一致
E2E_P05STATUS_WRONGSEQUENCE : DaltaCounter > MaxDeltaCounter 时&& DaltaCounter >=0 ,即丢失报文超过认为范围内,或者Rolling Cnt并非线性增加 (如果最后收到的Rolling Cnt比之前的小(除去扣圈特列)也会触发这个Error,)
E2E_P05STATUS_ERROR:当CRC 校验错误
E2E_P05STATUS_NONEWDATA :并未收到数据
P05Status and CheckStatus Mapping
E2E Check Status | E2E P05 Status |
E2E_P_OK | E2E_P05STATUS_OK E2E_P05STATUS_OKSOMELOST |
E2E_P_ERROR | E2E_P05STATUS_ERROR |
E2E_P_REPEATED | E2E_P05STATUS_REPEATED |
E2E_P_NONEWDATA | E2E_P05STATUS_NONEWDATA |
E2E_P_WRONGSEQUENCE | E2E_P05STATUS_WRONGSEQUENCE |
OkCount and ErrorCount Calculation
直接看实现吧 ,比较容易解释。其中 errorCounter对应的就是CRC 错误。注意报文丢失并不会增加errorCounter。报文丢失数的容忍度只和MaxDeltaCounter 有关
E2ESM State Judgement
E2ESM 分为如下状态
E2E_SM_NODATA:E2E SM 初始化状态
E2E_SM_INIT: 只要收到过1帧CRC验证成功的报文就会转换为此种状态,一般只的就是第一帧验证成功的E2E报文
E2E_SM_VALID: 见下图流转
E2E_SM_INVALID: 见下图流转
E2ESM Status
0x01(E_SAFETY_VALID_REP)
0x02 (E_SAFETY_VALID_SEQ)
0x03 (E_SAFETY_VALID_ERR)
0x05 (E_SAFETY_VALID_NND)
0x20 (E_SAFETY_NODATA_OK)
0x21 (E_SAFETY_NODATA_REP)
0x22 (E_SAFETY_NODATA_SEQ)
0x23 (E_SAFETY_NODATA_ERR)
0x25 (E_SAFETY_NODATA_NND)
0x30 (E_SAFETY_INIT_OK)
0x31 (E_SAFETY_INIT_REP)
0x32 (E_SAFETY_INIT_SEQ)
0x33 (E_SAFETY_INIT_ERR)
0x35 (E_SAFETY_INIT_NND)
0x40 (E_SAFETY_INVALID_OK)
0x41 (E_SAFETY_INVALID_REP)
0x42 (E_SAFETY_INVALID_SEQ)
0x43 (E_SAFETY_INVALID_ERR)
0x45 (E_SAFETY_INVALID_NND)
Example
例子1:如果丢失5 帧报文,则需要采取特殊Action:
分析:这里的丢失5 帧报文,只有MaxDeltaCounter会影响到这个功能,按照上面介绍需要把MaxDeltaCounter设置为6,由于ErrorCounter 只是针对CRC 错误,因此在这个里我们需要检测各个E2E SM STATE 中的 WongSequence State
App 代码处理
If(ret== E_SAFETY_VALID_SEQ ||
ret== E_SAFETY_NODATA_SEQ||
ret== E_SAFETY_INIT_SEQ||
ret== E_SAFETY_INVALID_SEQ)
{
// Action
}
例子2:如果连续2帧CRC 错误,则需要采取特殊Action
分析:因为是CRC 错误,所以需要考虑ErrorCounter,由于是连续2帧,也就是最后2帧,因此需要使用window size :2
因此可将MaxErrorStateInit/ MaxErrorStateInvalid/ MaxErrorStateValid 设置为 2(ErrorCounter)-1 =1,那么在任何E2E SM 状态只要出现连续两帧CRC 错误就会导致E2E SM 状态切换为INVALID
App 代码处理
if(rte == E_SAFETY_INVALID_ERR))
{
// Action
}
例子3:如果5帧出现3帧CRC 错误,则需要采取特殊Action
分析:因为是CRC 错误,所以需要考虑ErrorCounter,由于是5帧出现3帧,需要使用window size :5,由于只有3帧出现错误时才会采取行为因此
因此可将MaxErrorStateInit/ MaxErrorStateInvalid/ MaxErrorStateValid 设置为 3-1 =2,那么在任何E2E SM 状态只要5帧出现3帧CRC 错误就会导致E2E SM 状态切换为INVALID
If(ret == E_SAFETY_INVALID_ERR))
{
// Action
}
Profile 1
未列出的内容和Profile 5 一致
Important Attribute
MaxDeltaCounter:
最大容忍Rolling Cnt 的变化数,对于E2E 中的Rolling Cnt我们希望他是线性变化的,因此如果连续两条的Rolling Cnt的变化值如果>1,则考虑有报文丢失,对于丢失报文的容忍度为(MaxDeltaCounter-1)帧报文。
MaxNoNewOrRepeatedData:
如果收到的Rolling Cnt并未发生变化,则NoNewOrRepeatedData 所对应的cnt+1, 当超多预定义的MaxNoNewOrRepeatedData时,在某些情况会返回E2E_P01STATUS_SYNC 状态
SyncCounterInit
当收到数据重复数量达到最大值之后(MaxNoNewOrRepeatedData),即使再次收到正确的数据也不能立即返回E2E_STATUS_OK or E2E_STATUS_OKSOMELOST,此时需要返回E2E_P01STATUS_SYNC, 当连续几个数据(SyncCounterInit)都正确才会返回E2E_STATUS_OK or E2E_STATUS_OKSOMELOST,
Window Size:
只用最后N条报文对应的OkCount and ErrorCount参与评估E2ESM State
(详细内容见OkCount and ErrorCount Calculation 章节)
MaxErrorStateInit/ MaxOkStateInit:
在E2E SM_INT 状态下用于比较OkCount /ErrorCount的门限值
MaxErrorStateValid/ MaxOkStateValid:
在E2E SM_Valid 状态下用于比较OkCount /ErrorCount的门限值
MaxErrorStateInvalid/ MaxOkStateInvalid:
在E2E SM_Invalid 状态下用于比较OkCount /ErrorCount的门限值
E2E P01 Status Estimation
E2E_P01STATUS_OK: CRC 验证成功且 DaltaCounter =1, 即数据没有任何丢失且CRC 验证成功
E2E_P01STATUS_OKSOMELOST: CRC 验证成功,但是Rolling Cnt不连续且在容忍范围内(<=MaxDeltaCounter)即丢(MaxDeltaCounter-1)帧数据可接受
E2E_P01STATUS_INITIAL:第一次收到E2E 报文且CRC校验通过
E2E_P01STATUS_SYNC:
当收到数据重复数量达到最大值之后(MaxNoNewOrRepeatedData),即使再次收到正确的数据也不能立即返回E2E_STATUS_OK or E2E_STATUS_OKSOMELOST,此时需要返回E2E_P01STATUS_SYNC, 当连续几个数据(SyncCounterInit)都正确才会返回E2E_STATUS_OK or E2E_STATUS_OKSOMELOST
NOTE: 正常情况当我们收到一个E2E Frame ,只要对应的CRC校验通过后,那么收到的Rolling Cnt就会被采用,即下一帧期望收到的Rolling Cnt 为本次值+1, 但是如果SyncCounterInit >0 ,当收到的DeltaCounter > MaxDeltaCounter ,则并不会采用收到的Rolling Cnt, 意味一旦这种情况出现,需要等待Rolling Counter“扣圈” 发生,即当再次DeltaCounter < MaxDeltaCounter满足时,才会进行“重同步”
E2E_P01STATUS_REPEATED: 当DaltaCounter =0 ,即收到的Rolling Cnt和上一条一致
E2E_P01STATUS_WRONGSEQUENCE : DaltaCounter > MaxDeltaCounter 时&& DaltaCounter >=0 ,即丢失报文超过认为范围内,或者Rolling Cnt并非线性增加 (如果最后收到的Rolling Cnt比之前的小(除去扣圈特列)也会触发这个Error,)
E2E_P05STATUS_ERROR:当CRC 校验错误
E2E_P05STATUS_NONEWDATA :并未收到数据
P01Status and CheckStatus Mapping
E2E Check Status | E2E P05 Status |
E2E_P_OK | E2E_P01STATUS_OK E2E_P01STATUS_OKSOMELOST E2E_P01STATUS_INITIAL |
E2E_P_ERROR | E2E_P01STATUS_ERROR |
E2E_P_REPEATED | E2E_P01STATUS_REPEATED |
E2E_P_NONEWDATA | E2E_P01STATUS_NONEWDATA |
E2E_P_WRONGSEQUENCE | E2E_P05STATUS_WRONGSEQUENCE E2E_P01STATUS_SYNC |