纠错码(Error correction code,ECC)中的汉明码,NAND FLASH中的纠错码(第二部分)

     这里接:纠错码(Error correction code,ECC)中的汉明码,NAND FLASH中的纠错码(第一部分)
     这对于第三种情况,得到异或结果之后可以很容易的定位到出错的哪一个比特位所在的位置,现在我们举一个简单的例子,假设按照上面的方法计算2个字节数据的冗余 E C C ECC ECC数据,这里冗余 E C C ECC ECC数据应该为8个比特位,如图13所示。

  纠错码(Error correction code,ECC)中的汉明码,NAND FLASH中的纠错码(第二部分)_第1张图片
图13.

     假设现在得到的异或结果如图14所示。

  1. 首先根据异或结果中 p 8 p_8 p8 p 8 ′ p_8^{'} p8对应的的值可以确定出错的比特位位于第一个字节中(索引从0开始)。这是因为 p 8 = 1 p_8=1 p8=1且只有第一个字节参与了 p 8 p_8 p8的运算,第0个字节没有参与 p 8 p_8 p8的运算。
  2. 根据异或结果中 p 4 p_4 p4 p 4 ′ p_4^{'} p4对应的的值可以确定出错的比特位位于第一个字节中(索引从0开始)的 B i t   3 , B i t   2 , B i t   1 , B i t   0 Bit\ 3,Bit\ 2,Bit\ 1,Bit\ 0 Bit 3,Bit 2,Bit 1,Bit 0中,这是因为 p 4 ′ = 1 p_4^{'}=1 p4=1且每个字节中只有 B i t   3 , B i t   2 , B i t   1 , B i t   0 Bit\ 3,Bit\ 2,Bit\ 1,Bit\ 0 Bit 3,Bit 2,Bit 1,Bit 0参与了 p 4 ′ p_4^{'} p4的运算, B i t   7 , B i t   6 , B i t   5 , B i t   4 Bit\ 7,Bit\ 6,Bit\ 5,Bit\ 4 Bit 7,Bit 6,Bit 5,Bit 4没有参与 p 4 ′ p_4^{'} p4的运算。
  3. 根据异或结果中 p 2 p_2 p2 p 2 ′ p_2^{'} p2对应的的值可以确定出错的比特位位于第一个字节中(索引从0开始)的 B i t   3 , B i t   2 Bit\ 3,Bit\ 2 Bit 3,Bit 2中,这是因为 p 2 = 1 p_2=1 p2=1且每个字节中只有 B i t   7 , B i t   6 , B i t   3 , B i t   2 Bit\ 7,Bit\ 6,Bit\ 3,Bit\ 2 Bit 7,Bit 6,Bit 3,Bit 2参与了 p 2 p_2 p2的运算, B i t   5 , B i t   4 , B i t   1 , B i t   0 Bit\ 5,Bit\ 4,Bit\ 1,Bit\ 0 Bit 5,Bit 4,Bit 1,Bit 0没有参与 p 2 p_2 p2的运算。
  4. 根据异或结果中 p 1 p_1 p1 p 1 ′ p_1^{'} p1对应的的值可以确定出错的比特位位于第一个字节中(索引从0开始)的 B i t   3 Bit\ 3 Bit 3中,这是因为 p 1 = 1 p_1=1 p1=1且每个字节中只有 B i t   7 , B i t   5 , B i t   3 , B i t   1 Bit\ 7,Bit\ 5,Bit\ 3,Bit\ 1 Bit 7,Bit 5,Bit 3,Bit 1参与了 p 1 p_1 p1的运算, B i t   6 , B i t   4 , B i t   2 , B i t   0 Bit\ 6,Bit\ 4,Bit\ 2,Bit\ 0 Bit 6,Bit 4,Bit 2,Bit 0没有参与 p 1 p_1 p1的运算。
 
图14.

     从图14中我们也可以知道 < p 8 , p 4 , p 2 , p 1 > = < 1 , 0 , 1 , 1 > =<1,0,1,1> <p8,p4,p2,p1>=<1,0,1,1>,其中行冗余数据对应的 < p 8 > <p8>的二进制值 1 1 1的十进制就是1,列冗余数据对应的 < p 4 , p 2 , p 1 > <p4,p2,p1>的二进制值 011 011 011的十进制就是3,大家看到没有前面我们得到的结果确定的出错的比特位的只是第1个字节的第3个比特位。这里不是巧合,这里也是这里采用的编码算法的巧妙之处。在得到 E C C ECC ECC冗余数据的异或结果之后,如果确认是第三种情况,那么只需要用 p n , n = 1 , 2 , 4 , 8 , . . . , 1024 , 2048 p_n,n=1,2,4,8,...,1024,2048 pn,n=1,2,4,8,...,1024,2048(这里针对的是512字节的数据块)就可以确定出错的那个比特位所在的位置,比特位所在的位置可以用 < p 2048 , p 1024 , p 512 , . . . , p 1 > , < p 4 , p 2 , p 1 > , <p2048,p1024,p512,...,p1>,<p4,p2,p1>确定,其中 < p 2048 , p 1024 , p 512 , . . . , p 1 > <p2048,p1024,p512,...,p1>表示的二进制值确定出错的那个比特位所在的字节数据的位置, < p 4 , p 2 , p 1 > <p4,p2,p1>表示的二进制值确定出错的那个比特位所在的字节数据中比特位的位置。这里不是凭空猜测的。因为从纠错码(Error correction code,ECC)中的汉明码,NAND FLASH中的纠错码(第一部分)的图10中我们可以看到用来计算 p n , n = 1 , 2 , 4 , 8 , . . . , 1024 , 2048 p_n,n=1,2,4,8,...,1024,2048 pn,n=1,2,4,8,...,1024,2048的数据总是位于某一块数据的高的部分,例如计算 p 1 p_1 p1的比特位是两个比特位中的高位(比特7和比特6中的比特7,比特5和比特4中的比特5,比特3和比特2中的比特3,比特1和比特0中的比特1),计算 p 2 p_2 p2的比特位是四个比特位中的高2位(比特7,比特6,比特5和比特4中的比特7和比特6,比特3,比特2,比特1和比特0中的比特3和比特2),计算 p 1 p_1 p1的比特位是8个比特位中的高4位(比特7,比特6,比特5,比特4,比特3,比特2,比特1和比特0中的比特7和比特6,比特5和比特4)。还有计算 p 2048 p_{2048} p2048的字节数据是512个字节数据的高256个字节等等。所以只需要用 p n , n = 1 , 2 , 4 , 8 , . . . , 1024 , 2048 p_n,n=1,2,4,8,...,1024,2048 pn,n=1,2,4,8,...,1024,2048(这里针对的是512字节的数据块)就可以确定出错的那个比特位所在的位置。因为如果 p n = 1 p_n=1 pn=1,则表明出错的位置位于高的部分,如果 p n = 0 p_n=0 pn=0,则表明出错的位置位于低的部分,因此用 p n p_n pn的0值和1值就可以确定出错的位置了。
     以上对 N A N D F L A S H NAND\quad FLASH NANDFLASH厂商的文档的介绍是基于图1中的文档,图8和图9中描述的汉明码的 E C C ECC ECC和图7中的文档描述的基本一致,但是由几个地方似乎有差异,我不知道是不是文档写错了还是咋了,我这里也不去纠结了。直接把这几处地方贴出来:首先是图8和图9中在描述计算 E C C ECC ECC冗余数据的伪代码中的那个索引 i i i应该从 0 − > 255 0->255 0>255而不是 1 − > 256 1->256 1>256否则会和文档中后面的结论优点对不上,然后在计算 L P 0 LP0 LP0的时候,每次参与运算的应该是 L P 0 LP0 LP0,而不是 L P 1 LP1 LP1,这里 L P 0 LP0 LP0和前面的 p 8 ′ p_{8^{'}} p8对应,这里 L P 1 LP1 LP1和前面的 p 8 p_{8} p8对应。如图15和图16所示。

  纠错码(Error correction code,ECC)中的汉明码,NAND FLASH中的纠错码(第二部分)_第2张图片
图15.
  纠错码(Error correction code,ECC)中的汉明码,NAND FLASH中的纠错码(第二部分)_第3张图片
图16.

     上面的我感觉好像是文档写错了,但是图9中的文档在描述512字节的数据块的计算 E C C ECC ECC冗余数据的伪代码中,在选择计算 L P 16 LP16 LP16 L P 17 LP17 LP17的字节数据的时候居然用的是 0 x A 0 0xA0 0xA0而不是 0 x 100 0x100 0x100,这里我就优点郁闷了,不知道这里是厂商对算法的特别处理或者还是其它原因。如图17所示。

  纠错码(Error correction code,ECC)中的汉明码,NAND FLASH中的纠错码(第二部分)_第4张图片
图17.

你可能感兴趣的:(stm32,arm,嵌入式硬件,算法)