首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

FatFs源码剖析(1)

FatFs源码剖析(1)

http://www.openedv.com/posts/list/27427.htm

一、介绍:
本文以网上开源文件系统FatFs 0.01为研究对象,剖析FatFs文件系统的核心操作。FatFs目前最新版本已更新到0.10a版本,而我之所以选择0.01版本,是因为这是最早的发布版本,与最新的版本相比,去掉了很多高级应用,且代码量相对较小,宏开关也少了许多,易于阅读和理解,用来研究它的雏形再合适不过了,所以笔者选择0.01版本进行剖析。当大家了解了0.01的核心思想后,再回去看最新的版本,也就容易理解多了。
FatFs历史版本下载:http://elm-chan.org/fsw/ff/00index_e.html    在官网的最下面,能找到所有版本的下载链接。

二、重点:
1. FatFs中有两个重要的缓冲区:win[]和buffer。win[]在FATFS结构体中,buffer在FIL结构体中。
    win[]:系统缓冲区。当操作MBR,DBR,FAT表,根目录区时,使用该缓冲区;
    buffer:文件缓冲区。当对文件的内容进行操作时,如读、写、修改时,才使用该缓冲区。

2. 在对文件的f_read和f_write过程中(不考虑f_lseek的情况),只有需要读写的最后一个扇区(内容小于512字节)才会被暂存到buffer中,而前面的扇区内容是直接通过磁盘驱动disk_read/disk_write在用户缓冲区和物理磁盘之间进行交互的。

注意:FatFs 0.01与最新的版本还是不少差异的,如在0.01中,buffer只是个指针,需要用户自己定义文件缓冲区,并将buffer指向该缓冲区。而最新版本中,FIL已经有自己的buf[_MAX_SS]。在0.01中没有f_mount()函数,所以需要手动将全局指针FatFs指向自己定义的变量fs。具体的操作流程可参考官网上的示例代码。

三、关键函数总结:
1. f_open
f_open()
{
    1. 初始化SD卡,初始化FATFS对象;
    2. 查找文件的目录项;
    3. 填充文件结构体FIL。
}

2. f_read
f_read()
{
    1. 从物理磁盘直接读取所需扇区到用户缓冲区,这个过程中未使用buffer缓冲区;
    2. 如果最后一扇区要读取的字节数少于512,则先将最后一扇区读到buffer中,然后再从buffer拷贝需要的字节到用户缓冲区中。
}



3. f_write
f_write()
{
    1. 从用户缓冲区直接写入到物理磁盘,这个过程中未使用buffer缓冲区;
    2. 如果要写入的最后一扇区内容少于512字节,则先从物理磁盘读取最后一扇区的内容到buffer中,然后修改buffer中的相应内容,并设置回写标记,这样下次调用f_close/f_write时,就会将buffer回写到物理磁盘中。
}



4. f_close
关键是调用了f_sync函数。

5. f_sync
f_sync()
{
    1. 将buffer回写到物理磁盘中;
    2. 读取文件对应的目录项到win[]中,更新参数,并回写。
}




5. move_window
move_window专用于操作win[]系统缓冲区。

move_window(B);
调用前:
                     

执行中:


调用后:
                     
继承事业,薪火相传
返回列表