在嵌入式系统里,通信是骨干部分,通信系统的错会引起整个嵌入式系统的故障。在通信系统里,假冒错(Masquerade fault)是指一种冒名顶替性质的故障,即发送时的一条消息被误收为另一种格式上合法的消息。此种错的后果显然是不能接受的,因为接收节点会把完全无关的数据进行解读,例如把制动踏板的位置解释为加速踏板的位置。在这种类型的应用中,由于控制方案对信号的突变有安全设计,机器本身的惯性也有滤波的效果,而且在很短的周期内又有正确的消息送来,在大多数情况下除了造成不适感觉外,不会造成很严重的后果。但如果这是会影响到最终执行的信号,那么如果在需要刹车时变为加油,就会造成事故。在有些平时信号更新较慢的系统里,误信号也可能造成新的问题。例如为了在启动瞬间防止电池电压跌落过大,要错开负荷,像汽车把空调暂时关闭,若误认为是打开信号,就会违背设计意图,造成新的干扰中的误信号也会带来令人难以解释的现象,浪费维修的人力物力,且损害品牌的声誉。在安全攸关的需要冗余的系统里,这种冒名错会使表决机制失效。因此对车用通信协议中的假冒错进行研究有重要的意义,它是解决车用嵌入式系统可靠性的关键之一。现有的主流车内通信协议是CAN,它还没有采用足够的措施可对抗假冒错。新的FlexRay协议有了这方面的措施,但是否足够还有待商榷。
1 假冒错
一条消息在整个发送/接收的过程中会受到干扰,从而产生数据位的改变。为了不被误收,现有的通信协议都有一些检错的措施,例如在传送的帧尾部附加校验数据。一般来说,较多采用循环冗余校验(CRc)方法,CRC生成多项式的长度与需要的检错Hamming距离以及需要处理的数据长度有关。CRC算法的Hamming距离是指码源。又如行车中误开车锁,则会带来新的风险。诊断系统字中无法用CRC算法检测出的出错位的个数。因此一个协议选用的CRC多项式反映了它要保证的Hamming距离。如果发生的位错误太多,CRC检验会产生漏判,把错误帧判为正常帧。例如CAN协议采用的15位cRC生成多项式在CAN的最大数据帧长度内Hamming距离为6。即CRc可检验帧内5位错误。不过CAN的CRC是在去掉填充位后计算的,由于填充位而造成Hamming距离下降[1]是一个设计上的失误,这在后面介绍。
当考虑假冒错时,要分析漏检的情况。第一种是干扰时间很长,出错位数太多,超出了CRC检验的能力;第二种是通信控制器在发帧以前数据已有变化,而变化后的数据有了合法的身份,CRC检验只是保证这一假冒者不被错发。在这二种情况下,都可能产生假冒错。在CAN中如果数据位错误发生在消息的ID部分就产生了假冒错,就有可能把刹车当成加油。下面进一步讨论产生假冒错的情况。
1.1数据传送链
从数据的产生到数据的利用的角度来看,通信不只是由一个通信控制器(cc)到另一个通信控制器的过程,它还包括由主机(host)到通信控制器的来回过程,这个过程同样会出错。一般的通信干扰分析大多数着眼于来自空问的幅射干扰对串行传输的影响,这当然是很重要的途径,但在采取一定措施后,可以得到缓解,例如用屏蔽电缆、双绞线、屏蔽的ECU外壳等。在汽车环境里电源的传导干扰很大,国际标准IS()7637列出了典型的传导干扰形式,它们的波形上升或下降沿很陡,不但在正电压方向超出电源电压很多倍,而且会在负电压方向超出很多倍。电源的传导干扰引起一般单片机(甚至是没有很多对外连线的应用)程序走飞的例子常有所闻,这说明在电源部分防范不够的主机,完全有可能失常,包括将数据传输到cc的过程。所以车用控制器组件要通过抗电源传导干扰的测试。
大部分host到cc的传送用的是并行方式,例如以字节方式把内容(ID、数据等)写入cc的有关寄存器里。也有少数采用串行方式,例如Microchip公司的MCP2515型号cAN通信控制器,它采用SPI串行接口来传送。即使将来大量使用32位MCU,这二种方式很可能依然会并存:带cc的host在MCU内部用字节交换数据;分立的host与cc可以采用并行或串行办式。但是host在计算时用的最小单位是字节,即使用串口送到cc,它也要有用并行方式写入的部分。当电源传导干扰引起传送失常时,这二种传送可能出错的位数是不同的。由于并行方式时l字节8位同时受干扰,出错的位数就较多,其后果看来就像突发错(burst error)。串行时可能先错一位,但如果干扰的持续时间长,就可能形成多位错,其后果也是发错。当然,一般host并行读写的过程较快,同样的干扰持续时间内可能有多次写入,出错就较多。
对于空间干扰,例如电磁场或重粒子流干扰,对传送出错的影响与上述分析不同,需要进一步研究,但后果是一样的。
1.2 出错位数
既然大部分host到cc的传送总经过并行方式,那么非常短时的干扰有可能引起的错就是1个字节的错。并行传送时由于各位线路电路结构的同一性,同一极性信号的出错可能性相同,不同极性信号则不太可能同时翻转,所以传送内容的不同会影响出错位数。此时最坏的情形就是8位全为1或全为O,同时发生翻转。Host写一条消息一般不止写1字节到cc。由此看来,对抗假冒错的CRC Hatoml。ng距离最好为9。当然,即使能保证8位错能检出,由于要保护的数据不止1字节,这种对抗假冒错的CRC只是消除了一次干扰。从实际数据来看全0或全l的数据只占极少数,所以较小的Hamming距离仍有较大的拦截错误的概率。
2 FIexRay对抗假冒错的措施
FlexRay[2]新兴的车用通信协议,它是因CAN协议在带宽和可靠性不足的情况下发展起来的,主要满足汽车线控技术(x—by—wire)的要求。在线控系统中,不再有机械或液压的后备,所有的操作都由电信号通过总线传送来实现,因此对通信的可靠性要求更高。为了对抗假冒错,和过去的技术相比,FlexRay协议添加了帧头的CRC检验。
FlexRay的帧头部段由5位的先导、11位的帧ID、7位的数据长度、ll位的头部CRC校验和以及6位的时钟周期计数构成。如果校验未通过,帧就判作出错而不予接收。5位的先导是保留位、数据区前导标志位、空帧标志位、同步帧标志位、启动帧标志位。头部C2RC校验覆盖的范围仅包括同步帧标志位、启动帧标志位、帧ID和数据长度。在FlexRay发送节点中头部CRC校验和是离线计算好并在组态时提供给cc的,接收节点的cc则根据收到的在覆盖域的以及CRC校验和的比特流计算CRC校验和。头部CRC校验的生成多项式为:
x11+x9+x8+x7+x2+1=
(x+1)(x5+x3+1)(x5+x4+x3+x+1)
其计算初值为Ox01A。该头部CRC校验保证覆盖的20位内Hamming距离为6。由于接收节点的cc是根据收到的在覆盖域的以及CRC校验和的比特流计算CRC校验和,如果出错的位数较多,有可能减少此项检验的有效性,在FlexRay波特率较高的情况下,出错位数多是可能的。这里被保护的数据内容是:同步帧标志表明本帧是否是用于时钟同步;启动帧标志表明本帧是否是启动时用的;帧ID在静态段时是时间片(slot)的编号,在动态段内为优先级编号,在网络的同一簇内每一个帧有1个ID;数据长度在组态时也是确定了的。因此在组态时可以离线算好CRC校验和。如果在应用时这些内容不管何种原因发生了破坏,接收者就可以发现。
FlexRay在发送时间片的实际使用权上还加以控制,即有与节点CC相配的总线监守(bus guardian),用以对抗Babbling Idiot错。总线监守在调度规定的时刻开启发送通道,允许CC发送,否则CC是送不出去的。消息以广播方式送到各节点,若接收也以时间片确定的话,假冒是很难的,除非总线监守与该节点的CC都出了错。但是FlexRay的总线监守并不保护发生在动态段的不准时发送,如果因为干扰,在周期内某节点CC的时间片指针vSlotCounter出了错,就有不准时的消息传送;若同时传送的ID也错,假冒错就会发生,vSlotCounter要等到新的时钟同步消息时再复位为1。
FlexRay对数据区前导标志和空帧标志未作头部CRC校验的覆盖,这可能引起问题。数据区前导标志用于标明数据区开始部分是否包含有消息ID(在动态段发送的帧)或者网络管理向量(在静态段发送的帧)。空帧标志用于标明数据区的数据是否可按原来的规定使用或者是空帧。网络管理向量是一个选项,作为应用的数据由host写入,为高一层的协议提供服务,目前还未有规定。显然这二位如果出错,头部CRC校验可以通过,但数据区的解释都会完全不同,其性质就是一种假冒错。虽然帧的发送节点未变,但是却是一个假帧代替了原来的帧。发生在这二位的错如果在节点发送帧以前就已有,那么帧尾部的CRC校验将不能检测出错。如上一节所分析,这种情况是有可能存在的。如果是在发送过程中产生的,那么帧尾部的CRC校验将有可能检测出错。
FlexRay帧尾部的CRC校验和为24位,它由发送节点的CC生成,覆盖由头部保留位到数据区的最后一位,FlexRay的2个信道采用不同的CRC计算初值。覆盖区长度在2048位时Hamming距离为6,覆盖区长度为4094位时Hamming距离为4。在汽车环境里,与CAN相比这一Hamming距离似不够。因为它们都要面对同样的机械设备,即同样的干扰。如图1所示,IS07637中的试验脉冲1,对电源为12V的系统,Us为-75~-100V.tr为1μs,假定硬件无法在此时间内将它衰减到足够小,那么FlexRay将有10位受影响;td为2ms,硬件应能克服电源的跌落。与此对比,CAN仅1位受影响。又如图2所示,试验脉冲3a,Us为-112~-150V,tr为(5±1.5)ns,td为0.1μs,td允差的上下限为(+0.1,0),t1为100μs,t4为10ms。对这种高频干扰,驱动器会有收发错,CAN的比特采样间隔为1μs,采到0.1μs错误的概率小,而FlexRay的位间隔为0.1μs,采到0.1μs错误的概率就大。由此看来,在带宽增加时,出错的概率增加多倍,而报错的能力并未增加多倍。为了成功应用,必须对硬件的抗干扰能力做大的提高。
3 CAN对抗假冒错的措施
CAN协议的CRC检验是在加入与去掉填充位后进行的,因此其报错能力受填充位的影响很大[1],要靠cRC来对抗发生在传送中误码形成的假冒错是不够的。因为传送中的比特错在接收节点可能引起后面比特流的错误解释,从而把填充位误作数据而未剔除,或将数据位解读为填充位误剔除,如图3所示。此时原来发送的比特流会向前或向后错一位,从而形成大量的误码(最坏的情况下,错位之后对CRC而言均为误码),很容易超出CRC的有效检错围,造成CRC的漏检(将错帧误判为有效帧),由于填充过程的影响,单个比特错的后果被放大了。所幸的是CAN还有其他的判错手段,例如格式错,那些漏过CRC校验的帧还可能被拦下。通过仿真,由CRC与各种判错手段综合的结果其漏判率还是比较小的,约为0.1×10-6,但是,并不是CAN协议所声个比特错(HD一6)。
CAN协议的2.0B版采用32位的仲裁区,它可以自动区分采用11位ID的消息(标准格式)或29位ID的消息(扩展格式)。如果在cc发送之前或发送中ID及另三位内容有变化,就有假冒发生的可能性。
CAN总线可以用ID的重新分配实现对假冒错的预防,这种重新分配的可能性在于29位的ID空间非常大,即使用去一部分对抗假冒错,剩余的部分依然足够消息的分配。对29位ID中取一部分作数字签名,这个数字签名为离线时用CRC生成的校验和。因此,仲裁域内发生等于该CRC生成多项式的Hamming距离个比特同时错才会有一个假冒错。小于卜tamming距离的比特错将是无效ID,该消息将被接收节点的过滤器滤掉,从而使假冒错无法产生影响。虽然在这里并没有进行接收ID的校验计算,因ID分配已经考虑了有效ID之间的距离,所以固定的接收滤波器足以防止假冒错。这样,无需增加软硬件的开销,CAN便可以实现与FlexRay同样的抗假冒错功能。
数字签名的生成方法,可以在现有的资料中选用,或者重新设计。例如参考文献[3],若取16阶的生成多项式,29位ID中去掉16位作数字签名后还剩13位,应能满足应用之需,须知FlexRay仅定义了11位的ID。也可以取更短的数字签名,例如和FlexRay相同的11位CRC生成多项式(它的CRC校验覆盖区为31位,}lamming距离为6),以留出更多的可用消息种类。重新设计时可以参考BCH码的设计方法设计生成多项式,以保证所需的卜tamming距离。选用16阶的CRC生成多项式时,它可以保证15位头部Hamming距离为8,在仲裁域ID的前13位内因CAN填充规则造成1位错被放大为多位错的情况,被检出的概率就增大。该多项式为:
0x8FDB—x16+x12+x11+x10+x9+x8+x7+
x5+x4+x2+x+l
选用16位CRC校验和时留给消息种类的大小为213=8 192种。采用上述方案,CAN在对抗假冒错上要比FlexRayr的方法简单。
CAN仲裁域里的SRR、IDE和RTR位的误码可能引起通信控制器对输入比特流的解释变化,但是可以采取措施防止假冒错。首先,如果仲裁域第12位、13位发生误码,就有可能在CAN2.0B的标准格式和扩展格式间产生转换(如扩展格式误为标准格式),那么节点对此时发生的假冒未加保护,因此应避免在系统里使用标准格式。标准格式误为扩展格式的情况,因帧长等被解释为ID,被滤波器及CAN的其他检错措施拦下的可能性增大。其次,在RTR位的误码将数据帧误为远程帧时接收节点收不到数据,属于故障-静默(fault—silent),是一般容错理论所要求的,远程帧请求误为数据帧时,有可能引起不良后果,这是称的可以拦截5个以下的单个比特错(HD=6)。
CAN协议的2.0B版采用32位的仲裁区,它可以自动区分采用11位ID的消息(标准格式)或29位ID的消息(扩展格式)。如果在cc发送之前或发送中ID及另三位内容有变化,就有假冒发生的可能性。
CAN总线可以用ID的重新分配实现对假冒错的预防,这种重新分配的可能性在于29位的ID空间非常大,即使用去一部分对抗假冒错,剩余的部分依然足够消息的分配。对29位ID中取一部分作数字签名,这个数字签名为离线时用CRC生成的校验和。因此,仲裁域内发生等于该CRC生成多项式的Hamming距离个比特同时错才会有一个假冒错。小于Hamming距离的比特错将是无效ID,该消息将被接收节点的过滤器滤掉,从而使假冒错无
法产生影响。虽然在这里并没有进行接收ID的校验计算,因ID分配已经考虑了有效ID之间的距离,所以固定的接收滤波器足以防止假冒错。这样,无需增加软硬件的开销,CAN便可以实现与FlexRay同样的抗假冒错功能。
数字签名的生成方法,可以在现有的资料中选用,或者重新设计。例如参考文献[3],若取16阶的生成多项式,29位ID中去掉16位作数字签名后还剩13位,应能满足应用之需,须知FlexRay仅定义了11位的ID。也可以取更短的数字签名,例如和FlexRay相同的11位CRC生成多项式(它的CRC校验覆盖区为31位,Hamming距离为6),以留出更多的可用消息种类。重新设计时可以参考BCH码的设计方法设计生成多项式,以保证所需的卜Hamming距离。选用16阶的CRC生成多项式时,它可以保证15位头部Hamming距离为8,在仲裁域ID的前13位内因CAN填充规则造成1位错被放大为多位错的情况,被检出的概率就增大。该多项式为:
Ox8FDB—x16+x12+x11+x10+x9+x8+x7+
x5+x4+x2+x+l
选用16位CRC校验和时留给消息种类的大小为213=8 192种。采用上述方案,CAN在对抗假冒错上要比FlexRayr的方法简单。
CAN仲裁域里的SRR、IDE和RTR位的误码可能引起通信控制器对输入比特流的解释变化,但是可以采取措施防止假冒错。首先,如果仲裁域第12位、13位发生误码,就有可能在CAN2.0B的标准格式和扩展格式间产生转换(如扩展格式误为标准格式),那么节点对此时发生的假冒未加保护,因此应避免在系统里使用标准格式。标准格式误为扩展格式的情况,因帧长等被解释为ID,被滤波器及CAN的其他检错措施拦下的可能性增大。其次,在RTR位的误码将数据帧误为远程帧时接收节点收不到数据,属于故障一静默(fault—silent),是一般容错理论所要求的,远程帧请求误为数据帧时,有可能引起不良后果,这是另一个问题,但同时存在的假冒错将由滤波器拦截住。
添加ID的数字签名并不改变原来的消息的优先级分配,因为优先级只在ID的前面部分确定好了。因此,采用不同数字签名的消息可以在同一系统里应用,只要收发节点的约定一致即可。但是,随便混用会使ID之间的距离变小。所以对一个高层协议,为了保证抗假冒错的能力不变,应该采用统一的CRC生成多项式。从()EM厂的总体利益看,开放其协议的数字签名方式较为有利。
4 小 结
假冒错在应用中是不能接受的,与一般数据错造成消息数据量上的变化不同,它可能造成消息质的变化。本文从信息传递的整个流程出发,讨论受干扰时的比特出错量,从而作为分析抗假冒错措施的依据。作为新一代的车用通信协议FlexRay,其头部CRC校验的覆盖面似嫌不足,由于带宽的增加误码率可能增大;尾部CRC检验也可能不够,从而仍有漏过假冒错的可能。本文讨论的CAN的抗假冒错方案实现比较简单,可以提升CAN的可靠度。需要指出,CAN的抗假冒错方案是基于出错时被丢弃的原理,它并不报错,发送节点无法知道已发送了错帧,从而进行重发。所以对那些重要的消息,在应用上仍要设置其他的保障措施。例如,预定时限到而未收到数据则通知应用层,或请求发送。由于CAN填充位规则对CRC的干扰,使C2RC拦截误码的能力下降,这是不理想的地方。虽然由CAN各种检错机制造成的漏检很小,但对一些重要的消息还应添加额外的校验。CAN的消息数据比较
短,一般只有一二字节。添加1个8位的CRC校验是一种可行的方法,在ECU增加的软件开销不会太大,但可进一步提高CAN的可信度。
对于较小的或专用的系统,也可以用本文的方案把固定的事件信号加数字签名一起传送,以提高通信的可靠性。例如开关信号分别用2个ID来表示1或0,传送时还有数据1或0,这样用多重检错方法来防止CAN的CRC检验的软肋。