基于VDK的嵌入式文件系统实现
3.3 坏块回收
Nand Flash芯片在出厂时就存在随机坏块,同时随着使用时间的推移,一些有效块也会因为编程的原因成为新的坏块,故而存储阵列在使用一段时间后,应当更新坏块信息。考虑到阵列中文件的安全性和完整性,系统设置为存储阵列为空时方能更新坏块信息。
格式化整个阵列后,存储阵列中的FPGA芯片依次读取每个数据块的第一页数据,如果发现非0xFF数据的个数超过设定阈值,就认为此数据块为坏块。之所以设定阈值而不是一有非0xFF数据就视为坏块,是为了克服数据读取的不稳定性。
BF537读取存储阵列传送来最新坏块信息后,按照图2中地址映射表设置的办法,首先更新地址映射缓冲区,随即将地址映射缓冲区的内容实时更新到数据Nor Flash中,保持两者的同步。
由于坏块信息更新的时间可能较长,更新工作放在主线程中可能造成较大时延,影响主线程对用户命令的响应,所以坏块回收与标记可放在子线程中。
3.4 磨损均衡
Nand Flash芯片的编程次数有限,如果对某个数据块操作过于频繁,将迅速缩短其使用寿命,最终成为坏块,乃至影响整个芯片的使用。如果均衡地使用Flash芯片的每个数据块,对其操作的概率在较长时间内大体相当,这样不仅能减少芯片坏块的比例,也能延长存储阵列的使用寿命。
开源和商业的文件系统,都有较为完备的脏块回收和磨损均衡的机制,但是其算法往往较复杂,同时需要将运行信息实时更新到Flash芯片中。在存储速率要求很高的情况下,复杂的机制对存储速率将不可避免地造成影响。
文件系统关于磨损均衡的解决方案主要是顺序存储和阵列整理。文件存储时,并不使用“链式存储”,填充文件删除所留下的“空洞”,而采用“连续存储”的方式,将最新的文件存储到当前所有文件的末尾。这样不仅编程简单,而且存储阵列在一段时间后可能会被耗尽,此时如果删除尾部的某些文件,那么下个的文件可以存储在这些空余出来的位置;如果利用阵列整理功能将当前文件“压缩”为连续紧凑的文件序列,去除文件删除时留下的空洞,这样整理出来的空间也可以继续用于下次存储。
3.5 掉电保护
嵌入式系统硬件平台的工作环境一般较为恶劣,电源模块随时会有停止供电的可能。故而掉电保护是嵌入式文件系统设计的重点和难点。
微软的FNT文件系统的掉电保护主要针对FAT表,本文件系统也是基于这个理念。开始文件存储时,子线程对发送的块地址数目做一个计数,当计数量达到设定的阈值N后,将新文件的信息更新到文件目录表缓冲区中,并立即将文件目录表更新到Nor Flash中,两个更新的操作不能被中断,故而将这段代码推入到关键域中。随后将计数值清零,重新开始前一过程。如果在存储过程中掉电,重新上电启动后,开始新的存储,系统会自动查询存储阵列最后一个文件的状态标记,如果标记为暂存,则判定最后一个文件在存储时遇到了掉电的情况,那么系统自动擦除该文件接下来N个数据块的信息,然后最后一个文件开始新的存储。
文件删除操作是在删除动作完成后才更新文件目录表,如果在删除过程中掉电,那么上电后,用户可以对该文件重新删除。文件的拷贝和剪切是在操作前更新文件目录表,如果在操作过程中出现断电,重新上电后,用户可先删除拷贝后的新的文件,去除残块,然后开始新的操作。
4 结束语
介绍的嵌入式文件系统已在项目中成功投入使用,当然仍有许多方面需要改进。例如文件目录表如果较长,线性遍历耗时也会相对较长;文件目录表没有备份,如果更新文件列表时存储系统出现掉电,该如何应对等。VDK是ADI公司为自己的集成开发环境量身打造的内核,相对于Linux等开源系统来说,使用范围可能较窄,但基于ADI的DSP使用自然有其得天独厚的优势。
- Linux嵌入式系统开发平台选型探讨(11-09)
- VxWorks实时操作系统下MPC8260ATM驱动的实现(11-11)
- VXWORKS内核分析(11-11)
- Linux内核解读入门(11-09)
- linux文件系统基础(02-09)
- 基于Winodws CE的嵌入式网络监控系统的设计与实现(03-05)