轩辕剑6无法添加物品:NAND FLASH块管理

来源:百度文库 编辑:九乡新闻网 时间:2024/10/04 06:34:17
nandflash中擦除都是采用块擦除,所以对于nand,最小的操作单位就意味着是块,除非在设计中加缓存区,对擦除块的数据读写出来,修改后再擦除。这样的话最小操作单位就是bit了。

       因为现在做的这个项目是无操作系统的ARM7对nand的管理,nand主要用于存储图片信息,所以基本上是一次烧写,无限读取,所以相对来说还是比较好实现,不过我也处于对以后升级功能的兼容,对读写操作也有一定的出来,下面就具体说说我这个设计的思路。

      nand 芯片资料 512字节/页 32页/块   1024块/芯片   

      nand 缓冲区512字节

     nand 文件系统管理单元体积 16kB    

文件管理单元的结构体

UINT32 保留数; //目前没使用,计划用于记录存储写入次数等日志信息

UINT32   File_Num_Flag;文件编号,用高四位做标识,用于标记本块是否为坏块,低28位为文件编号

UINT32 SIZE ;       // 本链表的尺寸    块为单位

UINT32 NEXT;    //下一链表的位置   因为是顺序编号,所以不用地址,只要地址编号就能计算出地址

};

结构体数量 为块数量 1024,结构体尺寸16字节,刚好占有一个块单元,做三表冗余,占有三个块;

       内存初始化时需要完成的工作有:识别块是否是坏块,扫描排除坏块的连续块的尺寸和next 块的编

号,这样就建立了一个块的链表,链表尺寸不定,个数也不定的,当然坏块越少,分割的越少,扫描整个链

表数度将最快。

       写入数据,入口参数为 file 结构体指针,结构体带有的参数为 文件编号和文件缓存地址(我用在

SDRAM中的固定位置);返回参数为写标识;

      首先识别出文件的尺寸,这个使用文件缓存地址读出文件头即可识别,再计算需要的块的数量,然后通

过链表判断有多少空闲空间,并且找到能存储的链表起始块的位置,如果无足够空间则返回空间不足;

     在就是判断是否有同编号的文件存在,若存在则删除原块链表中的词文件编号;

这时就可以开始存储了,存储之前,先保存前一块的编号,用于当存储某一块失败时的恢复错误,下一步就

是按照找到的空闲表的首地址开始存储,这里需要注意的是硬件上需要保证存储nand 时带入的地址指针位

置,不能直接用SDRAM,因为这两个芯片一般在一个总线上,互相直接转移数据时,nand的时序要求就无

法满足,所以建立了512字节的缓存用于读取和写入SDRAM,擦除这一块或者是写入后,读取ECC存储状

态是否写正常或者直接读出数据校验,如发生错误则使用恢复编号,并修改链表删除该块,然后从恢复的编

号重新存储,这时需要判断空间是否还够用,如果因为产生了坏块而导致空间不足,则需要将原文件的所有

编号删除,否则则会导致文件存储不全,返回前更新链表,通过这些步骤,这样就能正确的存储数据了,并

且在出现错误的时候能及时返回错误信息。

       这个程序里,目前尚未实现的功能是记录块的写入次数,没有通过这个来平衡写入,但是在这个项目中

主要是一次写入,多次读取,所以目前来说,没有这个功能并不影响使用,如果需要增加的话,则可以通过

链表管理的结构体的第一个参数进行记录写入次数,然后通过一定的算法实现平衡写入。这也是作为下一步

的安排。

    关于这个的读取就相对比较容易了,就是搜索整个链表中属于该文件的文件编号的块,依次读出即可,

通过实际实验,我发现读取的速度是很快的。

    下次主要讲解显示中文和ASIC字符方法。