当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]Flash损耗均衡的嵌入式文件系统设计

引言
    嵌入式系统的海量存储器多采用Flash存储器实现扩展,由于Flash存储器具有有限写入次数的寿命限制,因此对于Flash存储器局部的频繁操作会缩短Flash存储器的使用寿命。如何设计出一个合理的、针对嵌入式应用的文件系统,实现Flash存储器的损耗均衡,并且实现数据的有效管理,对于提高其使用寿命具有一定的意义。
    本文基于AVR单片机扩展Flash存储器和以太网控制器设计了一款嵌入式文件系统,实现数据存储和存储器使用的损耗均衡,为延长Flash存储器的使用寿命提供研究方法。
1 硬件平台设计
    本嵌入式文件系统选用Atmel公司的AVR单片机ATmega 128和Flash存储器AT45D13081。该Flash芯片具有8 Mb存储空间,共分为4096数据页,每页可存储264字节。通过串行外围设备接口SPI实现ATmega 128和AT45DB081之间的数据通信。文件系统的硬件结构如图1所示。其中,RTL8019AS是一种全双工即插即用的以太网控制器。



2 嵌入式文件系统总体设计
    文件系统的管理是通过把它所管理的信息组织成文件形式来实现的。文件是具有名称的相关信息元素的序列。从用户角度看,文件系统主要实现了按名存储;从系统管理的角度看,它主要实现了文件存储器的空间组织及分配、文件信息的存储以及文件的保护及检索。文件系统要借助于组织良好的数据结构和算法来有效地对文件信息进行管理,使用户更方便地存储信息。文件系统对于底层硬件的特性一般并不关心,只提供简单且标准的接口。
2.1 文件系统存储结构
    根据Flash芯片的特性,为了最快捷地实现文件数据的读取,本文件系统采用单级目录结构,利用链接页的方法管理Flash的存储空间。文件系统存储结构图如图2所示。在Flash存储器中,文件系统分为3部分:文件系统信息表(FAT)、文件控制块(File Control Block,FCB)和数据区(Data Area,DA)。


    文件系统信息表(FAT)用于存放文件系统的信息和属性。数据结构包含FAT的有效性标志、文件总数、第一个文件控制块的扇区号及其在存储器中的地址,以及当前FAT在存储器中的地址。
    文件控制块(FCB)是存放在Flash中的,表示文件的静态信息。数据结构包含文件名(11字节之内)、文件首簇所在的扇区号、文件长度、文件属性、文件创建时间、下一个FCB的Flash地址以及文件控制块有效标志。文件控制块之间采用链表形式链接。
    文件句柄(File_Handle)是存放在内存中的,表示文件的动态信息。当用户打开或创建文件时,会在内存中申请一个文件句柄。数据结构包含文件句柄标示号、文件句柄状态、文件名、文件首簇号、首簇所在的扇区号、当前簇号、文件指针、文件长度以及文件的FCB地址。
    操作系统中将相邻的扇区组合在一起,形成一个簇,然后再对簇进行管理。显然,簇是操作系统所使用的逻辑概念,而非磁盘的物理特性。为了更好地管理磁盘空间和更高效地从硬盘读取数据,操作系统规定一个簇中只能放置一个文件的内容,因此文件所占用的空间,只能是簇的整数倍。本文设计的文件系统规定一个簇的大小为存储器的一个页。[!--empirenews.page--]
2.2 文件系统体系结构
    如图3所示,文件系统对外接口函数为应用层提供统一的抽象接口和数据结构,应用程序通过文件系统对外接口函数来实现文件操作和设备管理功能,隐藏了文件系统底层驱动和设备驱动的实现细节。位于下层的设备驱动,提供了文件数据在设备上的存取操作接口。



3 嵌入式文件系统实现及设备驱动
    文件系统设计的目的在于实现对数据的有效管理以及对存储器空间的平均使用,文件系统的设计包括文件系统对外接口函数和底层驱动程序的设计。
3.1 文件系统对外接口函数
    调用文件系统的对外接口函数是应用程序使用文件系统的唯一途径,其接口的规范性、易用性、功能性关系到文件系统的开放型和用户对文件系统的接受程度。文件系统提供的对外接口函数如表1所列。应用程序通过调用这些接口函数即可实现对文件的管理和操作。


3.2 文件系统底层驱动程序
    文件底层驱动为文件系统的对外接口函数服务,包括文件系统信息表的读写、文件控制块的读写、文件句柄的读写以及各类簇的相关操作等。文件系统的底层驱动函数如表2所列。

[!--empirenews.page--]
    上述文件系统底层驱动函数中,净簇的申请函数(unsigned long app_clus(void))直接影响到对存储器存储区域的使用分配。该函数的流程体现了对存储器存储区域的使用次数的平均分配。
    函数功能描述:申请一个净簇。
    入口参数:无。
    出口参数:<0x100000,申请到净簇的页地址;NO_CLEAN_SECTOR,没有干净的存储空间。
    该函数的流程如图4所示,程序从存储区的第一页开始到最后一页申请一个净簇,若成功,返回簇地址;若失败,则进行脏簇的清理,然后从清理过的存储区中再申请一个净簇,成功则返回簇地址,失败则进行错误处理,程序结束。


3.3 Flash设备驱动
    对文件系统的操作归根结底是对存储器的读写操作。文件操作时设备驱动程序为文件系统提供对存储器的控制,一般包括读、写和复位操作。本文基于Flash芯片AT45DB081存储器,为文件系统提供表3所列的驱动函数。


    完成以上的软硬件设计,基于PC机编写一个客户端测试软件,通过自定的协议对文件进行操作,下载一个文件到文件系统,之后读取比较,从而验证文件系统的正确性。

结语
    本文的方案主要针对存储器的耗损均衡控制进行了重点设计,延长了Flash存储器的使用寿命。对于文件的校错、纠错等其他功能并未详细设计,采用单级目录,不支持多级目录。整个方案已在由单片机ATmega128及Flash AT45DB081组成的系统上具体实现及验证,取得很好的效果。本文件系统在基于Flash存储器的日志型数据采集记录应用中具有较高的应用价值。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