FatFs移植笔记
本人一向较懒,为了方便自己使用SPI Flash,决定移植一个文件系统,这样就可以免去每次写入都要计算地址的痛苦,下面主要讲一下我对FatFs移植的一些体会,一来方便以后的朋友,二来给自己做个笔记。
首先,先简单的介绍一下FatFs,FatFs是一个适用于嵌入式系统地开源的通用FAT文件系统模型,这也就是说,它是与硬件无关的。移植工作的重点在两个方面:1、根据实际硬件情况配置FatFs;2、实现硬件I/O驱动,并将硬件驱动适配到FatFs。
FatFs配置分析:
下表给出了我移植时对FatFs的配置情况
配置选项 | 说明 | 实际值 | 评论 |
_FS_TINY | 使能Tiny版本 | 0 | 目前RAM空间充足 |
_FS_READONLY | 使能只读 | 0 | 文件系统支持读写操作 |
_FS_MINIMIZE | 设置功能裁减程度 | 0 | 使用全功能版本 |
_USE_STRFUNC | 使能string功能 | 0 | 不使能 |
_USE_MKFS | 使能f_mkf功能 | 1 | 使能mkfs,用来格式化SPI Flash |
_USE_FORWARD | 使能f_forward; | 0 | 不是用forward |
_USE_FASTSEEK | 使能fast_seek | 0 | 不使用fastseek |
_CODE_PAGE | 设置code page | 1 | 只支持ascii码 |
_USE_LFN | 使能长文件名 | 0 | 不支持长文件名,增加移植成功率 |
_MAX_SS | 最大扇区大小 | 4096 | SPI Flash的扇区大小为4K |
_FS_RPATH | 使能相对路径 | 0 | 不使用相对路径,先移植成功后再使能也不迟 |
_FS_LABEL | 使能lable | 0 | 不使用Lable功能 |
_VOLUMES | 设置最大支持volume数 | 1 | 系统中只存在一个volume,即SPI Flash |
_MULTI_PARTITION | 使能多分区 | 0 | 整块flash当成一个分区,不分区 |
_FS_REENTRANT | 使能重入 | 0 | 不带RTOS,不需要同步 |
_FS_LOCK | 设置文件最大打开数 | 0 | 每个文件只许打开一次 |
下图介绍了FatFs配置与功能裁减之间的关系:
(TBD)
FatFs用户定义函数说明:
FatFs的移植工作量不大,用户只需要完成6个函数就可以完成工作, 分别为:disk_initialize,disk_status,disk_read,disk_write,disk_ioctl,get_fattime。
函数 | 功能 |
DSTATUS disk_initialize ( BYTE pdrv /* [IN] Physical drive number */ ) |
函数的主要功能是完成对应硬件IO驱动的初始化工作,对于我的移植来说,就是完成SPI驱动的初始化 |
DSTATUS disk_status ( BYTE pdrv /* [IN] Physical drive number */ ) |
获取当前硬件的状态 |
DRESULT disk_read ( BYTE pdrv, /* [IN] Physical drive number */ BYTE* buff, /* [OUT] Pointer to the read data buffer */ DWORD sector, /* [IN] Start sector number */ UINT count /* [IN] Number of sectros to read */ ) |
这个函数FatFs会调用硬件驱动去读取若干个扇区数据到buffer中 |
DRESULT disk_write ( BYTE drv, /* [IN] Physical drive number */ const BYTE* buff, /* [IN] Write data (may be non aligned) */ DWORD sector, /* [IN] Sector number to write */ UINT count /* [IN] Number of sectors to write */ ) |
这个函数FatFs会调用硬件驱动写若干个扇区 |
DRESULT disk_ioctl ( BYTE pdrv, /* [IN] Drive number */ BYTE cmd, /* [IN] Control command code */ void* buff /* [I/O] Parameter and data buffer */ ) |
这个函数,FatFs可以获取扇区大小,块大小,扇区个数;以及擦除扇区 |
DWORD get_fattime (void) | 通过函数获取时间,一般情况下会使用RTC |
在完成了上面的工作后,FatFs的移植也就完成了,接下来就可以写代码来测试了。 此外,在移植的过程中,扇区的对齐也是要着重考虑的,扇区对齐不仅有利于效率的提升,更能延长设备的使用寿命。这一点我会再写一篇文章来讲述。
希望这篇文章对朋友们会有帮助,有什么问题可以留言探讨,这里就不贴代码了占篇幅了。
本博客全部文章(除文章标题或文内有另外特别说明的)皆为本人辛苦码字而得,本人拥有其版权。
转载时请以超链接形式标明文章原始出处和作者。谢谢