- 論壇徽章:
- 0
|
Peasant_Lee:
“看過了樓主的所講的原理,拜訪! 看了下代碼,有一個地方弄不明白。 在 TestEcc.c 中的糾錯函數(shù)中,有個if判斷(下面列出),理論上它的作用應(yīng)該就是判斷s0s1s2 是否共有11個bit為1。但是我就不明白這個判別s0s1s2有11bit個1的條件,請高手指點(diǎn),先謝謝了!
/* Check for a single bit error */
if( ((s0 ^ (s0 >> 1)) & 0x55) == 0x55 &&
((s1 ^ (s1 >> 1)) & 0x55) == 0x55 &&
((s2 ^ (s2 >> 1)) & 0x54) == 0x54)
{
.................
.................
.................
}
”
hi,Peasant_Lee,你對文中提到的ECC算法還是沒太理解清楚,這段if代碼就是針對僅有1bit出錯的處理。這里我用c5,c4,c3,c2,c1,c0表示列校驗結(jié)果。根據(jù)算法本身如果僅有1bit出錯,可知c5,c3,c1分別與c4,c2,c0相反,行校驗同理,22bits的中一定有11bits的1,從而列校驗中一定有3bits的1,如果我選擇c5,c3,c1開始判斷,就是判斷每2bits的第2bit位,這個道理可以再仔細(xì)看看樓主的分析。S2保存了列校驗結(jié)果,格式為:
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
C5 C4 C3 C2 C1 C0 1 1
那么右移一位的S2再異或未右移的S2,就可以判斷出c5,c3,c1是否分別與c4,c2,c0相反,也就是是否僅有1bit出錯。S0,S1的算法與S2相同。
有了這個基礎(chǔ),以下糾錯的代碼就很明了了。
byteoffs = (s1 << 0) & 0x80;
byteoffs |= (s1 << 1) & 0x40;
byteoffs |= (s1 << 2) & 0x20;
byteoffs |= (s1 << 3) & 0x10;
byteoffs |= (s0 >> 4) & 0x08;
byteoffs |= (s0 >> 3) & 0x04;
byteoffs |= (s0 >> 2) & 0x02;
byteoffs |= (s0 >> 1) & 0x01;
bitnum = (s2 >> 5) & 0x04;
bitnum |= (s2 >> 4) & 0x02;
bitnum |= (s2 >> 3) & 0x01;
dat[byteoffs] ^= (1 << bitnum);
從校驗原理也可以反推出,如果3bits或以上出錯,則可能就無法檢測出錯誤,因為c5,c4,c3,c2,c1,c0的值會發(fā)生矛盾,格局有點(diǎn)像二分法,呵呵。 |
|