CAN协议的错帧漏检率改进
当数据在传送中出错,且错帧被漏检时,就意味着错误的数据被送到应用层,除非应用层有额外的数据识别措施,这个数据就可能引起不可预测的结果。CAN协议声称有很低的错帧漏检率(4.7×10-11×出错率)[1],有的宣传材料在一定条件下推出要1000年才有1次漏检,这是不正确的。错帧漏检率是一个十分重要的指标,很多应用就是看到Bosch CAN2.0规范上的说明才选用CAN的。但是对这个指标的来源仅有极少的公开资料[2],以及很少的讨论[3],使用户很难对它确认或验证,这给用户带来风险。本文采用了重构出错漏检实例的方法,导出了CAN的漏检错帧概率下限,它比CAN声称的要大几个数量级。在许多应用中,CAN已是可靠性和价格平衡下的不二选择,或者已被长期生产和使用,面对这个新发现的问题,在CAN本身未作改进之前,迫切需要一种“补丁”来加以改善。由于篇幅有限,所以只能摘要介绍错帧漏检率的推导过程,重点在提供解决方案。
本文引用地址:http://www.amcfsurvey.com/article/196170.htm1 关于CAN漏检错帧概率文献的讨论
Bosch CAN2.0规范[1]说它的漏检错帧概率小于错帧率(message error rate)×4.7×10-11。它的来源见参考文献[2],其中没有提供产生漏检的分析算法,仅提到用大量仿真得到了公式。要判断一个帧出错后是否会漏检,至少要计算2次CRC,对每一bit仅就汇编语言也需要几条指令,以该文考虑的80~90 bit的帧,CRC覆盖58~66 bit就要循环58~66次,以1989年时常用的PDP11或VAX机,一条机器指令要0.1 μs左右,一帧的判断要0.07 ms,即使不停机做一年,能作2.20×1011帧,考虑58 bit可构成258=2.88×1017种不同的帧,再加有58×57种不同的加入2位bit错的位置组合,所以能作的仿真只是可能情况的微乎其微的一部分(百万分之一)。由于样本太小,归纳的公式也就很难把影响因素考虑完整。
1999年Tran[3]对错帧漏检率也作了研究,鉴于分析困难,他也采用计算机大量仿真的办法,针对11位ID 、8字节数据帧,他用的是600 MB的Alpha服务器。与上述讨论一样,虽然仿真量很大,仍然是可能情况的极小部分。
CAN有关的另一个标准CANopen Draft Standard 304 (2005)给出的错帧漏检率是(7.2×10-9)[4]。同样来自CAN自动化协会的不同数据,使人无可适从。
2 新错帧漏检率的导出
本文的研究方法是构造出漏检的实例,确定该种实例占可能的帧的概率,乘以与该实例相应的出多位错的概率,然后求出所有可能的实例,得到CAN的错帧漏检率。本文对最有可能造成漏检的二位错情况进行分析,然后扩大为有多位错。数据域取8字节,并假定错都发生在数据域内。它并没有将超过CRC校验能力时的分散的多bit错漏检率考虑进去,所以得到的是漏检错帧概率的下界。
2.1 CAN位填充中有错时的位序错开
在有可能产生填充的位流中有bit错时,就有可能造成发送方与接收方只有一方执行填充规则,造成填充位与信息位理解的错乱。图1(a)的第3位传送中出错,结果发送方的填充位1被接收方误读为数据1,整个接收数据比发送数据长了1位。图1(b)的第3位传送中的错使接收方产生了删除填充位的条件,因此它把发送的数据1删去,接收数据流短了1位。
图1 CAN的位填充规则使出错后接收位流变化
从位流变化可以知道,如果发生的2个bit错正好一次是图1(a)的类型,一次是图1(b)的类型,那么发送数据流和接收数据流的长度将仍然相等,如果2个错都发生在数据域,CAN的其他检验是发现不了它们的。
2.2 发生漏检的条件
发送的位流与接收的位流可写为多项式形式Tx(x)和Rx(x),CRC检验就是用CAN的生成多项式G(x)除这2个式子,得到的余数称为CRC值,如果2个余数相同,CRC检验通过。当发生传送错误,Rx (x)= Tx(x)+U(x)×G(x)时,对Tx(x)和Rx(x)求到的余数是相同的,这时就发生了错帧的漏检。因此只要找到U(x),就可以构造出漏检的实例。
2.3 由Ec(x)尾部确定漏错多项式U(x)
为了使读者了解推导过程的合理性,以下是举例。在前面已经发生过图1(b)的错后,Tx的i位被Rx收到为第i-1位。尾部发生的错对应图1(a)的情况如图2所示。图中Tx的这6位构成漏检实例的尾部,第1位1用于隔离前面位值的影响,使后面5位0后一定产生填充位。由于传送中有错,Rx不再有连续5位0。Tx的填充位被Rx视为数据位,Rx和Tx就对齐,在此以后的传送不再有位序错。由bit错发生位置的不同,Rx也不同,错误序列Ec也不同。这个Ec也是整个错误序列的尾部,用Ec,t表示。由图2可以看到,共有5种不同的错误序列尾部。显然,将Tx中的0/1取反并不改变错误序列尾部Ec,t的形式。
图2 第2个传送错造成填充位误读为信息位的5种漏检错序列尾部形式
在已知错误序列尾部形式Ec,t后便可以求出满足它的漏错多项式尾部Ut。将各多项式的系数表示为:
为满足Ec,t=G×Ut的尾部,那么系数有如下关系:
实际上将Ec,t、G均作逆序排列:
类似于求CRC值时的方法,将Ec,tR×x5除以GR就可以得到Ut的逆序系数,也就得到了Ut。由CAN生成多项式G的系数(1100,0101,1001,1001)以及Ec,t系数便得到了满足错误序列尾部形式的漏错多项式Ut,如表1所列。
评论