摘要 对于在《单片机与嵌入式系统应用》上发表的关于CAN隐患的2篇文章,Bosch对比作出了答复。Bosch在声明中默认了故障约束机制会造成发送与接收延迟现象的存在,但未提及其带来的恶性后果;强调这样做的好处,称这是特色而不是错误。本文在分析等效离线或真正离线对应用带来坏处的基础上,说明此事的严重性——可能引起大规模的召回事件。故障约束机制的好处与坏处是可以分开的,改进CAN不仅在现在是必须,也可进一步提高CAN在未来应用中的竞争力。
关键词 CAN 故障 安全 故障约束机制
关于CAN隐患的争辩始于本刊发表的2篇文章,一是“CAN总线系统中的一种安全隐患”,一是“CAN消极报错发送节点变为离线状态的故障“。这2篇文章在送稿前已经发给国内外的一些专家征求意见,尚未有反驳的意见。由于此事关系重大,涉及许多单位的利益,例如芯片供应商、开发工具供应商、ECU供应商、汽车制造商、高层协议供应商、高层协议产品提供商、各类服务提供商等等,为了避免这些单位由于既得利益的驱动有意无意地淡化问题的严重性,需要一个独立的代表第三者利益的机构来考察与评判问题是否存在,及其危害性。这个第三方利益就是终端用户,例如汽车的驾驶与乘用人员、行人及与此有关的保险公司、道路管理单位等。因此,不仅应该告知CAN产业的有关方,也应告知利益有关方,才能得到正确的恰如其分的应对。基于此种考虑,笔者将2篇文章的英文稿送美国国家交通部公路交通安全管理处(U.S.Department of Transportation,National Highwav Traffic Safety Administration)的网络热线,提请他们注意。后来这件事大概由他们转到了国际标准化组织(ISO)。ISO的TC/22/SC3负责车用通信有关业务,其TC/22/SC3/WG1/TF1的组长是CiA的主席Zeltwanger先生。CiA曾有人作了回复,笔者也作了答复,最后由 Zeltwanger。先生转来对此问题的正式声明作为答复。这是对问题的答复,并不是对个人的答复,这个声明是由ISO中国CAN专家组转来的。(它的英文全文见本刊网站www.mesnet.com.cn。)下面是Bosch声明要点与笔者的观点,在引述Bosch声明时将力求准确。
Bosch声明的标题是“它不是隐患,而是特色”(It's not
a bug,it's a feature!)。在引用参考文献[1—2]时说,“在那2篇文章中有一些对CAN协议故障约束机制,特别是对由消极报错状态下看到本地错的关切。…… 在CAN总线上网络流量很高以致连续帧之间不再有空闲时间时,以及消极报错节点看到本地错(即未被其他节点看到的错)时,它将无法完成其消极报错标志。后果是这个节点将不再能收发帧,直到它遇到空闲时间或其他节点发的主动报错帧。消极报错状态的发送节点会由此而使出错计数器加上去,直到达到离线状态。…… 这是CAN协议故意要达到的行为。……2种方法企图解决的是1个并不存在的问题。”
上述引述与原文略有差异。总线上空闲的分布是不受控制的,尖峰负载也是不可控的,即使有部分空闲也不能保障消极报错帧正确结束。尖峰负载是由消息到达时间的本质决定的,事件触发消息的到达时间是随机的,周期性消息的到达时间随本地时钟而变。例如,有2个初始相位相差5 ms的消息,它们的振荡器相差200×lO-6,它们的相位差在25 s后就消失了。在某个公倍数时间点上,所有的消息就会有接近O的相位差,就形成CAN调度分析最坏响应时间时假定的最坏峰值负载。这种差异不影响对 Bosch声明的进一步分析。就声明的上述表述而言,“特色”、“故意要达到的行为”等语句实际上同意了等效离线和真正离线后果的存在,后面还有 Bosch对此行为的直接描述。不过,Bosch并不认为此后果是有害的,而是强调此后果的有利方面。
它说:“故障约束机制的目的是防止有故障的节点干扰其余节点间的通信。”然后解释了进入消极报错状态或离线状态就可以达到上述目的。并说“1个因REC而进入消极报错状态的接收节点在成功收到1个无错的消息后,它能切换回主动报错状态(见故障约束规则8),使它能至少再发1次主动报错帧。”在谈论总线负载应小于50%后,它说“尖峰负荷典型地是由总线上的扰动造成,此时通信要中断一段时间,待发的传送会累积起来。当扰动结束时,所有这些待发的消息将按它们的标识符一个接一个送出。……如果扰动是由有故障节点引起,并在节点进入消极报错状态结束,那么故障约束机制想要的功能是把该节点保持在消极报错状态,至少让被该干扰推迟的所有消息发完,即尖峰负荷结束。
在这里,尖峰负荷并不随着干扰的消失而消失,CAN作为一种事件触发协议,负荷的分布完全是随机的,50%负载的约束并不能防止等效离线或真正离线状况的出现,参考文献[1]中引述的例子已证明了这一点。Bosch把引入消极报错状态的好坏后果混为一谈。当节点进入消极报错状态后其报错帧全是隐位,本来可以不再干扰其他节点的正常通信,没有必要让它退出通信。此外,在这一段表述中可以清楚地看到,CAN故障约束机制要让被该干扰推迟的所有消息发完,至少要禁止消极报错状态节点发送(不管消极报错状态节点待发的消息优先级多高),这印证了参考文献[1-2]的分析,但是它未提及接收也被禁止了。