日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

[原創(chuàng)]Nand ECC校驗(yàn)和糾錯(cuò)原理及2.6.27內(nèi)核ECC代碼分析 - 嵌入式開發(fā) -...

 jijo 2009-06-15


ECC的全稱是Error Checking and Correction,是一種用于Nand的差錯(cuò)檢測(cè)和修正算法。如果操作時(shí)序和電路穩(wěn)定性不存在問題的話,NAND Flash出錯(cuò)的時(shí)候一般不會(huì)造成整個(gè)Block或是Page不能讀取或是全部出錯(cuò),而是整個(gè)Page(例如512Bytes)中只有一個(gè)或幾個(gè)bit出錯(cuò)。ECC能糾正1個(gè)比特錯(cuò)誤和檢測(cè)2個(gè)比特錯(cuò)誤,而且計(jì)算速度很快,但對(duì)1比特以上的錯(cuò)誤無(wú)法糾正,對(duì)2比特以上的錯(cuò)誤不保證能檢測(cè)。
校驗(yàn)碼生成算法:ECC校驗(yàn)每次對(duì)256字節(jié)的數(shù)據(jù)進(jìn)行操作,包含列校驗(yàn)和行校驗(yàn)。對(duì)每個(gè)待校驗(yàn)的Bit位求異或,若結(jié)果為0,則表明含有偶數(shù)個(gè)1;若結(jié)果為1,則表明含有奇數(shù)個(gè)1。列校驗(yàn)規(guī)則如表1所示。256字節(jié)數(shù)據(jù)形成256行、8列的矩陣,矩陣每個(gè)元素表示一個(gè)Bit位。

其中CP0 ~ CP5 為六個(gè)Bit位,表示Column Parity(列極性),
CP0為第0、24、6列的極性,CP1為第1、3、5、7列的極性,
CP2為第0、1、4、5列的極性,CP3為第2、3、6、7列的極性,
CP4為第0、1、23列的極性,CP5為第45、67列的極性。
用公式表示就是:CP0=Bit0^Bit2^Bit4^Bit6, 表示第0列內(nèi)部256個(gè)Bit位異或之后再跟第2256個(gè)Bit位異或,再跟第4列、第6列的每個(gè)Bit位異或,這樣,CP0其實(shí)是256*4=1024個(gè)Bit位異或的結(jié)果。CP1 ~ CP5 依此類推。
行校驗(yàn)如下圖所示



