一种基于MCU的片外FLASH文件系统的读写方法
技术领域
本发明涉及微控制单元技术领域,尤其是涉及一种基于MCU的片外FLASH文件系统的读写方法。
背景技术
MCU(Micro Control Unit)中文名称为微控制单元,是指随着大规模集成电路的出现及其发展,将计算机的CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。因其片内集成ROM(只读内存)和RAM(随机存储器)资源,使用方便,成本低廉,广泛应用于各个领域。但由于其片内FLASH(闪存)容量通常较小,在有大容量存储需求的应用场景,通常使用外接大容量串行FLASH存储芯片以满足需求,如图1所示:MCU和外接FLASH连接,以MCU为核心设置以太网接口和调试串口用于通信和调试。文件系统是用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。而文件系统的使用会使得对于FLASH存储空间的分配和回收、文件的存储与拷贝、磨损平衡的处理等更为方便。由于FALSH擦除与写入必须按照以最小存储块为单元进行,通常为64KB或者更大,采用常用的文件系统的程序实现方法,必须在RAM开辟数个与存储块大小相等的存储空间,以供写FLASH时数据缓存。而这种实现方式对于RAM资源极其有限的MCU来说,几乎不可能实现。
发明内容
本发明公开了一种基于MCU的片外FLASH文件系统的读写方法,解决了利用MCU较少RAM资源实现文件系统对FLASH块读写缓冲的需求。
本发明的技术方案为一种基于MCU的片外FLASH文件系统的读写方法,在片外FLASH的文件系统和片外FLASH的驱动层之间增加逻辑转换层,所述逻辑转换层将片外FLASH的每一个物理sector划分为若干个与逻辑sector大小相等的区域并分配序号,基于逻辑转换层的读写操作实现方式如下,
在文件系统初始化阶段,逻辑转换层在将文件系统上所有逻辑sector分别映射到片外FLASH的物理sector中,将映射信息记录到物理sector的映射表,所述映射信息包括逻辑sector映射到物理sector的地址信息和逻辑sector在物理sector中的区域序号,所述逻辑sector映射到物理sector的地址信息包括逻辑sector地址和物理sector地址;
当文件系统进行读取操作时,逻辑转换层根据需要执行读操作的逻辑sector地址,首先查询映射表获得映射信息,然后读取相应的物理sector地址和区域序号并返回给文件系统,片外FLASH的驱动层根据直接读取物理sector中对应区域的信息;
当文件系统进行写入操作时,逻辑转换层申请片外FLASH中的空闲区域,并将逻辑sector的新信息写入,然后将逻辑sector重新映射到片外FLASH的物理sector中,修改映射表记录重新映射的映射信息;
描述ctor用扇区少于用户要申请写入的扇区时,逻辑转换层就启动机 逻辑转换层始终保留片外FLASH的部分物理sector的所有区域处于空闲状态,将这部分物理sector作为回收中转区, 当文件系统中的可用空闲区域少于用户要申请写入的区域时,逻辑转换层启动垃圾回收;垃圾回收方式为,逻辑转换层统计各物理sector中垃圾区域的数量,根据垃圾区域的多少依次对物理sector进行回收;对于某个待回收的物理sector,逻辑转换层启用回收中转区的物理sector空闲区域,将待回收物理sector中的有用区域以单个区域为单位拷贝到回收中转区保留的空闲区域中;同时更新映射表重新建立映射,垃圾回收之后的空闲区域除作为新的回收中转区外,其余部分全部释放供重新申请。
而且,当文件系统进行写入操作时,若只对整个物理sector中部分区域进行写操作,则对物理sector中的其他区域全部写入0xff。
本发明包含的主要特点在于:(1)区别于常用文件系统,不直接由文件系统对实际FLASH物理sector(扇区)进行管理和读写。(2)将文件系统的逻辑sector大小设定为远小于(几分之一到几十分之一)FLASH芯片物理sector(物理可擦写块)容量,使得占用的缓存RAM资源大大降低。(3)在文件系统对逻辑sector的读写擦除等操作和FASLH驱动之间增加逻辑转换层,做逻辑扇区和物理地址之间的转换,解决逻辑sector和实际物理sector大小不一致的问题。(4)逻辑转换层主要特点就是将一个物理sector划分为若干个与逻辑sector大小相等的区域。(5)逻辑转换层核心功能就是建立文件系统逻辑sector到物理sector的映射表(MAP表),其中一个逻辑sector只能映射到一块物理sector,而物理sector容量远大于逻辑sector,所以可以有多个逻辑sector映射到同一个物理sector中不同的区域,所有的映射信息都记录在该映射表中。(6)对于文件系统对逻辑sector的读操作,查找映射表获取物理sector地址和块内序号,直接读取就可以实现。(7)对于文件系统对逻辑sector的写操作,首先根据映射表获取物理sector地址和块内序号,为避免对整个物理sector的其他逻辑sector数据擦除,逻辑转换层将申请一个新的物理扇区或块内申请新的序号空间,将数据写入,重新建立正确的映射关系。采用本发明的优点是:能够降低文件系统对RAM资源的利用,使得在资源有限的MCU处理器上实现外接FLASH的文件系统,非常有利于对FLASH的管理,降低编程难度。
附图说明
图1为本发明运行的硬件系统框图;
图2为本发明实施例的逻辑转换层位置图;
图3为本发明实施例的读操作流程示意图;
图4为本发明实施例的写操作流程示意图;
图5为本发明实施例的物理sector垃圾回收之前存储区状态示意图;
图6为本发明实施例的物理sector垃圾回收完成存储区状态示意图。
具体实施方式
以下结合附图和实施例详细说明本发明技术方案。
为了使用本发明的目的、技术方案及优点更加的清楚明白,以下参考附图和实施例,对本发明进一步详细说明:
实施例的硬件系统框图参考图1实现, MCU采用 LM9D96芯片,外接FLASH采用FL128SA芯片。系统中MCU内置RAM大小为96KB,而FL128SA的物理sector(物理扇区)为64KB,以下对如何利用有限的RAM资源,通过在文件系统和FLASH驱动之间增加逻辑转换,从而实现文件系统对FLASH物理sector的读写管理作详细说明。
实施例将文件系统的逻辑sector(逻辑扇区)大小设定为远小于FLASH芯片的物理sector(物理可擦写块)容量,具体实施时可以设置逻辑sector大小是几分之一或几十分之一。
实施例在文件系统对逻辑sector的读写擦除等操作和片外FLASH的驱动层之间增加逻辑转换层,做逻辑扇区和物理地址之间的转换,如图2所示,依次为用户读写操作、文件系统(FFS,Flash File System)、逻辑转换层(FTL)、驱动层(driver)、物理设备(Flash)。逻辑转换层将片外FLASH的每一个物理sector划分为若干个与逻辑sector大小相等的区域并分配序号,
实施例基于逻辑转换层的读写操作具体实现过程为:
在文件系统初始化阶段,逻辑转换层在将文件系统上所有的逻辑sector映射到Flash上的物理sector中,可能需要连续映射到一个或多个物理sector中。这样多个逻辑sector映射到一个物理sector,并记录每个逻辑sector在物理sector中的区域序号。实施例记录一个与物理sector相应的映射表(实施例称为MAP表),该映射表包含了每个逻辑sector映射到物理sector的地址信息和在该物理sector中的区域序号,例如(逻辑sector地址0x00000000:物理sector地址0x00000000:区域序号0)。所述逻辑sector映射到物理sector的地址信息包括逻辑sector地址和物理sector地址。
如图3所示,当文件系统要进行读取操作(FFS READ)时,逻辑转换层根据需要执行读操作的逻辑sector地址,首先查询映射表,以获得映射信息,映射信息包含了逻辑sector映射到物理sector中的具体位置信息,包括逻辑sector地址、物理sector地址和逻辑sector在该物理sector中的区域序号,然后读取相应的物理sector地址和区域序号信息并返回给文件系统,片外FLASH的驱动层直接读取该sector中对应区域的信息,从而实现读映射。
当文件系统要进行写入操作(FFS WRITE)时,可能存在将bit 0修改为1的情况,也为了避免同一物理sector中其他序号区域的数据被擦除,逻辑层将申请空闲区域(即物理sector中的一个与逻辑sector大小相等且没有任何数据的区域),可能从一个新的物理sector或者是同一物理sector中申请一片未使用的区域。并将新信息写入,逻辑sector被重新映射到新的物理区域,然后将逻辑sector重新映射到片外FLASH的物理sector中,修改map信息,记录物理sector重新映射后的信息,包括逻辑sector映射到物理sector的地址信息和在该物理sector中的区域序号,记录申请的空闲区域的地址,从而实现写映射。在写入过程中,为了保证只对整个sector中特定的区域进行写操作,执行物理sector写命令,但在除了目标区域以外的其他区域全部写入0xff以保证其他区域数据不受影响。如图4所示,某逻辑sector之前的映射关系是指向物理sector某个区域的地址,写入后指向物理sector另一个区域的地址。
逻辑转换层对FLASH格式化后,随着不断的有文件写入或者修改,物理sector中可用的空闲区域(即从未被写入数据的区域)将被不断申请使用,原有的占用区域(即已被写入数据的区域)被不断的废弃成为垃圾区域(即已被写入数据但数据已经废弃的区域),系统中可用区域越来越少。但逻辑转换层始终会保留FLASH中的一小部分物理sector处于全部空闲状态,即这部分物理sector的所有区域为空闲区域。如图5中FLASH共有10个物理sector,记为sector1、sector2、sector3、sector4、sector5、sector6、sector7、sector8、sector9、sector10,每个物理sector分为6个区域,即支持6个逻辑sector映射到一个物理sector。其中sector9和sector10以作为后续步骤的回收中转区,其中的空闲区域是逻辑转换层为了方便管理、为了不需要每次擦除一块而付出的管理代价。图中,01表示垃圾区域,02表示有用区域,03表示空闲区域。占用区域中除垃圾区域以外的为有用区域。
当系统中的所有可用空闲区域(除回收中转区以外的空闲区域)少于用户要申请写入的区域时,逻辑转换层就启动机制解决这些垃圾问题,这个过程在逻辑层中称为垃圾回收。
垃圾回收过程比较复杂,转换层会统计各物理sector中垃圾区域的数量,根据垃圾区域数量从多到少依次对所有物理sector来进行回收。如图5和图6垃圾回收前后状态图所示,和图5相比,所有的有用区域被集中,垃圾区域被擦除回收后集中成为可用区域,回收中转区依然存在,只不过物理位置发生了变化(sector1和sector2)。回收的整个过程实际就是将各物理sector中的有用数据集中到一起,以便将多余的空间重新初始化为空闲区域,供下一次被申请使用。具体回收的过程为:逻辑转换层启用在回收中转区保留的空闲区域,将待回收物理sector中的有用区域以单个区域为单位拷贝到回收中转区保留的空闲区域中,在数据写入过程中对于目标区域以外的其他区域全部写入0xff以保证其他区域数据不受影响,实现对该物理sector多次重复写入, 采用此方法即可将有用区域全部集中。同时更新MAP表重新建立映射,因为需要保留片外FLASH的部分物理sector的所有区域处于空闲状态,垃圾回收之后的空闲区域中仍保留一部分作为新的回收中转区,例如图6中的sector1和sector2,其余部分全部释放为空闲区域供重新申请。
在文件系统的读写删除等操作过程中,不断循环重复的执行以上策略,即可实现利用几KB的读写缓存实现对64KB大小sector的管理与读写功能。
本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。