E2E(end to end)是autosar规范里规定的一种用于保证数据传输正确的概念,属于功能安全范畴。
下面的例子可以简单介绍E2E的工作机制,假设汽车内有两个ECU,A和B,两个节点之间通过CAN总线进行通信,A节点要将某一安全相关的数据(比如汽车车速信号,油门踏板信号等)传给B节点,这里我们假定车速信号VehSpeed = 0x1157,如果采用E2E概念对这个车速数据进行保护,那么实际上A除了要发给B上边VehicleSpeed数据之外,还要将CRC和Counter传给B,B在接受到数据之后也会计算出CRC然后将其和收到的进行比较,B会根据校验的结果进行下一步操作。
![6fbc90123cd4ae24a2cc25ed2418c16a.png](https://i-blog.csdnimg.cn/blog_migrate/b17ae5559bef41bdea900a09b2b7b410.png)
那么现在的问题就是已知数据Data=0x1157,计算出CRC、Counter。
按照Autosar规范的要求,E2E存在一系列的Profile(配置)每种配置在计算CRC时有各自的机制、参数、数据格式,具有非常强的灵活性,用户可以根据实际需要选择配置1,或者配置2,目前本人接触的仅有Profile1,所以我们只讨论Profile1 (⊙﹏⊙)
Profile1的一些属性:CRC,Counter,Timeout monitoring,Data ID
CRC:对数据进行多项式除法计算后的余数
Counter:用于计数每次增加1,A将计数值发给B,B可以依据收到的counter值确定是否接收及时。
Timeout monitoring:用来评价Counter是否丢失延时等。
DataID:一个A和B提前定好的特殊数字,一般是16bits,按照E2E_P01DataIDMode 的不同分为1A,1B,1C三种细分的配置,计算CRC时对DataID做不同处理。
在考虑上述Autosar要求后,我们要计算CRC的数据最终可写为Data = {0x09,0x00,0x00,0x57,0x11};这里我们假定DataID=0x0009,VehSpeed低8位放到数组靠前位置。
![acebfc8f207c7f39e04410fa00116082.png](https://i-blog.csdnimg.cn/blog_migrate/e07aedcdb86286a1dd0d11e1ffb67aa0.png)
总结一下就是下面的过程
1.将counter放入Data
2.将DataID(16bits)按照一定规则放入Data
3.计算Data的CRC值
4.将counter增加1
关于CRC计算,CRC可以理解为多项式做除法后的余数,按照除数的不同可以分类为CRC-8,CRC-16,CRC-32等,看了一下大概好几十种。Autosar E2E profile 1 规定采用CRC-8-SAE J1850 ,对应多项式
下面图片显示了二进制除法采用多项式计算0x57: CRC=0x8D的过程,实际上0x57按照不同的传输顺序分为两种Msbit-first(01010111)Lsbit-first(11101010)这里只计算Msbit-first的情况。此外这里数学不是太好不太明白为什么后边添加了8个padded bits,但是观察下来猜测若要计算CRC-3要padded 3 bits?CRC-16要padded 16 bits??
![5ded9c1a58c1c6dd784a50f603b2e5e2.png](https://i-blog.csdnimg.cn/blog_migrate/e004b557449cd0d4f075015c3f74878d.jpeg)
下边是C代码实现部分,可以看出每计算一个byte移位8次,如果考虑运行速度的话可以提前计算出0x00-0xFF每一个数据对应的CRC先放好,然后再查表,这就是另一种计算CRC的方法了,Autosar两种方法都推荐,第一种速度较慢ROM占用少,第二种速度快但ROM占用多。
另一点要注意的是Autosar明确规定Profile 1初始值和XOR的值均为0x00。假如在某些代码中看到u8Crc ^= 0xFF时一定要留意看一下初始值,若是0xFF那就没问题,异或运算满足交换率就抵消了,否则计算结果错误了。
unsigned
online compiler: https://onlinegdb.com/BylhWbL3tU
扩展:其实Autosar给出了函数级的配置方案,要对上面的车速信号做E2E保护只要调用E2E_P02Protect函数即可,调用后的计算的CRC会存放在Data0,而Counter会存放在Data1.
E2E_P02Protect(Config, State, Data)
![8a00159b928863e1815b57a5a390ddad.png](https://i-blog.csdnimg.cn/blog_migrate/fd49a9fcbd56791ea5d30acce5d2b8eb.jpeg)
参考资料
https://en.wikipedia.org/wiki/Cyclic_redundancy_check
https://www.autosar.org/fileadmin/user_upload/standards/foundation/1-3/AUTOSAR_PRS_E2EProtocol.pdf
https://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks