首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

用来数据纠错的ECC(内存纠错技术),能不能使用更少的纠错位

2013-08-22 
用于数据纠错的ECC(内存纠错技术),能不能使用更少的纠错位http://zh.wikipedia.org/zh-cn/%E7%BA%A0%E9%94

用于数据纠错的ECC(内存纠错技术),能不能使用更少的纠错位
http://zh.wikipedia.org/zh-cn/%E7%BA%A0%E9%94%99%E5%86%85%E5%AD%98

对一个字节8位数据位,计算n位的纠错位,用于对数据位和纠错位纠错。
即在数据位只有1位出错时,能恢复正确的数据
在纠错位只有1位出错时,也能恢复正确的数据

数据位和纠错位共(8+n)位
假设这(8+n)位中最多只有1个位出错,或者没有位出错

在纠错位和数据位最多只有1个位出错翻转时,n能达到的最小值能小于5吗
有没有比ECC使用的位数更少的方法
ECC是不是只在一个数据位和纠错位单元只发生一位翻转时,才能纠错?

#include <iostream>

using namespace std;

//用xor做筛子,相当于分组做奇偶校验,maskbits[4][8]:4个用于8位数据的筛子
//该方法只能对数据位和纠错位单元中,只有1个位发生位翻转时能纠错
int maskbits[4][8]={{1,1,1,1,1,1,1,1},{1,1,1,1,0,0,0,0},{1,1,0,0,1,1,0,0},{1,0,1,0,1,0,1,0}};

void CreateData(int data,int* databits,int* databits_check);
void RestoreData(int* databits,int* databits_check);
void PrintBits(int* value,int value_count);

int main()
{
int data;
int databits[8];
int databits_check[5];

int i,j,k;
for (i=0;i<256;++i)
{
data=i;

CreateData(data,databits,databits_check);

cout<<"生成的数据位为:";
PrintBits(databits,8);
cout<<"生成的校验位为:";
PrintBits(databits_check,5);
//system("PAUSE");

for (j=0;j<8;++j)
{
cout<<"让第"<<j<<"个数据位发生错误"<<endl;
databits[j]=1-databits[j];

RestoreData(databits,databits_check);
}
cout<<endl;

for (j=0;j<5;++j)
{
cout<<"让第"<<j<<"个校验位发生错误"<<endl;
databits_check[j]=1-databits_check[j];

RestoreData(databits,databits_check);
}
cout<<endl<<endl;
}
return 0;
}

void CreateData(int data,int* databits,int* databits_check)
{
int j,k;
for (j=0;j<8;++j)
{
databits[j]=(data>>j)&1;
}

for (j=0;j<4;++j)
{
databits_check[j]=databits[0] & maskbits[j][0];
for (k=1;k<8;++k)
{
databits_check[j]^=databits[k] & maskbits[j][k];
}
}
databits_check[4]=databits_check[0]^databits_check[1]^databits_check[2]^databits_check[3];
return;
}

void RestoreData(int* databits,int* databits_check)
{
int j,k;
int databits_check_temp[5];
for (j=0;j<5;++j)
{
databits_check_temp[j]=databits[0] & maskbits[j][0];
for (k=1;k<8;++k)
{
databits_check_temp[j]^=databits[k] & maskbits[j][k];
}
}
int databits_checkup=databits_check[0]^databits_check[1]^databits_check[2]^databits_check[3];

if (databits_check_temp[0]==databits_check[0]||databits_checkup!=databits_check[4])//数据位没有发生错误,或校验位发生错误


{
for (j=0;j<4;++j)
{
databits_check[j]=databits_check_temp[j];
}
databits_check[4]=databits_check[0]^databits_check[1]^databits_check[2]^databits_check[3];
}else{//数据位发生错误且校验位没有错误
if (databits_check_temp[1]==databits_check[1])  //{1,1,1,1,0,0,0,0}这四个0所在的数据位发生错误
{
if (databits_check_temp[2]==databits_check[2])
{
if (databits_check_temp[3]==databits_check[3])
{
databits[7]=1-databits[7];
}else{
databits[6]=1-databits[6];
}
}else{
if (databits_check_temp[3]==databits_check[3])
{
databits[5]=1-databits[5];
}else{
databits[4]=1-databits[4];
}
}
}else{//{1,1,1,1,0,0,0,0}这四个1所在的数据位发生错误
if (databits_check_temp[2]==databits_check[2])
{
if (databits_check_temp[3]==databits_check[3])
{
databits[3]=1-databits[3];
}else{
databits[2]=1-databits[2];
}
}else{
if (databits_check_temp[3]==databits_check[3])
{
databits[1]=1-databits[1];
}else{
databits[0]=1-databits[0];
}
}
}
}

cout<<"修复后的数据位为:";
PrintBits(databits,8);
cout<<"修复后的校验位为:";
PrintBits(databits_check,5);
cout<<endl;

return;
}

void PrintBits(int* value,int value_count)
{
int j;
for (j=0;j<value_count;++j)
{
cout<<value[j];
}
cout<<endl;

return;
}


[解决办法]
ECC是64位,多用8位,纠1检2。

>在纠错位和数据位最多只有1个位出错翻转时,n能达到的最小值能小于5吗
看你需求,检1的话1位就够。8位纠1的话理论下界需要多4位。

热点排行