filex用户手册
filex的用户手册,看着好头疼呢,主要是没有🖊记录,感觉就是浮在空中,飘在天上,好像懂了,又好像啥也没了解到,哈哈,有点意思。为了解决这个bug,因此,记录于此,come on!
1.介绍filex
先看看概述吧,filex是threadx的工业级文件系统解决方案,格式为microsoft FAT格式,专为深度嵌入式实时IoT应用程序而设计。容错和磨损均衡技术则是借助levelx。filex过了很多安全认证,主打一个安全。
filex数据类型:这些数据类型都放在tx_port.h或者fx_port.h。目的是,确保不同编译器之间的可移植性。
容错支持:其实也就是掉电安全,文件一致性。filex的容错模块记录更新文件或目录所需的所有步骤,此日志条目存储在filex可以查找和访问的专用扇区上,即使没有文件系统,也可以访问日志数据的位置。怎么启动容错模块呢?首先要定义宏:FX_ENABLE_FAULT_TOLERANT 和 FX_FAULT_TOLERANT,其次要调用接口fx_fault_tolerant_enable 启动容错服务。
2.安装和使用filex
filex源码中,重要的文件:
- fx_api.h:此C头文件包含所有的宏,数据结构,函数声明。
- fx_port.h:此C头文件包含所有特定于开发工具的数据定义和结构。
- demo_file.c:基于ram的演示程序。
- fx.a:filex的C源码实现,也就是目录:filex/common/src
如何使用filex:
- 应用代码必须包含fx_api.h
- 编译时必须包含filex源码
- 如果用的是threadx作为rtos,通过从 tx_application_define 函数或应用程序线程调用 fx_system_initialize 来初始化 FileX 系统
- 如果是独立模式,应直接从应用代码调用fx_system_initialize。
- 添加对 fx_media_open 的一个或多个调用可设置 FileX 媒体(也就是硬件设备啦)。 必须从应用程序线程的上下文发出此调用。注意:fx_media_open 调用需要足够的 RAM 来存储一个扇区的数据。
疑难问题解答:
- 增加堆栈大小?(如果是独立模式呢?)
- 如果是ram的演示程序,确保为它提供32KB大小的ram作为ram磁盘。
配置选项:有点多,不作为本次记录,有空专门研究吧。
filex版本在哪里看呢?fx_port.h里面有噢。
3.filex基本功能
介质说明:
filex将物理介质视为逻辑扇区数组,如何将这些扇区与底层物理介质相映射,取决于fx_media_open调用期间连接到filex介质的IO驱动程序。比如下面的fx_stm32_sd_driver或者_fx_ram_driver。
#ifdef SDIO_TESTstatus = fx_media_open(&sdio_disk, "STM32_SDIO_DISK", fx_stm32_sd_driver, 0, media_memory, sizeof(media_memory));
#elsestatus = fx_media_open(&sdio_disk, "STM32_SDIO_DISK", _fx_ram_driver, ram_disk_memory, media_memory, sizeof(media_memory));
#endif
讲讲逻辑扇区吧,这好像很重要。介质的逻辑扇区的确切组织取决于物理介质启动记录的内容。
filex的逻辑扇区始于logical sector1,指向介质的第一个保留扇区,也就是reserved啦。reserved扇区是可选的,使用时一般包含启动代码等系统信息。介质“逻辑扇区”视图中其它区域的确切扇区偏移来自介质启动记录的内容。启动记录通常位于sector 0。但是,如果介质有隐藏扇区,则启动扇区的偏移也必须考虑道这些位于启动扇区之前的隐藏扇区。
- reserved扇区:使用时一般包含启动代码等系统信息
- sector 0扇区:介质启动记录,也就是占了512字节。
什么实时介质启动记录?其中之一就是MBR!它的主要内容和含义?
- 引导程序boot loader:这是MBR的第一部分,里面放的grub或uboot。
- 负责启动操作系统的加载过程。
- 当计算机启动时BIOS会加载并执行MBR中的bootloader。
- 引导程序会根据分区表中的信息找到活动分区,并加载该分区中的操作系统固件。
- 分区表:这是MBR的第二部分,里面描述了存储设备上分区的位置和大小。
- 分区表包含最多四个主分区记录PTE,每个记录占16字节;
- 再包含一个扩展分区记录;
- 每个分区记录包含分区的起始和结束扇区号,分区类型(fat32、ext4?)等。
- 结束标志:MBR最后一个字节通常以0xAA55作为结束标志,BIOS就是用它来验证MBR的有效性。
介质启动记录(MBR)对于启动过程至关重要,因为它告诉计算机如何找到并加载操作系统。如果MBR损坏或被错误地修改,可能会导致计算机无法启动。此外,MBR只存在于使用MBR分区方案的磁盘上。
sector 0这512字节分别表示啥呢?这个就不细说了。。。主要有点多。
- 保留扇区数:介质启动记录中的“保留扇区数”字段定义在启动记录和 FAT 区域第一个扇区之间保留的扇区数。 在大多数情况下,此条目为零。
- FAT-12 和 FAT-16扇区数: 介质启动记录中的“扇区数”字段包含介质中的扇区总数。 如果此字段为零,则扇区总数将放在位于启动记录之后的“FAT-32 扇区数”字段中。
文件分配表FAT:
文件分配表FAT放在reserved扇区之后,FAT Area本质上是由12-bit, 16-bit或32-bit的条目组成的数组。
FAT12、FAT16、FAT32 和 exFAT,分别有啥不同?
它们是文件分配表(File Allocation Table)文件系统的不同版本,它们在磁盘分区和数据存储方面有着不同的特点和限制。这些文件系统由微软开发,广泛用于不同类型的存储设备上。下面是它们之间的主要区别:
- FAT12:使用12位的文件分配表,因此称为FAT12,支持的最大分区大小为16MB。
- FAT16:使用16位的文件分配表,因此称为FAT16,支持的最大分区大小为2GB。 它的簇大小相对较小,但随着磁盘大小的增加,簇浪费的问题也变得明显。
- FAT32:使用32位的文件分配表,因此称为FAT32,支持的最大分区大小为16TB(理论上)。尽管系统可能能够识别更大的 FAT32 分区,但是windows官方支持的最大格式化分区大小仍为 32 GB。FAT32支持更大的簇大小,可以更有效地使用磁盘空间,尤其是在使用大容量硬盘时。它是目前最常见的FAT版本,被许多USB闪存驱动器和存储卡使用。
怎么计算出最大分区大小的?以fat16举例:
- FAT16 使用 16 位来表示文件分配表中的每个条目(簇),这限制了它能够管理的簇数量最大为 65536(2^16)。
- 假设每个簇的最大大小为 32KB,则最大的分区容量计算如下:
- 最大分区容量=簇的数量×每个簇的大小
- 最大分区容量=65536×32768 bytes
- 最大分区容量=2147483648 bytes=2GB
还是得支持exFAT啊!!
exFAT 使用位图来管理卷中的可用空间,使得其在向文件中写入数据时能够更有效地查找可用空间。 对于存储在连续群集中的文件,exFAT 无需遍历 FAT 链以查找所有群集,从而在访问大型文件时更有效。 闪存存储和SD 卡大于 32GB 时,需要使用exFAT。
4.filex对外接口
说白了,就是对filex得对外接口简单说明下其功能是什么,输入参数的含义,返回值的含义。太多了,自己看吧:rtos-docs/rtos-docs/filex
5. filex适配底层IO驱动
这个主要是为了让filex里面的文件操作能够真正的执行到底层设备,因此需要这个适配层。
FileX 支持多个媒体设备。 FX_MEDIA 结构定义管理媒体设备所需的一切。 此结构包含所有媒体信息,其中包括用于在驱动程序与 FileX 之间传递信息和状态的媒体特定 I/O 驱动程序及关联参数。 在大多数系统中,每个 FileX设备实例都有唯一的 I/O 驱动程序。
每个filex i/o驱动程序都有一个入口函数,这个函数最终会作为fx_media_open的一个入参,来被调用!!
VOID _fx_ram_driver(FX_MEDIA *media_ptr)
这个驱动程序入口函数会请求外设访问权限,包括初始化和启动扇区读取权限。向驱动程序发出的请求是按顺序进行的;即,filex会先等待当前请求完成,然后再发送另一个请求。
IO驱动程序请求:
由于每个IO驱动程序都具有单个入口函数,比如_fx_ram_driver
,因此filex会通过media control block发出特定的请求,其实也就是FX_MEDIA *media_ptr
啦,哈哈。
- FX_MEDIA 的 fx_media_driver_request 成员用于指定确切的驱动程序请求 。
- FX_MEDIA 的fx_media_driver_status 成员来传达请求的成功或失败结果。
- 如果驱动程序请求成功,则在驱动程序返回之前,会将 FX_SUCCESS 放入此字段。 否则,如果检测到错误,则将 FX_IO_ERROR 放入此字段。
- 驱动程序初始化:FX_DRIVER_INIT
- 启动扇区读取:FX_DRIVER_BOOT_READ,读取media的boot sector。
- 启动扇区写入:FX_DRIVER_BOOT_WRITE,写入media的boot sector。
- 扇区读取:FX_DRIVER_READ,将一个或多个逻辑扇区读入内存。
- 扇区写入:FX_DRIVER_WRITE,将一个或多个扇区写入物理设备。
- 驱动程序刷新:FX_DRIVER_FLUSH,将当前位于驱动程序扇区缓存中的所有扇区刷新到物理设备。
- 驱动程序中止:FX_DRIVER_ABORT,通知驱动程序中止物理设备中所有进一步的物理IO活动。
ram驱动程序示例代码:
FileX 演示系统随附了一个小型 RAM 磁盘驱动程序,该驱动程序在文件fx_ram_driver.c 中定义。 该驱动程序假设有 32K 内存空间,并且会为 256 个 128 字节的扇区创建启动记录。 此文件提供了一个很好的示例用于演示如何实现应用程序特定的 FileX I/O 驱动程序。