热度 21
2013-4-9 14:27
2204 次阅读|
7 个评论
国家兴亡匹夫有责,从神九用到 CAN 总线讲起( 10 )错难补救 由于掌握了错帧重构的规律,所以可以说,你想怎样错就可以构造出怎样错的帧。 图 1 是一个数值被放大的例子,其中 U= x 8 +x 7 +x 6 +x 5 +x 4 +1, Ec=U*G= (1000, 0010, 0001, 1100, 1110, 1001) 。 Tx1 可以是以前连续 5 个 0 之后的填充位。也可以解释为 DLC0 ,例如原来是有 3 字节的数据,送一个 0000010000… 的值,结果错帧变为 1000010000… 的值,错帧将值放大了 32 倍。 图 1 错帧将数值放大 32 倍 观察图 1 的重构过程可见,如果将 Ec7 取为 1 ,那么 Tx7=0 ,错值倍数更大(为 64 倍),如果继续将 Ec8 取为 0 ,那么 Tx8=0 ,错值倍数更大(为 128 倍) … 。我们可以由修改后的 Ec 重新求 Uh ,例如为了达到 128 倍,由 Ec=1000010 ,将 Ec 除以 CAN 的生成多项式 G=(1100,0101,1001,1001) ,便可以得到 Uh=(x k x k-1 x k-2 x k-3 x k-4 x k-5 ) 。此时对照 5 种可能的 Ut ,我们可以选 k-4=5 ,即第 3 种 Ut 。得到 U=x 9 +x 8 +x 7 +x 6 +x 5 +x 4 +1 , Ec=U*G= (1000, 0100, 1001, 0111, 0111, 0100,1) 来重构出可疑数据流,如图 2 。因为算出的 Ec9 正好是 0 ,且 Rx7 由于有填充位设为 1 ,所以实际的放大倍数达到 264 倍。当然选其它 Ut 也是可以的,不过可疑数据流的位数稍多 1 位。 图 2 错帧将数值放大 264 倍 同样的多项式 U= x 8 +x 7 +x 6 +x 5 +x 4 +1, Ec=U*G= (1000, 0010, 0001, 1100, 1110, 1001) 。也可使值缩小 32 倍,如图 3 。 图 3 错帧将数值缩小 32 倍 在应用中数值的变化可能引起应用功能的错误,例如在变速器换档或刹车时,希望油门暂时减少,但是结果是加大,甚至可能全开。在丰田突然加速事件中,我是怀疑 VSC 经 CAN 传送到节气门的信号可能出错。美国的 NASA 调查报告并未排除使节气门开大的可能性。见文( 2 )。当然,并非一次传送错就会错到底,但是 CAN 存在短暂一段时间失效的可能性,这在我以后的博文中会交待。 这种错帧漏检之后跟着失效一段时间的危害是很大的,例如你在超车,你的转向角是 5 度,但是电动助力转向单元经 CAN 传到 ESP 的角度是 30 度,那么 ESP 认为这是驾驶员的命令,协助你实现 30 度转向, CAN 接着的几十毫秒失效,以及人不可能在几十毫秒内及时反应,你的车就可能冲到逆向车道了。 如果希望证实特定的数据变化,例如 Tx=10100101 是否可能变为 Rx=01011010 ,我们只要由这二项比较得到 Ec=11111111 ,将这个片断加上头部 Ech ,然后求出满足的多项式 U ,和以前的例子一样重构出 Tx 。不过,由于存在 Ec 的头部、尾部为特定形式的限制,这个可疑数据流不一定在你希望的位置,只有帧比较长时,帧的部分片断可以如愿重构。 错帧漏检的另一种危险是数据的相移,例如,你的帧内有许多表示状态和控制命令的开关量,一旦移相,状态和命令就乱了,有些保障措施也会失效,例如原来规定 55 表示开, AA 表示关,可以抵御有干扰时形成的非法码,现在由于移相, 55/AA 就会互相转换。混乱的状态和命令会产生设计时未预计到的系统状态,导致系统失控。 那么应用上有没有办法化解这一问题?对于这样的值域错唯一的办法是某种型式的冗余:软件上的冗余、物理上的冗余或时间上的冗余。 软件上的冗余就是另加数据的补充 CRC ,例如加一个 8 位 CRC ,这个 CRC 和原来的 CAN 的 CRC 没有共同的质多项式,此时可把漏检率缩小 256 倍,这样的结果还是达不到 Bosch 原定的指标。由于要占去一字节,在原来已用掉 8 字节数据的场合就比较麻烦:一帧要分为二帧。这都会增加带宽要求。其次是为取得不同接收节点的一致性,它们都要知道别人是否发现有附加 CRC 错,就要等有没有 NACK ,这要添加新的规定:例如必需在什么时限内发出 NACK ; NACK 的形式(否定哪个帧)。时限的引入也产生了延迟。 为了对付一个漏检的错帧,应用上的冗余要付出代价的,例如: 1 。原来用二个物理通道,只要有一个通道“正确”收到了就可以了。现在由于所谓“正确”可能是错的,当二个通道结果不一致时,你无法断定谁是真正正确的。就必须要有二个通道的第二次传送结果,在假定连续二次都发生错帧漏检概率小到可忽略不计的情况下,就可以以二次结果相同的通道作最终决定的输出。这样,通信需要的带宽要加倍, CAN 本来已为了减少竞争,把总线利用率定得较低,如 30%~40% ,这样做,有效负载降到只有 15~20% 。你为了满足余下的需求,要增加一套新的 CAN 系统,或者忍痛割爱,把控制闭环的采样周期加大,降低带宽需求,但也导致性能下降。 2 。原来一个物理通道时,你需要至少送 3 次才能作出表决。此时带宽的需求增到 3 倍,比上一条一样面临必须付出的代价。 3 。用对象输出变化的已知极限,拦截漏检的错帧,有时不可行。例如 Audi 方向盘角度传感器 G85 到 ESP 的信号本来应该识别 0-2000 ° /S ,这相当于 40 ° /20ms ,那么用拦截方案,变化超出 40 °就限值,但是由于传送值不是增量,方向盘角减少后的值(比上次采样小 40 °)在 CAN 传送中变大且被限值(比上次采样大 40 °),误差被限在 80 °,仍然是严重错误。 4 。接连多个采样值后作各种滤波,就像一般的抑制信号中干扰所取的办法,越是想抑制输入的干扰,就越要减少当前输入的权重。但这种办法完全不适用,因为原来的噪音只是信号范围的 1% 或更小,现在的错误值可能是信号范围的 80% 。要想抑制错帧,就会减少当前输入的权重到非常小,此时产生多个周期的延迟,就连累正常输入也有这样的延迟。若不想延迟,就要加快采样,把占用的带宽增加,而且不能完全消除错帧的影响。 这些方法显然会增加成本,增加重量、能耗,使设计、生产和维修变得困难,同时应用的性能仍然有可能下降。 这样的措施只能是克服困难的暂时性的不得已而为之的措施。就好比肚子饿的时候,先填饱肚子再说,饥不择食。我们总不能一直这样吧,因为这样总在付出别的代价。每一个人在作决择的时候总会有得有失,只是有的人看得远点,未雨绸缪,在长时间的刻度上损失小,有的人看得近点,只能委曲求全。不能说谁更高明,因为这只是目标函数的不同,约束条件的不同。而高明不高明往往是对约束条件的认识上的差别,有人认为做得到的事有人认为做不到。有人认为自己做不到,别人也做不到。有人认为自己做不到,也想不到去请别人来做,如此等等,诸葛亮的运筹帷幄,全在于他的审时度势,否则难有赤壁之胜,三国鼎立的局面。 有人会认为这是危言耸听,最好有实验数据来证实。这是非常朴素的实证观念,在简单的物理系统中常常是这样做的。但是在可靠性分析上,往往无法作这样的实验,把小概率的事件来作实验会非常费时间,就像文( 6 )讲的用软件注入求错帧漏检率会需要天文数字的时间。而像现在要求的功能安全要求的更小的概率,基本上只能用分析的方法。所以只能用分析的方法判断以前的分析有无错漏,而不可能以有限的实验的方法来判断以前的分析有无错漏。