其中RP0 ~ RP15 為十六個(gè)Bit位,表示Row Parity(行極性),
RP0為第0、24、6、….252、254 個(gè)字節(jié)的極性
RP1-----1、3、5、7……253、255
RP2----01、4、5、89…..252、253 (處理2個(gè)Byte,跳過2個(gè)Byte
RP3---- 2、3、67、10、11…..254、255 (跳過2個(gè)Byte,處理2個(gè)Byte
RP4---- 處理4個(gè)Byte,跳過4個(gè)Byte;
RP5---- 跳過4個(gè)Byte,處理4個(gè)Byte;
RP6---- 處理8個(gè)Byte,跳過8個(gè)Byte
RP7---- 跳過8個(gè)Byte,處理8個(gè)Byte;
RP8---- 處理16個(gè)Byte,跳過16個(gè)Byte
RP9---- 跳過16個(gè)Byte,處理16個(gè)Byte;
RP10----處理32個(gè)Byte,跳過32個(gè)Byte
RP11----跳過32個(gè)Byte,處理32個(gè)Byte;
RP12----處理64個(gè)Byte,跳過64個(gè)Byte
RP13----跳過64個(gè)Byte,處理64個(gè)Byte;
RP14----處理128個(gè)Byte,跳過128個(gè)Byte
RP15----跳過128個(gè)Byte,處理128個(gè)Byte;
可見,RP0 ~ RP15 每個(gè)Bit位都是128個(gè)字節(jié)(也就是128行)即128*8=1024個(gè)Bit位求異或的結(jié)果。
綜上所述,對(duì)256字節(jié)的數(shù)據(jù)共生成了6個(gè)Bit的列校驗(yàn)結(jié)果,16個(gè)Bit的行校驗(yàn)結(jié)果,共22個(gè)Bit。在Nand中使用3個(gè)字節(jié)存放校驗(yàn)結(jié)果,多余的兩個(gè)Bit位置1。存放次序如下表所示:



K9F1208為例,每個(gè)Page頁(yè)包含512字節(jié)的數(shù)據(jù)區(qū)和16字節(jié)的OOB區(qū)。前256字節(jié)數(shù)據(jù)生成3字節(jié)ECC校驗(yàn)碼,后256字節(jié)數(shù)據(jù)生成3字節(jié)ECC校驗(yàn)碼,共6字節(jié)ECC校驗(yàn)碼存放在OOB區(qū)中,存放的位置為OOB區(qū)的第0、123、6、7字節(jié)。



2009-6-6 23:06
  下載次數(shù): 51
MakeEccTable.rar (739 Bytes)
  Make_Ecc_Table.c 代碼



本帖最近評(píng)分記錄
bitmilong   2009-6-6 23:39   可用積分   +10   精品文章
您對(duì)本貼的看法:鮮花[0] 臭蛋[0]
wwxbei   帥哥 (旺旺)
騎士



CU編號(hào): 273473
注冊(cè):2005-5-28
最后登錄: 2009-06-13
帖子:51
精華:1

可用積分:113 (白手起家)
信譽(yù)積分:100
專家積分:0 (本版:0)
空間積分:12
推廣積分:1

狀態(tài):...離線...

[資料] [站內(nèi)短信] [Blog]


2樓 發(fā)表于 2009-6-6 23:08 
[原創(chuàng)]Nand ECC校驗(yàn)和糾錯(cuò)原理及2.6.27內(nèi)核ECC代碼分析

校驗(yàn)碼生成算法的C語(yǔ)言實(shí)現(xiàn)

Linux內(nèi)核中ECC校驗(yàn)算法所在的文件為drivers/mtd/nand/nand_ecc.c,其實(shí)現(xiàn)有新、舊兩種,在2.6.27及更早的內(nèi)核中使用的程序,從2.6.28開始已經(jīng)不再使用,而換成了效率更高的程序??梢栽?/font>Documentation/mtd/nand_ecc.txt 文件中找到對(duì)新程序的詳細(xì)介紹。


首先分析一下2.6.27內(nèi)核中的ECC實(shí)現(xiàn),源代碼見:
http://lxr./linux+v2.6.27/drivers/mtd/nand/nand_ecc.c
43/*
44 * Pre-calculated 256-way 1 byte column parity
45 */
46static const u_char
nand_ecc_precalc_table[] = {
47   0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00,
48   0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f, 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65,
49   0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66,
50   0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,
51   0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69,
52   0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,
53   0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,
54   0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,
55   0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,
56   0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,
57   0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,
58   0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69,
59   0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,
60   0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66,
61   0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f, 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65,
62

0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00
63};



為了加快計(jì)算速度,程序中使用了一個(gè)預(yù)先計(jì)算好的列極性表。這個(gè)表中每一個(gè)元素都是unsigned char類型,表示8位二進(jìn)制數(shù)。
表中8位二進(jìn)制數(shù)每位的含義:





這個(gè)表的意思是:對(duì)0~255256個(gè)數(shù),計(jì)算并存儲(chǔ)每個(gè)數(shù)的列校驗(yàn)值和行校驗(yàn)值,以數(shù)作數(shù)組下標(biāo)。比如 nand_ecc_precalc_table[ 13 ]  存儲(chǔ)13的列校驗(yàn)值和行校驗(yàn)值,13的二進(jìn)制表示為 00001101, 其CP0 = Bit0^Bit2^Bit4^Bit6 = 0;
CP1 = Bit1^Bit3^Bit5^Bit7 = 1
CP2 = Bit0^Bit1^Bit4^Bit5 = 1;
CP3 = Bit2^Bit3^Bit6^Bit7 = 0;
CP4 = Bit0^Bit1^Bit2^Bit3 = 1;
CP5 = Bit4^Bit5^Bit6^Bit7 = 0;
其行極性RP = Bit0^Bit1^Bit2^Bit3^Bit4^Bit5^Bit6^Bit7 = 1;
nand_ecc_precalc_table[ 13 ] 處存儲(chǔ)的值應(yīng)該是 0101 0110,即0x56.
注意,數(shù)組nand_ecc_precalc_table的下標(biāo)其實(shí)是我們要校驗(yàn)的一個(gè)字節(jié)數(shù)據(jù)。
理解了這個(gè)表的含義,也就很容易寫個(gè)程序生成這個(gè)表了。程序見附件中的 MakeEccTable.c文件。



有了這個(gè)表,對(duì)單字節(jié)數(shù)據(jù)dat,可以直接查表 nand_ecc_precalc_table[ dat ] 得到 dat的行校驗(yàn)值和列校驗(yàn)值。 但是ECC實(shí)際要校驗(yàn)的是256字節(jié)的數(shù)據(jù),需要進(jìn)行256次查表,對(duì)得到的256個(gè)查表結(jié)果進(jìn)行按位異或,最終結(jié)果的 Bit0 ~ Bit5 即是256字節(jié)數(shù)據(jù)的 CP0 ~ CP5.
/* Build up column parity */
  81        for(i = 0; i < 256; i++) {
  82
/* Get CP0 - CP5 from table */
  83
idx = nand_ecc_precalc_table[*dat++];
  84
reg1 ^= (idx & 0x3f);
  85
  86            //這里省略了一些,后面會(huì)介紹
  91        }



Reg1





在這里,計(jì)算列極性的過程其實(shí)是先在一個(gè)字節(jié)數(shù)據(jù)的內(nèi)部計(jì)算CP0 ~ CP5, 每個(gè)字節(jié)都計(jì)算完后再與其它字節(jié)的計(jì)算結(jié)果求異或。而表1中是先對(duì)一列Bit0求異或,再去異或一列Bit2。 這兩種只是計(jì)算順序不同,結(jié)果是一致的。 因?yàn)楫惢蜻\(yùn)算的順序是可交換的。



行極性的計(jì)算要復(fù)雜一些。
nand_ecc_precalc_table[] 表中的 Bit6 已經(jīng)保存了每個(gè)單字節(jié)數(shù)的行極性值。對(duì)于待校驗(yàn)的256字節(jié)數(shù)據(jù),分別查表,如果其行極性為1,則記錄該數(shù)據(jù)所在的行索引(也就是for循環(huán)的i值),這里的行索引是很重要的,因?yàn)?/font>RP0 ~ RP15 的計(jì)算都是跟行索引緊密相關(guān)的,如RP0只計(jì)算偶數(shù)行,RP1只計(jì)算奇數(shù)行,等等。

