实验40 NAND FLASH实验中FTL_Format有bug?

2019-07-20 11:58发布

本帖最后由 magicoctoy 于 2017-9-16 21:51 编辑

在ftl.c文件中的FTL_Format函数如下:
//格式化NAND 重建LUT表
//返回值:0,成功
//    其他,失败
u8 FTL_Format(void)
{
    u8 temp;
    u32 i,n;
    u32 goodblock=0;
        nand_dev.good_blocknum=0;
#if FTL_USE_BAD_BLOCK_SEARCH==1                                //使用擦-写-读的方式,检测坏块
        nand_dev.good_blocknum=FTL_SearchBadBlock();//搜寻坏块.耗时很久
#else                                                                                //直接使用NAND FLASH的出厂坏块标志(其他块,默认是好块)
    for(i=0;i<nand_dev.block_totalnum;i++)       
    {
                temp=FTL_CheckBadBlock(i);                        //检查一个块是否为坏块
        if(temp==0)                                                        //好块,!!!既然是好块,为什么还要擦除整个块区,而不是坏块需要擦除!!!
        {
                        temp=NAND_EraseBlock(i);
                        if(temp)                                                //擦除失败,认为坏块
                        {
                                printf("Bad block:%d ",i);
                                FTL_BadBlockMark(i);                //标记是坏块
                        }else nand_dev.good_blocknum++;        //好块数量加一
                }
        }
#endif
    printf("good_blocknum:%d ",nand_dev.good_blocknum);
    if(nand_dev.good_blocknum<100) return 1;        //如果好块的数量少于100,则NAND Flash报废   
    goodblock=(nand_dev.good_blocknum*93)/100;        //%93的好块用于存储数据  
    n=0;                                                                               
    for(i=0;i<nand_dev.block_totalnum;i++)                //在好块中标记上逻辑块信息
    {
        temp=FTL_CheckBadBlock(i);                          //检查一个块是否为坏块
        if(temp==0)                                          //好块
        {
            NAND_WriteSpare(i*nand_dev.block_pagenum,2,(u8*)&n,2);//写入逻辑块编号
            n++;                                                                //逻辑块编号加1
            if(n==goodblock) break;                                //全部标记完了
        }
    }
    if(FTL_CreateLUT(1))return 2;                              //重建LUT表失败
    return 0;
}











友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。