CN109656881B - 一种基于fat16技术实现文件动态管理的方法和系统 - Google Patents
一种基于fat16技术实现文件动态管理的方法和系统 Download PDFInfo
- Publication number
- CN109656881B CN109656881B CN201811608335.6A CN201811608335A CN109656881B CN 109656881 B CN109656881 B CN 109656881B CN 201811608335 A CN201811608335 A CN 201811608335A CN 109656881 B CN109656881 B CN 109656881B
- Authority
- CN
- China
- Prior art keywords
- fat16
- flash
- buffer area
- file system
- file
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0608—Saving storage space on storage systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0655—Vertical data movement, i.e. input-output transfer; data movement between one or more hosts and one or more storage devices
- G06F3/0656—Data buffering arrangements
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Human Computer Interaction (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请公开了一种基于FAT16技术实现文件动态管理的方法和系统,该方法包括:对无操作系统的嵌入式设备中的flash,进行FAT16文件系统的初始化以及FAT16文件系统结构体的初始化;对所获取的shell命令进行解析,并将解析后的参数传送至FAT16文件系统;根据解析后的参数,FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及flash数据区的文件读取到指定的缓冲区中;对缓冲区进行读写操作。本申请中的系统包括初始化模块、命令解析模块、缓冲区指定模块和读写模块。通过本申请能够实现无操作系统的嵌入式设备中文件动态管理的灵活性,并大大提高磁盘空间的利用率。
Description
技术领域
本申请涉及嵌入式设备技术领域,特别是涉及一种基于FAT16技术实现文件动态管理的方法和系统。
背景技术
嵌入式设备包括无操作系统的嵌入式设备,无操作系统的嵌入式设备通常以单片机或ARM为CPU。随着嵌入式系统的发展,用户对于无操作系统的嵌入式设备中的存储系统要求也越来越高。如何在嵌入式设备中实现文件的动态管理,使得嵌入式设备中的存储系统既能够存储大量数据,又能够确保数据的安全,是个重要问题。
目前在无操作系统的嵌入式设备中进行文件存储的方法,通常是手动指定每个文件的存储地址和长度,即:直接在宏定义中指定每个文件的起始扇区,而且每个文件必须存储在连续的扇区中。
然而,目前在无操作系统的嵌入式设备中进行文件存储的方法中,由于在宏定义中指定了每个文件的起始扇区,且文件存储在连续的扇区中,使得文件的地址固定下来。后期对文件进行升级时,如果升级后的文件变小,则在空余的扇区中容易产生碎片,如果升级后的文件变大,则需要占用其他扇区,进而需要把其他所有文件的存储地址修改一遍。因此,目前在无操作系统的嵌入式设备中进行文件存储的方法不利于磁盘空间的充分利用,也不利于后期文件的升级和增删,对文件管理的灵活性较低。
发明内容
本申请提供了一种基于FAT16技术实现文件动态管理的方法和系统,以解决现有技术中对文件动态管理的方法灵活性较低以及不利于磁盘空间的充分利用的问题。
为了解决上述技术问题,本申请实施例公开了如下技术方案:
一种基于FAT16技术实现文件动态管理的方法,应用于无操作系统的嵌入式设备中,所述方法包括:
对嵌入式设备中的flash进行FAT16文件系统的初始化以及FAT16文件系统结构体的初始化,所述FAT16文件系统包括:API接口层、中间转换层和介质驱动层;
对所获取的shell命令进行解析,并将解析后的参数传送至FAT16文件系统;
根据解析后的参数,所述FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及flash数据区的文件读取到指定的缓冲区中;
对所述缓冲区进行读写操作。
可选地,所述对嵌入式设备中的flash进行FAT16文件系统的初始化以及FAT16文件系统结构体的初始化,包括:
将FAT16文件系统中间转换层的操作函数映射至与所述操作函数相匹配的结构体参数;
对FAT16文件系统的信息结构体fs_info的参数赋值,所述信息结构体fs_info的参数包括:每个簇的扇区数目、每扇区的字节数以及FAT起始扇区。
可选地,对所述缓冲区进行读写操作的方法,包括:
判断所述shell命令中是否包含变量;
如果是,对所述缓冲区进行读写操作,并将读写操作后的缓冲区回写至flash;
如果否,直接对所述缓冲区进行读操作。
可选地,所述对所述缓冲区进行读写操作,并将读写操作后的缓冲区回写至flash,包括:
对所述缓冲区内的任一文件分配一fd号,所述fd号与结构体fd_table[fd]一一对应,且所述结构体fd_table[fd]用于实时记录所述任一文件的所有信息;
对所述缓冲区进行读写操作,并根据读写操作的信息同步更新FAT表和根目录缓冲区;
调用FAT16_close(int fd)函数,将FAT表和根目录缓冲区写回flash,并清空fd_table[fd]和缓冲区。
可选地,根据解析后的参数,所述FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及数据区读取到指定的缓冲区中之前,所述方法还包括:
判断是否首次调用FAT16文件系统的功能函数;
如果是,对所述flash进行格式化。
可选地,对所述flash进行格式化的方法,包括:
将DBR、FAT表、根目录以及DBR、FAT表和根目录的重要参数写入flash的固定扇区;
将flash的数据区清空。
一种基于FAT16技术实现文件动态管理的系统,应用于无操作系统的嵌入式设备中,所述系统包括:
初始化模块,用于对嵌入式设备中的flash进行FAT16文件系统的初始化以及FAT16文件系统结构体的初始化,所述FAT16文件系统包括:API接口层、中间转换层和介质驱动层;
命令解析模块,用于对所获取的shell命令进行解析,并将解析后的参数传送至FAT16文件系统;
缓冲区指定模块,用于根据解析后的参数,所述FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及flash数据区的文件读取到指定的缓冲区中;
读写模块,用于对所述缓冲区进行读写操作。
可选地,所述读写模块包括:
变量判断单元,用于判断所述shell命令中是否包含变量;
回写单元,用于当所述shell命令中包含变量时,对所述缓冲区进行读写操作,并将读写操作后的缓冲区回写至flash;
只读单元,用于当所述shell命令中不包含变量时,对所述缓冲区进行读操作。
可选地,所述回写单元包括:
fd号分配子单元,用于对所述缓冲区内的任一文件分配一fd号,所述fd号与结构体fd_table[fd]一一对应,且所述结构体fd_table[fd]用于实时记录所述任一文件的所有信息;
更新子单元,用于对所述缓冲区进行读写操作,并根据读写操作的信息同步更新FAT表和根目录缓冲区;
回写和清空子单元,用于调用FAT16_close(int fd)函数,将FAT表和根目录缓冲区写回flash,并清空fd_table[fd]和缓冲区。
可选地,所述系统还包括:
功能函数调用判断模块,用于判断是否首次调用FAT16文件系统的功能函数;
格式化模块,用于当首次调用FAT16文件系统的功能函数时,对所述flash进行格式化。
本申请的实施例提供的技术方案可以包括以下有益效果:
本申请提供一种基于FAT16技术实现文件动态管理的方法,该方法应用于无操作系统的嵌入式设备中。该方法首先对嵌入式设备中的flash进行初始化,其次对所获取的shell命令进行解析,并将解析后的参数传送至FAT16文件系统,然后FAT16文件系统的功能函数根据解析后的参数,将flash公共区的FAT表、根目录以及flash数据区的文件读取到指定的缓冲区中,最后根据解析后的参数中是否包含变量,对缓冲区进行读写。本实施例通过在无操作系统的嵌入式设备中搭建FAT16文件系统,并根据解析后的用户命令,将文件读取至缓冲区,对缓冲区进行操作,有利于flash磁盘空间的充分利用;而且根据参数中是否包含变量,确定是否回写至flash,即:只需要将将修改后的缓冲区回写至flash,而不是全部内容均进行回写,有利于进一步提高磁盘利用率,从而提高flash中文件管理的效率和灵活性。
本申请利用FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及flash数据区的文件读取到指定的缓冲区中,实现文件缓冲功能,且在缓冲区操作完成之后再回写flash,从而避免对flash扇区的频繁擦除,有利于提高数据读写效率,且有利于保护flash。
本实施例通过对缓冲区内任一文件分配一fd号,没打开一个文件会自动分配一个fd号,fd号所对应的fd_table[fd]结构体会记录该文件的所有信息,在关闭文件时撤销该fd号,同时清空对应的fd_table[fd]结构体,因此,对缓冲区内任一文件分配一fd号,使得不同文件有不同的fd,不会造成数据混乱,而且可同时打开多个文件进行操作,有利于提高数据读写的效率和提高用户体验。
本实施例中的方法通过软件实现,能够兼容各种flash硬件类型,应用于不同的平台时,只需要修改读写驱动即可,使得本申请中的方法便于推广使用。另外,本实施例中的方法可以采用C语言来实现,不需要任何第三方库,也进一步使得本申请中的方法便于推广使用。
本申请还提供一种基于FAT16技术实现文件动态管理的系统。该系统主要包括初始化模块、命令解析模块、缓冲区指定模块和读写模块。通过初始化模块对嵌入式设备中的flash进行FAT16文件系统的初始化以及FAT16文件系统结构体的初始化,从而为后续的文件读写提供标准的接口函数和指定扇区,有利于提高数据读写的效率。通过命令解析模块能够将所获取的shell命令解析成相应参数,并将参数传送至FAT16文件系统,然后缓冲区指定模块根据参数,使FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及flash数据区的文件读取到指定的缓冲区中。最后通过读写模块对缓冲区进行读写。本实施例将flash公共区和数据区的重要内容读取至缓冲区后,对缓冲区进行读写操作,有利于提高flash磁盘空间的利用率;而且读写模块根据参数中是否包含变量,确定是否回写至flash,而不是全部内容均进行回写,有利于进一步提高磁盘利用率,从而提高flash中文件管理的效率和灵活性。本实施例中缓冲区指定模块的设置,能够实现文件缓冲功能,在缓冲区操作完成后统一回写至flash,不需要频繁操作磁盘,有利于提高数据读写效率和保护磁盘性能。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例所提供的一种基于FAT16技术实现文件动态管理的方法的流程示意图;
图2为本申请实施例中FAT16文件系统的层次结构示意图;
图3为本申请实施例所提供的一种基于FAT16技术实现文件动态管理的系统的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
为了更好地理解本申请,下面结合附图来详细解释本申请的实施方式。
实施例一
参见图1,图1为本申请实施例所提供的一种基于FAT16技术实现文件动态管理的方法的流程示意图。由图1可知,本实施例中基于FAT16技术实现文件动态管理的方法,包括如下步骤:
S1:对嵌入式设备中的flash进行FAT16文件系统的初始化以及FAT16文件系统结构体的初始化。
参见图2可知,本实施例中FAT16文件系统包括:API接口层、中间转换层和介质驱动层。其中,FAT文件系统与用户应用程序之间的API接口层,用于文件的基本操作,其实现形式如同标准的Linux函数open(const char*file_name,UINT32flags),write(int fd,char*buf,UINT32count)等。
中间转换层包括三部分:shell命令处理层、文件系统实现层和逻辑块子层。shell命令处理层用于处理shell命令,以及通过命令如format、show FAT以及show file等在管理界面实时显示存储状态。文件系统实现层用于实现FAT文件系统。逻辑块子层用于进行FAT文件系统的格式化、实时占有率以及存储状态等信息的获取。
介质驱动层,也即Device Level层,主要用于flash读写驱动,即flash的实际读写操作层,特定的flash存储器对应特定的读写程序。
本实施例中通过步骤S1对flash进行初始化设置,该初始化设置主要包括FAT16文件系统的初始化以及FAT16文件系统结构体的初始化。具体地,步骤S1包括:
S11:将FAT16文件系统中间转换层的操作函数映射至与操作函数相匹配的结构体参数。
FAT16文件系统的初始化是指初始化FILE_OPT结构体,也就是将FAT16文件系统的中间转换层的操作函数映射到对应的结构体参数,从而实现标准的接口函数。
S12:对FAT16文件系统的信息结构体fs_info的参数赋值。其中,信息结构体fs_info的参数包括:每个簇的扇区数目、每扇区的字节数以及FAT起始扇区。
文件系统结构体的初始化是给定FAT16文件系统信息结构体fs_info各个参数的值,这些参数记录文件系统各个分区的重要信息。例如:每个簇的扇区数目采用参数fs_info.csize;每扇区的字节数采用参数fs_info.ssize;FAT起始扇区采用参数fs_info.fatbase。
本实施例中对FAT16文件系统结构体的初始化,也就是对FAT16文件系统的信息结构体fs_info的参数赋值。通过进行参数赋值,能够对flash公共区的备份情况进行规定,从而实现对公共区DBR、FAT表以及根目录进行备份,防止flash产生坏块时造成文件丢失,有利于提高对文件系统存储的可靠性。
继续参见图1可知,对flash初始化之后,执行步骤S2:对所获取的shell命令进行解析,并将解析后的参数传送至FAT16文件系统。
获取到代表用户需求的shell命令之后,根据shell命令对文件进行存储和管理,进入FAT16文件系统的中间转换层,从而实现shell命令的解析和FAT16文件系统。具体地,对shell命令进行解析的方法为:利用cliCmdShellRun函数将输入的shell命令字符串解析成多个tokens,然后根据tokens在cl iDefinedCmdMapTab[]数组中查找对应的cli_func函数,如果没有找到,则直接返回错误,如果找到对应的cli_func函数,则将tokens等参数填入*usrCmdParaStruct结构体,并将其作为参数传递给cli_func函数并执行cli_func函数,格式如下:
(*cliDefinedCmdMapTab[CmdIndex].func)(&usrCmdParaStruct)
需要注意的是,本实施例中cliCmdShellRun函数用于解析输入的命令,并按命令要求完成所需操作。tokens是将命令行拆分后的关键字,例如:将命令行拆分后生成的tokens为show file,该tokens参数包含两个关键字“show”和“file”,拆分关键字的目的是查找匹配已注册的命令,返回下一步要执行的动作。cl iDefinedCmdMapTab[]数组包含对所有可执行shell命令的描述,包括:命令的调用级别、关键字的匹配以及调用的功能函数。将用户输入的shell命令解析成tokens后,要在cliDefinedCmdMapTab[]数组中进行匹配,即:解析后的tokens与cliDefinedCmdMapTab[]数组中的每一项中包含的第三个元素进行比对,匹配成功才能继续执行,否则,不在该数组的命令无法执行。数组cliDefinedCmdMapTab[]的每一项的最后一个变量是cli_func函数,例如:show file命令对应的cli_func就是函数cli_show_fi le。cli_func函数即为FAT16文件系统中的各个功能模块,其代指所有可执行命令对应的各自的功能函数。
对所获取的shell命令进行解析,并将解析后的参数传送至FAT16文件系统之后,进入文件系统层。执行步骤S5:根据解析后的参数,FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及flash数据区的文件读取到指定的缓冲区中。
本实施例中cli_func函数即为FAT16文件系统中的各个功能模块,cli_func函数将flash公共区的内容和数据区的文件读取到缓冲区,一次读取一个扇区。由于在进行数据写入时,flash只支持将数据位由1写为0,而不支持将数据位由0写成1,对flash进行读写等相关操作时,需要先擦除后写入,而且flash是以扇区为单位进行读写擦除,而上层文件系统对flash的操作是按字节进行,这样就会导致flashe扇区的频繁擦除。本实施例通过在内存中划定缓冲区,定义为flash的cache,从而屏蔽了flash的读写规则,可在缓冲区对任意字节进行修改。从而能够避免对flash的频繁擦除,有利于提高磁盘利用率,进而提高flash文件管理的效率和灵活性。
进一步地,在步骤S5之前还可以包括:
步骤S3:判断是否首次调用FAT16文件系统的功能函数。
如果是首次调用FAT16文件系统的功能函数,执行步骤S4:对flash进行格式化。对flash进行格式化包括对flash公共区和数据区的操作,具体地,步骤S4又包括:
S41:将DBR、FAT表、根目录以及DBR、FAT表和根目录的重要参数写入flash的固定扇区。
S42:将flash的数据区清空。
首次调用FAT16文件系统的功能函数时,也就是首次进入FAT16系统,输入format命令,调用FAT16_format函数,将文件系统公共部分格式化,将DBR部分、FAT表、根目录以及DBR部分、FAT表和根目录的重要参数,写入到flash固定扇区,并将flash的数据区清空,之后根据不同的命令调用不同功能函数进行处理。
根据解析后的参数,FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及flash数据区的文件读取到指定的缓冲区中之后,执行步骤S6:对缓冲区进行读写操作。
具体地,步骤S6包括如下过程:
S61:判断shell命令中是否包含变量。
也就是判断shell命令中是否包含写操作,如果包含写操作判定为包含变量,如果只包含读操作,判定为不包含变量。
如果shell命令中包含变量,执行步骤S62:对缓冲区进行读写操作,并将读写操作后的缓冲区回写至flash。
当shell命令中包含变量时,需要根据变量要求修改的缓冲区内容回写至flash。对缓冲区进行读写操作相当于对缓冲区进行修改,此时需要将修改后的缓冲区回写至flash,包括数据区和公共区都需要回写。
具体地,步骤S62又包括如下过程:
S621:对缓冲区内的任一文件分配一fd号。其中,fd号与结构体fd_table[fd]一一对应,且结构体fd_table[fd]用于实时记录任一文件的所有信息。
本实施例中创建结构体数组FILE_INFO fd_table[MAX_FILES],最大文件打开数MAX_FILES可在宏定义中进行修改,每打开一个文件会分配一个fd号,对应的fd_table[fd]结构体会记录该文件的所有信息,在关闭文件时撤销该fd号,清空对应的fd_table[fd]结构体,因此,不同文件有不同的fd,可以进行文件的区分,并且可同时打开多个进行文件进行操作。
S622:对缓冲区进行读写操作,并根据读写操作的信息同步更新FAT表和根目录缓冲区。
S623:调用FAT16_close(int fd)函数,将FAT表和根目录缓冲区写回flash,并清空fd_table[fd]和缓冲区。
由以上步骤S621-S623可知,当对缓冲区进行写操作时,需要将修改后的内容及时回写至flash中。如果shell命令中不包含变量,执行步骤S63:直接对缓冲区进行读操作。对缓冲区读取完成后,不需要将公共区和数据区的内容写回。从而能够避免频繁操作flash,有利于提高磁盘利用率和保护磁盘。
下面将本实施例中的方法所用到的数据结构进行描述。
A)cliDefinedCmdMapTab[]数组主要包含shell命令的描述,包括命令的调用级别、关键字的匹配和调用的功能函数,具体内容如下:
CLICMDMAP cl iDefinedCmdMapTab[]=
{
{priv_user,"show version",{"show","version",NULL},2,cli_show_version},
{priv_admin,"show task",{"show","task",NULL},2,cl i_show_task},
{priv_admin,"reboot",{"reboot",NULL},1,cli_reboot},
{priv_user,"show run",{"show","run",NULL},2,cli_show_run},
{priv_user,"show cpu",{"show","cpu",NULL},2,cli_show_cpu},
{priv_user,"show mem",{"show","mem",NULL},2,cli_show_mem},
{priv_admin,"open",{"open",NULL},1,cli_open},
{priv_admin,"save",{"save",NULL},1,cli_save},
{priv_admin,"read",{"read",NULL},1,cli_read},
{priv_admin,"lseek",{"lseek",NULL},1,cli_lseek},
{priv_admin,"close",{"close",NULL},1,cli_close},
{priv_admin,"remove",{"remove",NULL},1,cli_remove},
{priv_admin,"format",{"format",NULL},1,cli_format},
{priv_user,"show file",{"show","file",NULL},2,cli_show_fi le},
{priv_admin,"show disk",{"show","disk",NULL},2,cl i_show_disk},
{priv_admin,"show FAT",{"show","FAT",NULL},2,cli_show_FAT},
{priv_admin,"show fd",{"show","fd",NULL},2,cl i_show_fd},
{(priv_t)0,NULL,{NULL},0,NULL}
};
命令可以是带参数的,比如文件名。
B)若是功能函数收到文件名参数,该文件的实时信息会存储在fd_tables[]中,文件的描述信息包括如下:
typedef struct
{
char fname[13];/*文件名*/
char flag;/*文件状态,由open的模式决定可读或者可写,是否调用
sector_write8*/
UINT32fptr;/*文件读写指针*/
UINT32fsize;/*文件大小*/
UINT16sclust;/*文件起始簇(fsize=0时为0)*/
UINT16clust;/*当前簇*/
UINT32index;/*目录索引*/
UINT16cltbl;/*指向簇链接映射表*/
}FILE_INFO;
当对文件的操作完成,执行close()函数时,将fd_table[]的该项清空。
C)操作过程中对整个FAT16文件系统的信息更新记录在以下数据结构中:
typedef struct
{
UINT32csize;/*每个簇的扇区数目*/
UINT32n_fats;/*文件分配表的数目,FAT16文件系统依次为:引导扇区、两个文件分配表、根目录区和数据区*/
UINT32n_rootdir;/*根目录区入口(目录项)的个数*/
UINT32ssize;/*每扇区的字节数(用于扇区大于512Byte的flash)*/
UINT32n_fatent;/*FAT目录数(簇的数目)*/
UINT32fsize;/*每个FAT所占扇区*/
UINT32fatbase;/*FAT起始扇区*/
UINT32dirbase;/*根目录起始扇区*/
UINT32database;/*数据目录起始扇区*/
char wflag;/*标记文件是否被改动过,为1时要回写*/
char fsi_flag;/*标记文件系统信息是否被改动过,为1时要回写*/
UINT32last_clust;/*最后一个被分配的簇*/
UINT32free_clust;/*空闲簇数目*/
}FAT16_INFO;
D)公共分区DBR,即操作系统引导记录区,它记录了存储卡的所有重要信息,一共512个字节,依次包括:
跳转指令JUMP OEM厂商标志BPB和扩展BPB引导代码结束标志0xAA55
typedef struct
{
unsigned char JUMP[3];
char OEM_ID[8];
unsigned char BPB[25];
char EXT_BPB[26];
unsigned char Bootstrap_Code[448];
unsigned char END_FLAG[2];
}FAT16_DBR;
E)公共分区根目录,根目录是目录存储结构的入口,位置紧随在FAT2之后,以32个字节为单位进行目录文件所占簇的分配,这32个字节以确定的偏移来定义本目录下的一个文件(或文件夹)的属性,依次包括:
文件名扩展名属性保留区修改日期修改时间长度
typedef struct
{
char fname[9];
char fext[3];
char status[1];
char reserve[9];
char last_change_time[2];
char last_change_data[2];
UINT16sclust;
UINT32fsize;
}ROOT_DIR。
综上所述,本实施例能够实现文件缓冲功能,在缓冲区操作完成后回写至flash,补习频繁操作物理磁盘,能够有效提高磁盘空间的利用率。本实施例中的方法可以移植于各种平台,只需要编写sector驱动即可,具体编写sector_read和sector_write,操作比较灵活。而且本实施例可以同时打开多个文件,实现系统自动管理,能够进一步提供磁盘利用率。可以采用本实施例中的方法进行编程实现,编程时只需要基本的C语言即可实现整个代码,需要任何第三方库,易于实现和推广。
实施例二
在图1和图2所述实施例的基础之上参见图3,图3为本申请实施例所提供的一种基于FAT16技术实现文件动态管理的系统的结构示意图。由图3可知,本实施例中基于FAT16技术实现文件动态管理的系统,主要包括:初始化模块、命令解析模块、缓冲区指定模块和读写模块。
其中,初始化模块用于对嵌入式设备中的flash进行FAT16文件系统的初始化以及FAT16文件系统结构体的初始化。FAT16文件系统包括:API接口层、中间转换层和介质驱动层。命令解析模块用于对所获取的shell命令进行解析,并将解析后的参数传送至FAT16文件系统。缓冲区指定模块用于根据解析后的参数,FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及flash数据区的文件读取到指定的缓冲区中。读写模块用于对缓冲区进行读写操作。
进一步地,读写模块又包括:变量判断单元、回写单元和只读单元。其中,变量判断单元用于判断shell命令中是否包含变量。回写单元用于当shell命令中包含变量时,对缓冲区进行读写操作,并将读写操作后的缓冲区回写至flash。只读单元用于当shell命令中不包含变量时,对缓冲区进行读操作。
其中,回写单元又包括:fd号分配子单元、更新子单元、回写和清空子单元。fd号分配子单元用于对缓冲区内的任一文件分配一fd号,fd号与结构体fd_table[fd]一一对应,且结构体fd_table[fd]用于实时记录任一文件的所有信息。更新子单元用于对缓冲区进行读写操作,并根据读写操作的信息同步更新FAT表和根目录缓冲区。回写和清空子单元用于调用FAT16_close(int fd)函数,将FAT表和根目录缓冲区写回flash,并清空fd_table[fd]和缓冲区。
进一步地,本实施例基于FAT16技术实现文件动态管理的系统中,还包括有功能函数调用判断模块和格式化模块。其中,功能函数调用判断模块用于判断是否首次调用FAT16文件系统的功能函数;格式化模块用于当首次调用FAT16文件系统的功能函数时,对flash进行格式化。格式化模块又包括公共区格式化单元和数据区格式化单元,其中公共区格式化单元用于将DBR、FAT表、根目录以及DBR、FAT表和根目录的重要参数写入flash的固定扇区。数据区格式化单元用于将flash的数据区清空。
该实施例中基于FAT16技术实现文件动态管理的系统的工作方法和工作原理,在图1和图2所示的实施例中已经详细阐述,在此不再赘述。
以上所述仅是本申请的具体实施方式,使本领域技术人员能够理解或实现本申请。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (6)
1.一种基于FAT16技术实现文件动态管理的方法,应用于无操作系统的嵌入式设备中,其特征在于,所述方法包括:
对嵌入式设备中的flash进行FAT16文件系统的初始化以及FAT16文件系统结构体的初始化,所述FAT16文件系统包括:API接口层、中间转换层和介质驱动层;
对所获取的shell命令进行解析,并将解析后的参数传送至FAT16文件系统;
根据解析后的参数,所述FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及flash数据区的文件读取到指定的缓冲区中;
对所述缓冲区进行读写操作;
对所述缓冲区进行读写操作的方法,包括:
判断所述shell命令中是否包含变量;
如果是,对所述缓冲区进行读写操作,并将读写操作后的缓冲区回写至flash;
如果否,直接对所述缓冲区进行读操作;
所述对所述缓冲区进行读写操作,并将读写操作后的缓冲区回写至flash,包括:
对所述缓冲区内的任一文件分配一fd号,所述fd号与结构体fd_table[fd]一一对应,且所述结构体fd_table[fd]用于实时记录所述任一文件的所有信息;
对所述缓冲区进行读写操作,并根据读写操作的信息同步更新FAT表和根目录缓冲区;
调用FAT16_close(int fd)函数,将FAT表和根目录缓冲区写回flash,并清空fd_table[fd]和缓冲区。
2.根据权利要求1所述的一种基于FAT16技术实现文件动态管理的方法,其特征在于,所述对嵌入式设备中的flash进行FAT16文件系统的初始化以及FAT16文件系统结构体的初始化,包括:
将FAT16文件系统中间转换层的操作函数映射至与所述操作函数相匹配的结构体参数;
对FAT16文件系统的信息结构体fs_info的参数赋值,所述信息结构体fs_info的参数包括:每个簇的扇区数目、每扇区的字节数以及FAT起始扇区。
3.根据权利要求1或2所述的一种基于FAT16技术实现文件动态管理的方法,其特征在于,根据解析后的参数,所述FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及数据区读取到指定的缓冲区中之前,所述方法还包括:
判断是否首次调用FAT16文件系统的功能函数;
如果是,对所述flash进行格式化。
4.根据权利要求3所述的一种基于FAT16技术实现文件动态管理的方法,其特征在于,对所述flash进行格式化的方法,包括:
将DBR、FAT表、根目录以及DBR、FAT表和根目录的重要参数写入flash的固定扇区;
将flash的数据区清空。
5.一种基于FAT16技术实现文件动态管理的系统,应用于无操作系统的嵌入式设备中,其特征在于,所述系统包括:
初始化模块,用于对嵌入式设备中的flash进行FAT16文件系统的初始化以及FAT16文件系统结构体的初始化,所述FAT16文件系统包括:API接口层、中间转换层和介质驱动层;
命令解析模块,用于对所获取的shell命令进行解析,并将解析后的参数传送至FAT16文件系统;
缓冲区指定模块,用于根据解析后的参数,所述FAT16文件系统的功能函数将flash公共区的FAT表、根目录以及flash数据区的文件读取到指定的缓冲区中;
读写模块,用于对所述缓冲区进行读写操作;
其中,所述读写模块包括:
变量判断单元,用于判断所述shell命令中是否包含变量;
回写单元,用于当所述shell命令中包含变量时,对所述缓冲区进行读写操作,并将读写操作后的缓冲区回写至flash;
只读单元,用于当所述shell命令中不包含变量时,对所述缓冲区进行读操作;
所述回写单元包括:
fd号分配子单元,用于对所述缓冲区内的任一文件分配一fd号,所述fd号与结构体fd_table[fd]一一对应,且所述结构体fd_table[fd]用于实时记录所述任一文件的所有信息;
更新子单元,用于对所述缓冲区进行读写操作,并根据读写操作的信息同步更新FAT表和根目录缓冲区;
回写和清空子单元,用于调用FAT16_close(int fd)函数,将FAT表和根目录缓冲区写回flash,并清空fd_table[fd]和缓冲区。
6.根据权利要求5所述的一种基于FAT16技术实现文件动态管理的系统,其特征在于,所述系统还包括:
功能函数调用判断模块,用于判断是否首次调用FAT16文件系统的功能函数;
格式化模块,用于当首次调用FAT16文件系统的功能函数时,对所述flash进行格式化。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811608335.6A CN109656881B (zh) | 2018-12-26 | 2018-12-26 | 一种基于fat16技术实现文件动态管理的方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811608335.6A CN109656881B (zh) | 2018-12-26 | 2018-12-26 | 一种基于fat16技术实现文件动态管理的方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109656881A CN109656881A (zh) | 2019-04-19 |
CN109656881B true CN109656881B (zh) | 2023-06-20 |
Family
ID=66117578
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811608335.6A Active CN109656881B (zh) | 2018-12-26 | 2018-12-26 | 一种基于fat16技术实现文件动态管理的方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109656881B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112328327B (zh) * | 2020-11-20 | 2023-10-27 | 杭州迪普科技股份有限公司 | 配置分区整理方法、装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2006127377A (ja) * | 2004-11-01 | 2006-05-18 | Canon Inc | Fatファイルシステム |
CN101441634A (zh) * | 2007-11-19 | 2009-05-27 | 凤凰微电子(中国)有限公司 | 适用于智能卡应用环境的嵌入式文件系统 |
CN103699613A (zh) * | 2013-12-17 | 2014-04-02 | 迈普通信技术股份有限公司 | 一种嵌入式系统中文件系统的缓冲方法及系统 |
CN104298697A (zh) * | 2014-01-08 | 2015-01-21 | 凯迈(洛阳)测控有限公司 | 一种fat32格式的数据文件管理系统 |
CN105573918A (zh) * | 2015-12-17 | 2016-05-11 | 深圳市新国都支付技术有限公司 | 一种轻量级闪存系统和方法 |
-
2018
- 2018-12-26 CN CN201811608335.6A patent/CN109656881B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2006127377A (ja) * | 2004-11-01 | 2006-05-18 | Canon Inc | Fatファイルシステム |
CN101441634A (zh) * | 2007-11-19 | 2009-05-27 | 凤凰微电子(中国)有限公司 | 适用于智能卡应用环境的嵌入式文件系统 |
CN103699613A (zh) * | 2013-12-17 | 2014-04-02 | 迈普通信技术股份有限公司 | 一种嵌入式系统中文件系统的缓冲方法及系统 |
CN104298697A (zh) * | 2014-01-08 | 2015-01-21 | 凯迈(洛阳)测控有限公司 | 一种fat32格式的数据文件管理系统 |
CN105573918A (zh) * | 2015-12-17 | 2016-05-11 | 深圳市新国都支付技术有限公司 | 一种轻量级闪存系统和方法 |
Also Published As
Publication number | Publication date |
---|---|
CN109656881A (zh) | 2019-04-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5497492A (en) | System and method for loading an operating system through use of a fire system | |
US7146455B2 (en) | System and method for optimized access to memory devices requiring block writing | |
US8370835B2 (en) | Method for dynamically generating a configuration for a virtual machine with a virtual hard disk in an external storage device | |
KR101376937B1 (ko) | 플래시 컴포넌트 질의 시스템, 플래시 컴포넌트 질의 방법 및 컴퓨터 판독가능 저장 매체 | |
US7610434B2 (en) | File recording apparatus | |
US20220197818A1 (en) | Method and apparatus for performing operations to namespaces of a flash memory device | |
US5802363A (en) | Bios dynamic emulation of multiple diskettes from a single media | |
CN100458699C (zh) | 一种实现固件更新的方法和系统 | |
US7836105B2 (en) | Converting file-systems that organize and store data for computing systems | |
US7558804B1 (en) | Method, apparatus, and computer-readable medium for space-efficient storage of variables in a non-volatile computer memory | |
EP1544732A2 (en) | Creating file systems within an image file in a storage technology-abstracted manner | |
EP0415346A2 (en) | Method and system for dynamic volume tracking in an installable file system | |
US20080005527A1 (en) | Controlling memory access in a multi-booting system | |
KR19990036566A (ko) | 컴퓨터기억장치의논리적드라이브의파티션맵핑갱신시스템 및 방법 | |
JPH04504018A (ja) | 消去不可能な記憶媒体上にファイルを読出しかつ書込む方法 | |
KR20060061204A (ko) | 비교적 한정된 저장 공간을 갖는 컴퓨팅 디바이스 및 그운영 체제/파일 시스템 | |
US6591356B2 (en) | Cluster buster | |
US7305539B2 (en) | Adaptive booting from mass storage device | |
US9348819B1 (en) | Method and system for file data management in virtual environment | |
CN115543224B (zh) | 基于zns ssd的文件系统控制方法、装置及设备 | |
CN114706533B (zh) | 一种基于gpt分区表的多文件多级启动加载方法及装置 | |
US20090106334A1 (en) | Method and apparatus for relocating an active file system journal | |
CN109656881B (zh) | 一种基于fat16技术实现文件动态管理的方法和系统 | |
CN117473117A (zh) | 一种视频循环存储方法、系统及计算机 | |
US7539832B2 (en) | Option ROM code acquisition |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |