本帖最后由 yfy812 于 2020-6-2 14:49 编辑
毛刺与CAN功能安全的关系 v2.
CAN协议中有关毛刺处理的不完善有可能引起功能安全问题,对实时通信而言功能安全有2个重要得内容,一是在规定的时限内帧的内容能否送达,其二是是否有错帧被漏检。毛刺都会破坏这二个要求。
CAN是事件触发的通信协议,它根据消息的优先等级和节点的状态自动地调度消息的传送。一个连有许多节点的CAN系统必须经过的最坏响应时间分析,才能确定在规定的时限内帧的内容能否送达。
最坏响应时间是指节点内消息已经就绪之后,到实际送达接收节点所需要的时间,例如一个周期为10ms的控制消息能否在10ms内送达,如果不能保证送达,那么系统内就发生丢包了。丢包是一个功能安全攸关的问题。
最坏情况是指消息就绪时正好有一个最长的低优先帧刚开始了传送,接着又被优先级高的就绪的帧阻挡。而是否有高优先级帧就绪是一个递归的问题,需要数值解法。它与帧的周期、抖动、帧的长度有关,也与帧的优先级设定有关。这里不详细引述有关的分析方法。但是需要指出的是优先级的设定很关键,在某些情况下,即使总线的负载率不重,未设定妥当的情况下,系统也是不可调度的。例如在总线利用率为9.2%时,对10条消息也不能进行调度。总线利用率<30%的经验数据并不是保证。
最坏响应时间分析是理想化的,有人还进行了出错情况下的分析。另外,虽然没有出现出错与报错,但是对毛刺可能使优先级倒置的情况没有考虑:它破坏了调度分析中高优先级消息总能优先发送的基本假设。
ISO 11898-1:2015(E)中关于发送的规定是:总线空闲时可开始发SOF位,在服务间隔第3喂读到D时接受为读到SOF并在下一位开始发帧的ID最高位。所有节点以SOF的前沿作同步。
图1,SOF 的规定
图2 SOF处毛刺的处理造成优先级倒置
CAN控制器在总线空闲时不断测试总线上是否有跳变沿,由于位时间的单位是1Tq,如节点有发送请求,检测到无跳变沿时它就可以在下个Tq时刻发送SOF。图2中T2在t1前1Tq内有发送请求(Request)时,它将在t1测试是否有D。如果没有D,它就在t2发自己的SOF。当t1时发现有一个局部毛刺会引起假的硬同步,它就会认为总线上已有传送,它就挂起发送请求。因为节点间存在传送延迟tprop,所以另一个节点T1在(t0+)~(t3-)期间内发出的帧将被T2采样到,从而确认t1处已有SOF开始了,T2将不再能发送。这里(t0+)代表比t0略迟的时刻,(t3-)代表比t3略早的时刻。在t0到t3期间T1所发的帧的优先级没有任何限制,T2的优先级原来有胜出可能,现在因不被参于竞争,也就是说可能出现优先级倒置。优先级倒置的时间宽度为inv=NTQ-P2。
ISO 11898-1 2003第12.4.1.2款规定位时间的时间单位为Tq,它是可组态的参数。一位共有NTQ(8-25)个Tq,Tq由振荡器分频而得。每一位分成4段:同步段S(1Tq),传输段Pr(1-8Tq或更多),缓冲1段P1(1-8Tq或更多)和缓冲2段P2(1-8Tq或更多),它们都是可组态的参数。位值的采样在P1与P2的分界处。它还规定了在采样点后要有2Tq的信息处理时间,以决定下一位应取的输出值。P2=max(P1,2)。CAN将同步分为二种:硬同步和重同步。总线空闲时开始新帧SOF的R/D(R到D)的跳变沿引起硬同步,立即复位本地位时间到S段(为了区分毛刺的跳变沿与信号的跳变沿,下文中只有信号的跳变沿称为同步沿)。在帧传送中的R/D跳变沿引起重同步,跳变沿落在上一位采样后的P2段时就将该P2缩短;跳变沿落在S后时加长本位P1的长度;本次位时间修正的最大绝对量不超过称为重同步跳转宽度SJW的值,SJW是一个组态参数,SJW=min(P1,4)。这个规定不尽合理,已留下了风险:时钟严格无频差时,按上述规定设计,如P1=3,4时有P2=3,4,SJW=3,4,当发生毛刺引起的假的同步时,采样点会落到下一位的开始处。时钟差1Tq以上时,采样点前1Tq就已见到下一位的开始处。
CAN位时间的振荡器精度设计时容许每13位相差小于P2,当P2为4Tq时,那么无同步时间有4位时,容许的时钟差有4*4/13=1.2Tq。
图3说明毛刺会引起仲裁错误。设T1T2均有ID6=R,在T2的ID5的R时有1个毛刺,它无法区别是T1所发的D位还是毛刺,就对R位中的跳变沿进行同步。当毛刺+e较大时,由ISO-16845 8.7.3和8.7.4款规定,最大P1段延长SJW,整个位时间的参考点都推后了SJW。T2的ID4=R也延后SJW,当SJW=P2时。T2的ID4采样点正好处在T1的ID3=D的前沿。当T1、T2有时钟差(按CAN标准,时钟差容许值为10bit或13bit可差min(P1,P2)=4Tq),当节点T2慢时,T2的 ID4采样点将落在同步沿后,当ID5离开上一个同步沿之前有4位时,ID4采样点将落在此同步沿后至少1.2 Tq,故被理解为还有较大+e,ID4采样点要再次推迟SJW,此时T2采到ID4=D。本来T1T2的优先级未分胜负,由于T2的ID4采错而退出竞争发送,造成优先级倒置。
在数据接收部分,也会有此种Rx丢失位的情况发生。由于CAN的动态填充位不对称执行,接收5个连续相同位中有错时,接收节点没有出现连续5个相同位的情况,即没有填充位会发生。接收Rx会把Tx中的填充位理解为信息位,从而使Rx增加一位。这种增加使收发过程CRC计算对象发生了错位。此种增加和毛刺形成的丢失互相抵消,形成收发双方在后面CRC传送时还是对齐的。
当错位形成的Ex是CRC多项式G的倍数时,就会发生错帧漏检。这是毛刺对功能安全的另一个重要危害。
图4毛刺引起错帧漏检的例一
图4中,在第5位发生了位错,所以Rx把填充位S=0读为Rx7,而Rx8=Tx7,…,在Tx22的传送中有+e>SJW的毛刺,它使Rx25读到了Tx25=0,又发生了对齐。毛刺发生在22、23、24的传送都有相同的效果。如同图3中情况一样,Rx慢时,Rx25之前的同步沿发生在Rx18,相距7位,时钟差7*4/13=2.1 Tq,Rx25的采样点落在传送Tx25同步沿后2.1 Tq,所以就会丢了Tx24.
错位时的Ex正好是G,所以计算的CRC校验值不变,即CRC(Rx)=CRC(Tx)。这就发生了错帧漏检。
这个片断共25位,在所有各种Tx组合中比率为Ppattern=2-25 。考虑到毛刺可以发生在22、23、24三个位置,比例要乘m1=3。这个片断在64个数据位和15个CRC位中可以任意取位置的数目为64+15-25=54,漏检数乘m2=54。假设帧长为103位,bit flip和 glitch发生在片断特定位置,片断内的特定位的概率Pposition=2/103/102。于是毛刺引起的错帧漏检率为;Pglitch=Ppattern*m1*m2 *Pposition=2-25*3*54*2/103/102=9.1*10-10。仅这一个例子,比CAN声称的漏检率4.7*10-11大195倍。
图5毛刺引起错帧漏检的例二
图5是另一个实例,Rx慢时,Rx25之前的同步沿发生在Rx21,相距4位,时钟差4*4/13=1.2 Tq,Rx25的采样点落在传送Tx25同步沿后1.2 Tq,所以就会丢了Tx24。错位时的Ex正好是(X+1)*G,所以计算的CRC校验值不变,即CRC(Rx)=CRC(Tx)。这就发生了错帧漏检。这样2个例子总计,比CAN声称的漏检率4.7*10-11大390倍。
图6 Ex头部波形与Ex多项式表达关系
每个漏检的Ex可表示为Ex=(U0*xi+Ui-1)*G,其中U0为4阶的多项式,Ui-1为阶次低于i的多项式。图6表示Ex多项式-Ex头部波形的关系。图4和图5就是头部Ex波形为000001、000010的例子。因为Ui-1对Ex头部波形没有影响,但是对Ex中间部分波形有影响,所以每一种Ex头部波形有总计2i种Ex波形。当L从25加长到=25+i时,可以看作i在不断增加,长度为25+i片断共有5种Ex头部波形,总的Ex波形数为m3=5*2i,长度为25+i的片断在所有各种Tx组合中比例为Ppattern=2-(25+i),故Ex波形的总数m3*Ppattern是不变的=5*2-25。但是随着L的加长,在帧内可能的位置数m2是变少的:从54减少到1。
毛刺可以发生在三个位置,比例要乘m1=3。bit flip和 glitch发生在帧内的特定位置的概率Pposition=2/103/102。
用Pun表示毛刺引起的错帧漏检率,于是有:
Pun= m1*(m3 *Ppattern)*sigma(m2)*Pposition
= 3*5*2-25*27*55*2/103/102
=1.2*10-7
Pun 10000倍大于CAN声称的错帧漏检率=4.7*10-11。上述计算的漏检波形尚未考虑填充位不对称执行发生在后、毛刺发生在先的例子,虽然这样的例子会使片断L的最小长度加长,但是总的错帧漏检率贡献可能还会增大80%。
下面粗略分析对系统失效率的影响。注意,这跟应用场景有关,例如有的应用总线利用率高到70%~80%、应用为短帧时每小时传送的帧数大为增加。
系统处于坏状态时误码率高,实际上的毛刺发生率比误码率要高得多,假定1位定为25 Tq,其中毛刺发生在采样处的Tq才会误码。假定有1半为D毛刺,发生在其它Tq处的D毛刺大部分会引起错误同步。当计算失效率时,与以往计算有2个误码不同,坏状态时的误码率BER要和毛刺率分开算,结果失效率也要大很多。
假定总线负载率40%,帧长100bit,位速率为1Mbps,则每小时送1.4*107个帧。假定坏状态占qbad=10-3,坏状态时的误码率为ber=0.01。按iso7637波形3a/3b代表的干扰,毛刺宽约0.1us,即每位可能有10个毛刺,当毛刺被采样到,则算作误码。毛刺率为误码率的10倍,但是仅发生在采样点前的D毛刺才会引起错误同步,所以可取glitchrate=0.03。出现错帧时有1位出现误码,概率为ber,有1位出现毛刺,概率为glitchrate,其余各位均不出现毛刺或误码(误码是毛刺发生在采样点),概率为(1- glitchrate)。
于是帧出错的概率为Pe.frame=qbad*ber*glitchrate*(1-glitchrate)98 =10-3*0.01*0.03*0.9798 =1.5*10-8。
Pfailure=Pe.frame*Pun*N=1.5*10-8*1.2*10-7*1.4*107=2.5*10-8/h
这已经超过了功能安全分配给通信的指标(1*10-7/h*1%=1*10-9/h)。毛刺率估计尚未完整,造成误码的干扰可能是较宽的干扰,如认为glitchrate=0.01,则有Pe.frame=2.7*10-8,Pfailure=4.5*10-8/h。所以改善错误同步是改善CAN功能安全的重要内容。
|