您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术基于NAND Flash的转译层的设计 正文
基于NAND Flash的转译层的设计

基于NAND Flash的转译层的设计

点击数:7715 次   录入时间:03-04 11:51:34   整理:http://www.55dianzi.com   嵌入式系统-技术
3.4 坏块处理
    对映射后的地址进行写或擦除过程中发现当前块变坏的处理方法:首先查找映射区中的块状态FlashRemapBlockStatus[FLASH_BAD_BLOCKS_REMAP],寻找可用的映射块。如果50个重映块都被标记为坏或已使用,则程序进入死循环;如果找到可用的映射块,则固件对可能出现坏块的三种情况进行散转:(1)擦除当前块时出错:将当前块地址与可用的重映块地址写入BBI表中,按地址大小排列有利于二分法查表,并返回重映块地址。(2)复制某页从交换区到操作地址时失败:首先获得当前使用的交换块的块地址,然后判断操作地址是在数据存储区还是在重映区。如果在重映区,说明当前操作地址所对应的在数据存储区中的块已经是坏块,并且在这次操作中重映块也变坏,此时就应该标记当前映射块状态为坏,并在重映区中寻找下一个可用重映块,将原来在数据存储区中的块地址与更新后的映射块地址写入BBI表中,并返回新的映射后的地址;如果在数据存储区,就进行第一次重映射,更新坏块表,并且将映射地址返回。然后再完成复制工作。(3)向操作地址写一页数据时出错:将当前地址所在块中的前面页从交换块中相应地址复制到重映块,然后将操作地址所在当前页中的没有写到的数据从交换块中复制,并将缓冲区中的数据重新写到重映射的地址中,并返回重映射地址。函数实现如下:

www.55dianzi.com
    DWORD FlashDealBadBLOCk(DWORD Addr,DWORD Type)
    {
     DWORD i;
     DWORD RemapBlockAddr;
     DWORD SwapBlockAddr;
    while(1)
    {
        RemapBlockAddr=FlashGetNewRemapBlock();
        if(RemapBlockAddr==-1)
         return Addr;
        switch(Type)
         { case 1:
           goto Exit;
           break;
           case 2:
           SwapBlockAddr=FlashGetCurrentSwapBlock();
        for(i=0;i<(Addr&(FLASH_BLOCK_SIZE-1))/
FLASH_PAGE_SIZE+1;i++)
         {
         if(0x00==(FlashCopyPage(SwapBlockAddr+
i*FLASH_PAGE_SIZE,RemapBlockAddr+
i*FLASH_PAGE_SIZE)))
            goto BadRemapBlock;
           }
         goto Exit;
         break;
         case 3:
         SwapBlockAddr=FlashGetCurrentSwapBlock();
         for(i=0;i<(Addr&(FLASH_BLOCK_SIZE-1))/
FLASH_PAGE_SIZE;i++)
           {
         if(0x00==(FlashCopyPage(SwapBlockAddr+
i*FLASH_PAGE_SIZE,RemapBlockAddr+
i*FLASH_PAGE_SIZE)))
            goto BadRemapBlock;
          }
         if(0x00==(FlashCopyPage(Addr,RemapBlockAddr+
i*FLASH_PAGE_SIZE)))
            goto BadRemapBlock;
         goto Exit;
         break;
         default:
         break;
    }
    BadRemapBlock:    FlashMarkRemapBlockBad
(RemapBlockAddr);
}
    Exit:FlashUpdateBadBlockTable(Addr,RemapBlockAddr);
    return RemapBlockAddr+(Addr&(FLASH_BLOCK_SIZE-1));
}
3.5 连续读写操作
    当主机与设备建立批量传输数据连接时,固件通过解析CBW封包获得起始LBA。对该地址进行映射和坏块管理从而获得PBA。设置一个变量,当此变量有效时,表示主机对Flash仍需要读或写数据,直到此变量失效为止。同时将主机上一次读写扇区的地址存入另一个变量,此变量在连续读中作用不大,但在连续写时,通过与上一次写操作地址所在块做比较,判断是否同属一个块,以此决定是不是需要进行地址跨块处理。
    本文设计了一种针对NAND型的闪存转译层,使NFTL完成地址映射和坏块管理以及连续读写数据的操作。对NAND Flash的分区设计,使块管理结构清晰,有利于固件的开发。本文没有对Flash的ECC校验进行过多的设计,这是因为在实际应用中NAND Flash主要用于存储多媒体数据(图片、语音文件)等,并不会对它进行频繁的写入或擦除操作,而且多媒体文件数据对数据的完整性不敏感[5],所以不需要对存储在其中的每一位数据进行严格的ECC校验,可以通过另外设计简单的校验方法来代替ECC校验。
参考文献
[1] 张雪,杨春林,黄娟.NAND Flash文件系统的设计与实现[J].福建电脑,2007,24(10):147-148.
[2] 罗晓,刘昊.一种基于FAT文件系统的NAND Flash坏块处理方法[J].电子器件,2008,31(2):716-718.
[3] 郑桂芬.基于USB的可移动闪盘技术探讨[J].计算机工程,2003,29(7):195-197.
[4] 刘荣.圈圈教你玩USB[M].北京:北京航空航天大学出版社,2009.
[5] 杨玲,袁光涛.大容量NAND Flash在多媒体手机中的应用[J].科技咨询导报,2007,4(1):22-24.



上一页  [1] [2] 


本文关键字:FLASH  嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术