/* Build up column parity */
  81        for(i = 0; i < 256; i++) {
  82
/* Get CP0 - CP5 from table */
  83
idx = nand_ecc_precalc_table[*dat++];
  84
reg1 ^= (idx & 0x3f);
  85
  86
/* All bit XOR = 1 ? */
  87                if (idx & 0x40) {
  88
reg3 ^= (uint8_t) i;
  89
reg2 ^= ~((uint8_t) i);
  90                }
  91        }


這里的關(guān)鍵是理解第8889行。Reg3reg2都是unsigned char 型的變量,并都初始化為零。
行索引(也就是for循環(huán)里的i)的取值范圍為0~255,根據(jù)表2可以得出以下規(guī)律:


RP0只計(jì)算行索引的Bit00的行,RP1只計(jì)算行索引的Bit01的行;
RP2只計(jì)算行索引的Bit10的行,RP3只計(jì)算行索引的Bit11的行;
RP4只計(jì)算行索引的Bit20的行,RP5只計(jì)算行索引的Bit21的行;
RP6只計(jì)算行索引的Bit30的行,RP7只計(jì)算行索引的Bit31的行;
RP8只計(jì)算行索引的Bit40的行,RP9只計(jì)算行索引的Bit41的行;
RP10只計(jì)算行索引的Bit50的行,RP11只計(jì)算行索引的Bit51的行;
RP12只計(jì)算行索引的Bit60的行,RP13只計(jì)算行索引的Bit61的行;
RP14只計(jì)算行索引的Bit70的行,RP15只計(jì)算行索引的Bit71的行;





[原創(chuàng)]Nand ECC校驗(yàn)和糾錯(cuò)原理及2.6.27內(nèi)核ECC代碼分析

已經(jīng)知道,異或運(yùn)算的作用是判斷比特位為1的個(gè)數(shù),跟比特位為0的個(gè)數(shù)沒有關(guān)系。如果有偶數(shù)個(gè)1則異或的結(jié)果為0,如果有奇數(shù)個(gè)1則異或的結(jié)果為1。
那么,程序第88行,對(duì)所有行校驗(yàn)為1的行索引按位異或運(yùn)算,作用便是:

