Fatfs文件系统分析(3)-底层接口分析

Fatfs文件系统分析(3)-diskio.c/diskio.h文件分析

        由于FatFs模块完全与磁盘I/O层分开,因此底层磁盘I/O需要下列函数去读/写物理磁盘以及获取当前时间。由于底层磁盘I/O模块并不是FatFs的一部分,因此它必须由用户提供。

1) disk_initialize

初始化磁盘驱动器

DSTATUS disk_initialize (

  BYTE Drive           /* 物理驱动器号 */

);

参数

Drive指定待初始化的物理驱动器号。

返回值

disk_initialize函数返回一个磁盘状态作为结果。磁盘状态的详情,参考disk_status函数。

描述

disk_initialize函数初始化一个物理驱动器。函数成功后,返回值中的STA_NOINIT标志被清除。

disk_initialize函数被FatFs模块在卷挂载过程中调用,去管理存储介质的改变。FatFs模块起作用时,或卷上的FAT结构可以被瓦解时,应用程序不能调用该函数。可以使用f_mount函数去重新初始化文件系统。

 

2)disk_status

获取当前磁盘的状态

DSTATUS disk_status (

  BYTE Drive     /* 物理驱动器号*/

);

参数

Drive指定待确认的物理驱动器号。

返回值

磁盘状态,是下列标志的组合:STA_NOINIT

指示磁盘驱动器还没有被初始化。当系统复位、磁盘移除和disk_initialize函数失败时,该标志被设置;当disk_initialize函数成功时,该标志被清除。STA_NODISK

指示驱动器中没有存储介质。当安装了磁盘驱动器后,该标志始终被清除。

STA_PROTECTED

指示存储介质被写保护。在不支持写保护缺口的驱动器上,该标志始终被清除。当STA_NODISK被设置时,该标志无效。

 

3)disk_read

从磁盘驱动器中读取扇区

DRESULT disk_read (

  BYTE Drive,          /* 物理驱动器号 */

  BYTE* Buffer,        /* 读取数据缓冲区的指针 */

  DWORD SectorNumber,  /* 起始扇区号 */

  BYTE SectorCount     /* 要读取的扇区数 */

);

参数

Drive指定物理驱动器号。

Buffer存储读取数据的缓冲区的指针。该缓冲区大小需要满足要读取的字节数(扇区大小 * 扇区总数。由上层指定的存储器地址可能会也可能不会以字边界对齐。SectorNumber

指定在逻辑块地址(LBA)中的起始扇区号。

SectorCount指定要读取的扇区数(1-255)

返回值

RES_OK (0)函数成功

RES_ERROR在读操作过程中发生了不能恢复的硬错误。

RES_PARERR无效的参数。

RES_NOTRDY磁盘驱动器还没被初始化。


 

 4)disk_write

向磁盘驱动器中写入扇区

DRESULT disk_write (

  BYTE Drive,          /* 物理驱动器号 */

  const BYTE* Buffer,  /* 写入数据缓冲区的指针(可能未对齐) */

  DWORD SectorNumber,  /* 起始扇区号 */

  BYTE SectorCount     /* 要写入的扇区数 */

);

参数

Drive指定物理驱动器号。

Buffer存储写入数据的缓冲区的指针。由上层指定的存储器地址可能会也可能不会以字边界对齐。

SectorNumber指定在逻辑块地址(LBA)中的起始扇区号。

SectorCount指定要写入的扇区数(1-255)

返回值


 

RES_OK (0)函数成功

RES_ERROR在读操作过程中发生了不能恢复的硬错误。

RES_WRPRT存储介质被写保护。

RES_PARERR无效的参数。

RES_NOTRDY磁盘驱动器还没被初始化。

描述

在只读配置中,不需要此函数。

 

5) disk_ioctl

控制设备特定的功能以及磁盘读写以外的其它功能。

DRESULT disk_ioctl (

  BYTE Drive,      /* 驱动器号 */

  BYTE Command,    /* 控制命令代码 */

  void* Buffer     /* 数据传输缓冲区 */

);

参数

Drive指定驱动器号(1-9)

Command指定命令代码。

Buffer取决于命令代码的参数缓冲区的指针。当不使用时,指定一个NULL指针。

返回值


 

RES_OK (0)函数成功。

RES_ERROR发生错误。

RES_PARERR无效的命令代码。

RES_NOTRDY磁盘驱动器还没被初始化。


 

描述

FatFs模块只使用下述与设备无关的命令,没有使用任何设备相关功能。

命令

描述

CTRL_SYNC

确保磁盘驱动器已经完成等待写过程。当磁盘I/O模块有一个写回高速缓存时,立即冲洗脏扇区。在只读配置中,不需要该命令。

GET_SECTOR_SIZE

返回驱动器的扇区大小赋给Buffer指向的WORD变量。在单个扇区大小配置中(_MAX_SS 512),不需要该命令。

GET_SECTOR_COUNT

返回总扇区数赋给Buffer指向的DWORD变量。只在f_mkfs函数中,使用了该命令。

GET_BLOCK_SIZE

返回以扇区为单位的存储阵列的擦除块大小赋给Buffer指向的DWORD变量。当擦除块大小未知或是磁盘设备时,返回1。只在f_mkfs函数中,使用了该命令。

 

 

6)get_fattime

获取当前时间

DWORD get_fattime (void);

返回值

返回的当前时间被打包进一个DWORD数值。各位域定义如下:


 

bit31:25年,从1980年开始算起(0..127)

bit24:21(1..12)

bit20:16(1..31)

bit15:11(0..23)

bit10:5(0..59)

bit4:0/2(0..29),由此可见FatFs的时间分辨率为2


 

描述

get_fattime函数必须返回任何有效的时间,即使系统不支持实时时钟。如果返回一个0,则文件将没有一个有效的时间。在只读配置中,不需要此函数。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FATFS文件系统是一种在FAT文件系统基础上进行了封装和简化的文件系统FATFS文件系统的原理是通过使用FAT表来索引和定位磁盘中的文件数据。FAT表是一种链式结构,类似于一本书的目录,用于记录文件的存储位置和状态。FAT文件系统将目录也抽象为文件,以简化对数据的管理。 在FATFS文件系统中,用户无需了解FATFS的内部结构和复杂的FAT协议,只需要调用提供的应用接口函数(如f_open,f_read,f_write和f_close等),就可以像在PC上读写文件一样简单地进行操作。FATFS文件系统文件的存储组织为簇链式数据结构,文件被分成一系列的数据簇进行存储。 FAT文件系统的目录结构是一颗从根到叶的有向树,根目录是整个目录结构的入口。跟目录的位置在格式化时就已经确定,通常紧随FAT表之后,大小为32个扇区。根据根目录的位置,FAT文件系统可以寻址其他文件文件夹。 FAT文件系统将目录(文件夹)当作一个特殊的文件来处理,在FAT16中,根目录的组织形式和普通的目录并没有不同,而在FAT32中,根目录也被当作文件处理。目录文件实际上是一个存放其他文件文件夹入口参数的数据表,其占用空间的大小并不等同于其下所有数据的大小,但也不为0。目录文件以32个字节为单位进行簇的分配,每个字节偏移定义一个文件文件夹的属性,形成一个简单的二维表。 总的来说,FATFS文件系统通过使用FAT表和目录文件来管理文件的索引和定位,为用户提供了简单而方便的文件操作接口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值