当前位置:首页 > 单片机 > 单片机
[导读]文件系统分析了两天,自己都不知道入没入门,现在就把这两天分析的结果总结一下吧!一、res = f_mount(0,&fs);首先是挂接根文件系统,为什么要挂接根文件系统内容?因为根文件系统里面会对我们的SD卡进行初始化,除此

文件系统分析了两天,自己都不知道入没入门,现在就把这两天分析的结果总结一下吧!


一、res = f_mount(0,&fs);

首先是挂接根文件系统,为什么要挂接根文件系统内容?因为根文件系统里面会对我们的SD卡进行初始化,除此之外
f_mount函数可以实现在FatFs模块上注册/ 注销一个工作区。 在使用任何其他文件函数之前,必须使用该函数为每个
卷注册一个工作区。要注销一个工作区,只要指定FileSystemObject 为NULL即可,然后该工作区可以被丢
弃。 该函数只初始化给定的工作区,以及将该工作区的地址注册到内部表中,不访问磁盘I/O 层。卷装入过程是在
f_mount函数后或存储介质改变后的第一次文件访问时完成的。
接着分析这个函数是怎么定义的:



/********************************************************************************

*函数名称:f_mount

*函数说明:用于挂载/卸载磁盘驱动器

*输入参数:vol:Logicaldrivenumbertobemounted/unmounted

*fs:Pointertonewfilesystemobject(NULLforunmount)

*返回参数:挂载标识FR_OK表示成功!

*注意事项:无

*********************************************************************************/

FRESULTf_mount(

BYTEvol,/*Logicaldrivenumbertobemounted/unmounted*/

FATFS*fs/**/

)

{

FATFS*rfs;

if(vol>=_VOLUMES)/*Checkifthedrivenumberisvalid*///如果

returnFR_INVALID_DRIVE;

rfs=FatFs[vol];/*Getcurrentfsobject*/

if(rfs){

#if_FS_LOCK

clear_lock(rfs);

#endif

#if_FS_REENTRANT/*Discardsyncobjectofthecurrentvolume*/

if(!ff_del_syncobj(rfs->sobj))returnFR_INT_ERR;

#endif

rfs->fs_type=0;/*Clearoldfsobject*/

}

if(fs){

fs->fs_type=0;/*Clearnewfsobject*/

#if_FS_REENTRANT/*Createsyncobjectforthenewvolume*/

if(!ff_cre_syncobj(vol,&fs->sobj))returnFR_INT_ERR;

#endif

}

FatFs[vol]=fs;/*Registernewfsobject*/

returnFR_OK;

}

1、vol = 0,fs = &fs 首先看这个rfs = FatFs[vol];/* Get current fs object */
2、接着我们看到这个 FATFS *FatFs[_VOLUMES],从而知道了FatFs[vol]指向的是个 FATFS类型的结构体
那么到底FATFS的原型是什么呢?看下面!这是去除宏定义精简之后的结构体成员。


typedefstruct{

BYTEfs_type;/*FATsub-type(0:Notmounted)*/

BYTEdrv;/*Physicaldrivenumber*/

BYTEcsize;/*Sectorspercluster(1,2,4...128)*/

BYTEn_fats;/*NumberofFATcopies(1,2)*/

BYTEwflag;/*win[]dirtyflag(1:mustbewrittenback)*/

BYTEfsi_flag;/*fsinfodirtyflag(1:mustbewrittenback)*/

WORDid;/*FilesystemmountID*/

WORDn_rootdir;/*Numberofrootdirectoryentries(FAT12/16)*/

DWORDlast_clust;/*Lastallocatedcluster*/

DWORDfree_clust;/*Numberoffreeclusters*/

DWORDfsi_sector;/*fsinfosector(FAT32)*/

DWORDn_fatent;/*NumberofFATentries(=numberofclusters+2)*/

DWORDfsize;/*SectorsperFAT*/

DWORDfatbase;/*FATstartsector*/

DWORDdirbase;/*Rootdirectorystartsector(FAT32:Cluster#)*/

DWORDdatabase;/*Datastartsector*/

DWORDwinsect;/*Currentsectorappearinginthewin[]*/

BYTEwin[_MAX_SS];/*DiskaccesswindowforDirectory,FAT(andDataontinycfg)*///存放的就是我们读SD卡第一扇区的内容

}FATFS;



到这里我们就可以推断出rfs也应该是FATFS*类型的,所以可以通过rfs ->drv的方法去访问文件系统的各项参数了。下面验证一下:
3、确实在ff.c文件的f_mount函数里面定义了一个这样的变量
FATFS *rfs;
从而验证了我们的猜想。总结一下这几句话的作用
if (vol >= _VOLUMES)/* Check if the drive number is valid */
return FR_INVALID_DRIVE;
rfs = FatFs[vol];/* Get current fs object */
我的理解:挂载的目的就是为了给rfs分配地址,假如没有使用到内存管理malloc的话,使用这种方法也可以的。但是这里的rfs还是NULL的。
4、接着我们可以看看下面的代码,这也是去除了相关宏定义之后的代码


if(rfs){

rfs->fs_type=0;/*Clearoldfsobject*/

}

if(fs){

fs->fs_type=0;/*Clearnewfsobject*/

}

FatFs[vol]=fs;/*Registernewfsobject*/

returnFR_OK;



分析:
a、非零为真,那么在这里rfs这个地址肯定是空的,因为给rfs赋值就是NULL。
b、那么fs又是什么东西呢?看传入参数可以知道:fs = &fs ,因为之前这个是定义过了的:FATFS *rfs;。
明显的知道我们传入的fs不为NULL的,所以自然执行了fs->fs_type = 0;将类型清零,只不过,这个类型是
我在主函数里面使用的(新的),那么清零到底表示什么意思呢?其实是有说明的FAT sub-type (0:Not mounted)
这就是表示卸载的意思!
c、好的,卸载掉旧的,那么就可以注册新的了, FatFs[vol] = fs;/* Register new fs object */
总结一下这上面几行代码的作用:
我的理解:就是实现了挂载文件系统的目标文件,也就是给它分配了一个地址空间。而FatFs[vol]这个指针会被其他的ff.c里面的函数调用的
二、接着我们分析一下如何实现打开一个文件的
1、首先看一看main里面的调用
res = f_open(&fdst, "0:/test.txt", FA_CREATE_ALWAYS | FA_WRITE);
然后查看函数定义:这是去除无关宏定义之后的代码:

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