判斷在所有行校驗(yàn)為1的行中,
屬于RP1計(jì)算范圍內(nèi)的行有多少個(gè)------reg3Bit 0指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP3計(jì)算范圍內(nèi)的行有多少個(gè)------reg3Bit 1指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP5計(jì)算范圍內(nèi)的行有多少個(gè)------reg3Bit 2指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP7計(jì)算范圍內(nèi)的行有多少個(gè)------reg3Bit 3指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP9計(jì)算范圍內(nèi)的行有多少個(gè)------reg3Bit 4指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP11計(jì)算范圍內(nèi)的行有多少個(gè)------reg3Bit 5指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP13計(jì)算范圍內(nèi)的行有多少個(gè)------reg3Bit 6指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP15計(jì)算范圍內(nèi)的行有多少個(gè)------reg3Bit 7指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);


所以,reg3每個(gè)Bit位的作用如下表所示:
Reg3




89行,對(duì)所有行校驗(yàn)為1的行索引按位取反之后,再按位異或,作用就是判斷比特位為0的個(gè)數(shù)。比如reg2Bit00表示:所有行校驗(yàn)為1的行中,行索引的Bit00的行有偶數(shù)個(gè),也就是落在RP0計(jì)算范圍內(nèi)的行有偶數(shù)個(gè)。所以得到結(jié)論:


在所有行校驗(yàn)為1的行中,
屬于RP0計(jì)算范圍內(nèi)的行有多少個(gè)------reg2Bit 0指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP2計(jì)算范圍內(nèi)的行有多少個(gè)------reg2Bit 1指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP4計(jì)算范圍內(nèi)的行有多少個(gè)------reg2Bit 2指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP6計(jì)算范圍內(nèi)的行有多少個(gè)------reg2Bit 3指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP8計(jì)算范圍內(nèi)的行有多少個(gè)------reg2Bit 4指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP10計(jì)算范圍內(nèi)的行有多少個(gè)------reg2Bit 5指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP12計(jì)算范圍內(nèi)的行有多少個(gè)------reg2Bit 6指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);
屬于RP14計(jì)算范圍內(nèi)的行有多少個(gè)------reg2Bit 7指示,0表示有偶數(shù)個(gè),1表示有奇數(shù)個(gè);


所以,reg2每個(gè)Bit位的作用如下表所示:
Reg2



至此,只用了一個(gè)查找表和一個(gè)for循環(huán),就把所有的校驗(yàn)位CP0 ~ CP5 RP0 ~ RP15全都計(jì)算出來(lái)了。下面的任務(wù)只是按照表3的格式,把這些比特位重新排列一下順序而已。
reg2reg3中抽取出 RP8~RP15放在tmp1中,抽取出RP0~RP7放在tmp2中,
Reg1左移兩位,低兩位置1,
然后把tmp2, tmp1, reg1 放在 ECC碼的三個(gè)字節(jié)中。
程序中還有CONFIG_MTD_NAND_ECC_SMC, 又進(jìn)行了一次取反操作,暫時(shí)還不知為何。





[原創(chuàng)]Nand ECC校驗(yàn)和糾錯(cuò)原理及2.6.27內(nèi)核ECC代碼分析

ECC糾錯(cuò)算法

當(dāng)往NAND Flashpage中寫入數(shù)據(jù)的時(shí)候,每256字節(jié)我們生成一個(gè)ECC校驗(yàn)和,稱之為原ECC校驗(yàn)和,保存到PAGEOOBout-of-band)數(shù)據(jù)區(qū)中。當(dāng)從NAND Flash中讀取數(shù)據(jù)的時(shí)候,每256字節(jié)我們生成一個(gè)ECC校驗(yàn)和,稱之為新ECC校驗(yàn)和。



將從OOB區(qū)中讀出的原ECC校驗(yàn)和新ECC校驗(yàn)和按位異或,若結(jié)果為0,則表示不存在錯(cuò)(或是出現(xiàn)了 ECC無(wú)法檢測(cè)的錯(cuò)誤);若3個(gè)字節(jié)異或結(jié)果中存在11個(gè)比特位為1,表示存在一個(gè)比特錯(cuò)誤,且可糾正;若3個(gè)字節(jié)異或結(jié)果中只存在1個(gè)比特位為1,表示 OOB區(qū)出錯(cuò);其他情況均表示出現(xiàn)了無(wú)法糾正的錯(cuò)誤。


假設(shè)ecc_code_raw[3] 保存原始的ECC校驗(yàn)碼,ecc_code_new[3] 保存新計(jì)算出的ECC校驗(yàn)碼,其格式如下表所示:




