1 发生错的原因与现有对策
MCU在作业时会遭到搅扰,在一些空间场合,或许遇到粒子炮击而发生稳态的翻转,即所谓single event upset。而一般工业场合是电源传导搅扰,受搅扰时,电源电压会瞬间超出或许稍微超出MCU的名义作业电压,线路的稳定性就无法确保。由于各单个逻辑电路工艺进程中总会有细小差异,电源电压的稍微超出会在最弱的逻辑电路中形成指令读过错和数据读写过错。这种过错终究表现为数据的过错。
国外对DRAM犯错的研讨已做得许多,在参阅文献中转述了犯错的概率:“谷歌(Google)使用了很多服务器,2009年的大规模核算。犯错的概率是2.5~7×10-11error/bit/h。”即8G RAM每小时会有5个错。
现在关于有功用安全要求的体系,安全等级为SIL2时,犯错的概率应小于10-7”/h。现在操控器所用的MCU的Flash与RAM的巨细已达128 K~1 Mb,参阅上述概率,假如短少程序的维护,将会有1M×7×10-11 error/h=7×10-5 error/h,这远大于功用安全要求的犯错概率。
从功用安全的视点,体系中任何影响功用的过错都是应该被检测出来的,假如这个过错危及人类生命或形成设备的重大损失,那么就必须有防备的办法,必要时就必须纠正过错。然而要到达这种要求是很难的,需求支付很大的价值。以数据过错为例,人们常常重复核算屡次,然后把占多数的成果代表正确的成果。这样,数据共享前的成果都要经表决,不然发现错会太晚,影响一致性。这就需求更多的硬件资源与开发本钱。即便如此,假如作为表决器的环节仍是MCU的一个程序,它依然或许会受过错指令的搅扰,未能彻底拦住过错。
为了节约本钱,更多的使用并没有选用这种冗余与表决的办法。它们往往以不死机作为方针,只需不死机,由操控目标来的新信息就能够重算出新的正确成果。即便上一次算出的错了,其成果也只连续了一个采样周期。这种战略对有累积效应的使用是无效的,就像参阅文献中评论的积分功用会失利。又如运转成果与进程密切相关的使用,例如可编程操控器(PLC),数据的过错会导致操控逻辑的紊乱。
确保不死机的首要办法是选用看门狗技能,假如程序走飞,在必定时间内没有复位计时器,计时器就会溢出,发生MCU的从头启动,从头初始化能够纠正损坏了的数据。看门狗技能是不论数据正确性的,由于指令错了程序未必走飞,而指令错了数据错的或许性极大。
2 过错现象与过错校对计划
MCU的指令在读取时发生过错就会发生不同的履行成果,在参阅文献中以8051的MOV指令为例,当有一位读错时就变成跳转、除法、减法、交流、增1等等指令。实际上大部分MCU都会有指令错而履行成果错的问题,由于这些指令内没有查验错的机制。MC68HC11的LDA指令有1位错时或许转为加法、减法、送当即数到累加器B、送状况存器、送仓库指针等指令。
假定数据字用D表明,生成多项式用G表明,Gm为最高阶的系数,等于1。那么习气的做法在除到Dn位时,判别Dn值。若Dn=1,则将G和D的对应位对齐,用模2加法求取余数,Mn-i=Dn-i+Gm-i,用余数Mn-i替代本来的Dn-i移位。假如Dn=0,则不做加法,Mn-i=Dn-i,然后移位,也能够说用余数Mn-i替代本来的Dn-i移位。咱们的意图是直接由D来发生余数,所以做了修正。修正办法是,当对齐后的Gm- i=1时,取Mn-i=Dn-i+Dn。当Gm-i=0时,对应项不做模2加。现在证明这两种办法是等效的:
Dn=0,Gm-i=0时,习气办法Mn-i=Dn-i;修正办法Mn-i=Dn-i。
Dn=0,Gm-i=1时,习气办法Mn-i=Dn-i;修正办法Mn-i=Dn-i+Dn=Dn-i。
Dn=1,Gm-i=0时,习气办法Mn-i=Dn-i+Gm-i=Dn-i;修正办法Mn-i=Dn-i。
Dn=1,Gm-i=1时,习气办法Mn-i=Dn-i+Gm-i=Dn-i+1;修正办法Mn-i=Dn-i+Dn=Dn-i+1。
现在对G=X4+X+1时8位指令的数据字用修正办法求取CRC各位的值,为了阅览便利,将数据字的各位用数字代表,例如7代表D7。参加模2加的各位就以各数字连写在一起。例如CRC的最高一位是7 532,它代表D7、D5、D3、D2的模2加法成果。经过树立真值表,它们最终都能够用组合逻辑来完成,所以在取指完成后就当即能够判出是否有错。