前言
粒子翻转现象一般常出现在航天领域中,粒子翻转现象出现的诱因是当航天航空的设备在高(太)空环境下运转时,其敏感节点可能会遭到因太阳活动所产生的能量粒子的撞击,造成存储单元状态发生改变。当然若是设备是用于日常生活的环境中,除非甲方有明确需求,否则是在研发过程中是不需要考虑这种现象的。这里介绍一种检验并更正粒子翻转的方法:三取二校验。
原理
三取二校验的原理就是将需要校验的程序(数据)备份成三份(算原程序)存储到不同的地址中,两两对比程序同一位的数据,若所有数据相同,则证明该地址内的程序内容正确。若某一位出现数据不同,则说明该位的数据内容发生偏移或改变,需要校正数据,将该位置的(三个)数据先进行按位与再将得出的三个数据进行按位或,最后得出的数据即是修正后的数据,将修正后的数据内容重新写入对应的存储地址中。
三取二校验流程
这里以笔者的一个项目为例作为示范:该项目中程序主要分为两个部分:BootLoader和APP,将两部分的程序分别备份为三份,存储在不同的flash地址内(即BootLoader1、2、3和APP1、2、3)上电后程序由BootLoader1启动,启动后程序会判断是否需要对APP进行3取2校验,若需要校验且校验结果错误,则对APP程序进行更正,若校验结果正常或不需校验,则跳转到APP1程序,当APP1正常运行后,每经过50ms校验1k的数据(先校验BootLoader后校验APP)。校验时若BootLoader程序校验结果中存在错误,则直接对错误内容进行更正,更正后继续进行校验直到本次校验结束。当BootLoader部分全部校验完成后,开始校验自身APP部分程序,若校验结果正常,则等待下一次新校验;若校验结果出现错误,首先需要判断出错部分是否包括APP1;若APP1无问题则直接对APP2和APP3出错部分进行更正;若APP1自身出现错误,则先更正APP2和APP3出错部分,待全部程序校验并更正完成后跳转回BootLoader1程序对APP1程序进行更正,更正并校验正确后再跳转回APP1程序再次进行上述循环,具体校验流程见下图。
三取二校验功能的c语言实现
/*****************************************************
//功能:3取2内容更正函数
//pA:比较内容A
//pB:比较内容B
//pC:比较内容C
//返回值:比较后的正确结果
*****************************************************/
u8 Content_Correct(u8 *pA, u8 *pB, u8 *pC)
{
u8 uitemp1;
u8 uitemp2;
u8 uitemp3;
u8 uiresult;
/* 三区比较 */
if (((*pA) == *pB) && ((*pA) == (*pC)))
{
/* 相等则直接使用 */
uiresult = (*pA);
}
else
{
/* 按位与,再按位或 */
uitemp1 = (*pA) & (*pB);
uitemp2 = (*pA) & (*pC);
uitemp3 = (*pB) & (*pC);
uiresult = uitemp1 | uitemp2 | uitemp3;
}
return uiresult;
}
具体的学习代码可见笔者上传的对应的工程文件。