對(duì)ecc_code_raw[3]ecc_code_new[3] 按位異或,得到的結(jié)果三個(gè)字節(jié)分別保存在s0,s1,s2中,如果s0s1s2中共有11個(gè)Bit位為1,則表示出現(xiàn)了一個(gè)比特位錯(cuò)誤,可以修正。定位出錯(cuò)的比特位的方法是,先確定行地址(即哪個(gè)字節(jié)出錯(cuò)),再確定列地址(即該字節(jié)中的哪一個(gè)Bit位出錯(cuò))。


確定行地址的方法是,設(shè)行地址為unsigned char byteoffs,抽取s1中的Bit7,Bit5,Bit3,Bit1,作為 byteoffs的高四位, 抽取s0中的Bit7,Bit5,Bit3,Bit1 作為byteoffs的低四位, 則byteoffs的值就表示出錯(cuò)字節(jié)的行地址(范圍為0 ~ 255)。
確定列地址的方法是:抽取s2中的Bit7,Bit5,Bit3 作為 bitnum 的低三位,bitnum其余位置0,則bitnum的表示出錯(cuò)Bit位的列地址 (范圍為0 ~ 7)。


下面以一個(gè)簡(jiǎn)單的例子探索一下這其中的奧妙。
假設(shè)待校驗(yàn)的數(shù)據(jù)為兩個(gè)字節(jié),0x45(二進(jìn)制為0100 0101)和0x38(二進(jìn)制為0011 1000),其行列校驗(yàn)碼如下表所示:






從表中可以計(jì)算出CP5 ~ CP0的值,列在下表的第一行(原始數(shù)據(jù))。假設(shè)現(xiàn)在有一個(gè)數(shù)據(jù)位發(fā)生變化,0x38變?yōu)?/font>0x3A,也就是Byte
1Bit 10變成了1,計(jì)算得到新的CP5 ~ CP0值放在下表第2行(變化后數(shù)據(jù))。新舊校驗(yàn)碼求異或的結(jié)果放在下表第三行。


可見,當(dāng) Bit
1發(fā)生變化時(shí),列校驗(yàn)值中只有CP1,CP2,CP4發(fā)生了變化,而CP0CP3,CP5沒變化,也就是說6個(gè)Bit校驗(yàn)碼有一半發(fā)生變化,則求異或的結(jié)果中有一半為1。同理,行校驗(yàn)求異或的結(jié)果也有一半為1。這就是為什么前面說256字節(jié)數(shù)據(jù)中的一個(gè)Bit位發(fā)生變化時(shí),新舊22Bit校驗(yàn)碼求異或的結(jié)果中會(huì)有11個(gè)Bit 位為1。





再來(lái)看怎么定位出錯(cuò)的Bit位。以列地址為例,若CP5發(fā)生變化(異或后的CP5=1),則出錯(cuò)處肯定在 Bit 4 ~ Bit 7中;若CP5無(wú)變化(異或后的CP5=0,則出錯(cuò)處在 Bit 0 ~ Bit 3 中,這樣就篩選掉了一半的Bit位。剩下的4個(gè)Bit位中,再看CP3是否發(fā)生變化,又選出2個(gè)Bit位。剩下的2Bit位中再看CP1是否發(fā)生變化,則最終可定位1個(gè)出錯(cuò)的Bit位。下面的樹形結(jié)構(gòu)更清晰地展示了這個(gè)判決過程:

圖表 1  出錯(cuò)Bit列地址定位的判決樹




注意:圖中的CP指的是求異或之后的結(jié)果中的CP


為什么只用CP4,CP2,CP0呢?其實(shí)這里面包含冗余信息,因?yàn)?/font>CP5=1則必有CP4=0,CP5=0則必有CP4=1,也就是CP5CP4一定相反,同理,CP3CP2一定相反,CP1CP0一定相反。所以只需要用一半就行了。


這樣,我們從異或結(jié)果中抽取出CP5CP3,CP1位,便可定位出錯(cuò)Bit位的列地址。比如上面的例子中CP5/CP3/CP1 = 001,表示Bit 1出錯(cuò)。


同理,行校驗(yàn)RP1發(fā)生變化,抽取RP1,可知Byte 1發(fā)生變化。這樣定位出Byte 1Bit 0出錯(cuò)。
當(dāng)數(shù)據(jù)位256字節(jié)時(shí),行校驗(yàn)使用RP0 ~ RP15,抽取異或結(jié)果的RP15,RP13,RP11RP9,RP7,RP5RP3,RP1位便可定位出哪個(gè)Byte出錯(cuò),再用CP5,CP3,CP1定位哪個(gè)Bit出錯(cuò)。

[

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多