如何测试nandflash可靠性
发布网友
发布时间:2022-04-25 00:22
我来回答
共1个回答
热心网友
时间:2023-08-14 04:54
/*说明:测试nandflash的可靠性,有的时候nandflash写进去的内容会变位比如写进去1,可是存储的值变成了0,为了测试这种情况的频率写了下面的测试用例*/
/*nandflash挂载在/home/test目录下,通过不停的往test目录下写两个文件A,B(随便两个文件二进制文件都可以),写进去的文件名和顺序A0,B0,A1,B1,A2,B2....,每写进入一个文件读出来和A或者B比较*/
/*如果一旦发现写满了就删除文件重写继续写,一直持续下去,如果发现读出来的内容和写进入的内容就报错,然后再写一次,如果还错就退出程序*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/statfs.h> //for statfs
#include <sys/vfs.h> //for statfs
#include <sys/types.h>
#include <sys/stat.h> //for stat
#include <sys/time.h>
#include "errno.h"
static int nandflash_wrong=0;
int check_remain_space(void)
{
int stat_flag=0;
int i;
struct statfs nandflash_stat;
long hdisk_remainder_space;
char path_name_check[32];
struct stat name_buf_check;
stat_flag = statfs("/home/test", &nandflash_stat);//获取nandflash的信息
if(stat_flag<0)
{
printf("get nandflash info error!\n");
return -1;
}
hdisk_remainder_space = (float)nandflash_stat.f_bsize * nandflash_stat.f_bfree / 1024;//检测磁盘空间
if(hdisk_remainder_space<8*1024) //至少保留8M的空间
{
for(i=0;i<200;i++)
{
sprintf(path_name_check,"/home/test/A%d",i);
stat(path_name_check,&name_buf_check);
if(errno!=ENOENT) //文件存在,则删除
{
unlink(path_name_check);//不能重名
}
sprintf(path_name_check,"/home/test/B%d",i);
stat(path_name_check,&name_buf_check);
if(errno!=ENOENT) //文件存在,则删除
{
unlink(path_name_check);//不能重名
}
}
sleep(20); //删除文件并不是立即删除,所以要等待文件删除之后再写,防止写的速度比删除速度快,导致磁盘被写满的情况而出错
return 1;
}
return 0;
}
int write_read_nandflash(int mark,unsigned int i,int file_size,char *write_buf,char *read_buf)
{
FILE *fp;
char path_name[32];
unsigned long buf_count=0;
struct stat name_buf;
if( mark == 0 )
{
sprintf(path_name,"/home/test/A%d",i);//生成不同的文件名A0,A1,A2,A3.......
}
else
{
sprintf(path_name,"/home/test/B%d",i);
}
stat(path_name,&name_buf);
if(errno!=ENOENT) //文件存在,则删除
{
unlink(path_name);//不能重名
sleep(3);
}
if((fp=fopen(path_name,"w"))==NULL)
{
printf("fopen failed!\n");
return -1;
}
fwrite(write_buf,file_size,1,fp);
fclose(fp);
// printf("write file name is:%s\n",path_name);
if((fp=fopen(path_name,"r"))==NULL)
{
printf("fopen failed!\n");
return -1;
}
fread(read_buf,file_size,1,fp);
for(buf_count=0;buf_count<(file_size-1);buf_count++)//将master/slave文件写到nandflash中的内容读出来比较
{
if(read_buf[buf_count]!=write_buf[buf_count])
{
system("date");//出错的时候打印的系统时间
printf("file name is %s:\n",path_name);
unlink(path_name);
sleep(3);
if((fp=fopen(path_name,"w"))==NULL)
{
printf("fopen failed!\n");
return -1;
}
nandflash_wrong++;
fwrite(write_buf,file_size,1,fp);//出错之后再写一次
fclose(fp);
if((fp=fopen(path_name,"r"))==NULL)
{
printf("fopen failed!\n");
return -1;
}
fread(read_buf,file_size,1,fp);
for(buf_count=0;buf_count<(file_size-1);buf_count++)
{
if(read_buf[buf_count]!=write_buf[buf_count])
{
printf("file name is %s:\n",path_name);
printf("write twice failed!\n");
fclose(fp);
return -1;
}
}
}
}
fclose(fp);
return 0;
}
int main(void)
{
int A_size,B_size;
A_size=B_size=0;
int A_fd,B_fd;
char *A_buf_read=NULL;
char *B_buf_read=NULL;
char *A_buf_write=NULL;
char *B_buf_write=NULL;
unsigned int iteation=0;
int ret;
A_fd=0;
A_fd=open("/home/A",O_RDONLY);
if(A_fd<0)
{
printf("open A faild!\n");
return -1;
}
A_size=lseek(A_fd,0,SEEK_END);
lseek(A_fd,0,SEEK_SET);
A_buf_write=(char *)malloc(A_size);
if(NULL == A_buf_write)
{
printf("A_buf_write malloc failed!\n");
close(A_fd);
return -1;
}
A_buf_read=(char *)malloc(A_size);
if(NULL == A_buf_read)
{
printf("A_buf_read malloc failed!\n");
close(A_fd);
return -1;
}
if(read(A_fd,A_buf_write,A_size)<0)
{
close(A_fd);
printf("read A file failed\n");
}
close(A_fd);
B_fd=0;
B_fd=open("/home/B",O_RDONLY);
if(B_fd<0)
{
printf("open B faild!\n");
return -1;
}
B_size=lseek(B_fd,0,SEEK_END);
lseek(B_fd,0,SEEK_SET);
B_buf_write=(char *)malloc(B_size);
if(NULL == B_buf_write)
{
printf("B_buf_write malloc failed!\n");
close(B_fd);
return -1;
}
B_buf_read=(char *)malloc(B_size);
if(NULL == B_buf_read)
{
printf("B_buf_read malloc failed!\n");
close(B_fd);
return -1;
}
if(read(B_fd,B_buf_write,B_size)<0)
{
printf("read B file failed\n");
close(B_fd);
}
close(B_fd);
system("date");//测试开始,开始读写nandflash
while(1)
{
if((ret=check_remain_space())<0)//检测磁盘空间,小于8M,要删除文件重新从A0,B0,A1,B1,A2,B2。。。。写
{
printf("check space wrong\n");
return -1;
}
else if(ret==1)
{
iteation=0;
}
if(write_read_nandflash(0,iteation,A_size,A_buf_write,A_buf_read)<0)//write A to nand and read it to compare
{
printf("write_read nand flash wrong\n");
return -1;
}
if(write_read_nandflash(1,iteation,B_size,B_buf_write,B_buf_read)<0)//write B
{
printf("write_read nand flash wrong\n");
return -1;
}
iteation++;
}
return 0;
}
如何测试nandflash可靠性
/*说明:测试nandflash的可靠性,有的时候nandflash写进去的内容会变位比如写进去1,可是存储的值变成了0,为了测试这种情况的频率写了下面的测试用例*/ /*nandflash挂载在/home/test目录下,通过不停的往test目录下写两个文件A,B(随便两个文件二进制文件都可以),写进去的文件名和顺序A0,B0,A1...
ZESTRON电子失效分析
电子失效分析是指对电子元件或系统进行系统调查,以确定失效原因。通过显微镜、光谱学和电气测试等技术,分析人员可以查明导致故障的缺陷或问题。此过程包括检查物理损坏、分析电气特性和进行环境测试以确定根本原因。电子故障分析在半导体制造...
NAND flash和NOR flash的区别详解
采用flahs介质时一个需要重点考虑的问题是可靠性。对于需要扩展MTBF的系统来说,Flash是非常合适的存储方案。可以从寿命(耐用性)、位交换和坏块处理三个方面来比较NOR和NAND的可靠性。五、NAND flash和NOR flash的寿命(耐用性)在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。NAND...
nor flash 和nand flash 的区别
另外由于NandFlash没有挂接在地址总线上,所以如果想用NandFlash作为系统的启动盘,就需要CPU具备特殊的功能,如s3c2410在被选择为NandFlash启动方式时会在上电时自动读取NandFlash的4k数据到地址0的SRAM中。如果CPU不具备这种特殊功能,用户不能直接运行NandFlash上的代码,那可以采取其他方式,比如好多使用Na...
Nand Flash硬件ECC是怎样实现的?
因为NAND FLASH的数据可靠性问题一般使用NAND FLASH都需要对其数据进行ECC校验。一般的用法是在写入NAND FLASH时在主数据区内写入正常数据,而住数据区数据的ECC校验码则写入Spare区。将住数据区数据读出时Spare区的ECC码也必须一起读出以便进行ECC校验及纠错。基本上若是读出数据后发现ECC校验失败则当前块必...
NAND flash和NOR flash的区别详解
1、接口差别 nor flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。nand flash使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。8个引脚用来传送控制、地址和数据信息。2、容量和成本不同 nand flash的单元尺寸几乎是NOR器件的一半,由于生产过程更...
NAND Flash和Nor Flash到底有什么区别
容量差别:Nand Flash容量要比Nor Flash大得多,Nand:8M-4GB.Nor:1-32MB,因此对于嵌入式设备,Nand可以作为U盘或SD存储介质,Nor可以用来存储程序,如果不太考虑速度,代码可以在其中运行。使用时间:Nand Flash是Nor Flash的十倍,Nand Flash是100万次擦写,Nor是10万次。数据可靠性:Flash器件内部都是...
nor flash和nand flash的区别
(6)可靠性和耐用性 -寿命(耐用性)在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。NAND存储器除了具有10比1的块擦除周期优势,典型的NAND块尺寸要比NOR器件小8倍,每个NAND存储器块在给定的时间内的删除次数要少一些。-位交换 所有flash器件都受位交换现象的困扰。位真的...
NOR型flash vs NAND型flash
接口差异NOR有SRAM接口,寻址方便,而NAND则使用复杂I/O接口,操作块更大,类似硬盘管理,适用于数据密集型应用。容量和成本NAND由于生产过程简单,容量更大,成本更低,主要应用于数据存储,如CompactFlash、Secure Digital等。NOR则在小容量代码存储中占主导。可靠性和耐用性NAND的耐用性优于NOR,每块擦写...
Nand flashNAND特点
可靠性是使用闪存时需要考虑的关键因素。NAND的块擦写次数远高于NOR,且块尺寸小,删除次数少,具有更好的耐用性。NAND更常受位交换困扰,需配合错误探测/纠正算法。坏块处理上,NAND需要初始化扫描以标记坏块,而NOR则通过全部写1来擦除,时间差异大。NAND的使用更为复杂,需要驱动程序支持,如内存技术...
三星的系列NandFlash有什么区别
在一次读写中MLC有四种状态(以每Cell存取2bit为例),这就意味着MLC存储时要更精确地控制每个存储单元的充电电压,读写时就需要更长的充电时间来保证数据的可靠性。它已经不再是简单的开关电路,而是要控制四种不同的状态,这在产品的出错率方面和稳定性方面有较大要求,而且一旦出现错误,就会导致2倍...