FatFS源代码中的函数逻辑关系

第一  调用函数 f_mount()

result = f_mount(&fs, FS_VOLUME_NAND, );    /* Mount a logical drive */
FS_VOLUME_NAND 代表 “路径”

第二  进入函数 f_mount()内

 /*-----------------------------------------------------------------------*/
/* Mount/Unmount a Logical Drive */
/*-----------------------------------------------------------------------*/ FRESULT f_mount (
FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/
const TCHAR* path, /* Logical drive number to be mounted/unmounted */
BYTE opt /* 0:Do not mount (delayed mount), 1:Mount immediately */
)
{
FATFS *cfs;
int vol;
FRESULT res;
const TCHAR *rp = path; vol = get_ldnumber(&rp);
if (vol < ) return FR_INVALID_DRIVE;
cfs = FatFs[vol]; /* Pointer to fs object */ if (cfs) {
#if _FS_LOCK
clear_lock(cfs);
#endif
#if _FS_REENTRANT /* Discard sync object of the current volume */
if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR;
#endif
cfs->fs_type = ; /* Clear old fs object */
} if (fs) {
fs->fs_type = ; /* Clear new fs object */
#if _FS_REENTRANT /* Create sync object for the new volume */
if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR;
#endif
}
FatFs[vol] = fs; /* Register new fs object */ if (!fs || opt != ) return FR_OK; /* Do not mount now, it will be mounted later */ res = find_volume(&fs, &path, ); /* Force mounted the volume */
LEAVE_FF(fs, res);
}

代码中第17行 vol = get_ldnumber(&rp) 将路径转换为 logical drive number

第三  进入函数 get_ldnumber()

 /*-----------------------------------------------------------------------*/
/* Get logical drive number from path name */
/*-----------------------------------------------------------------------*/ static
int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */
const TCHAR** path /* Pointer to pointer to the path name */
)
{
const TCHAR *tp, *tt;
UINT i;
int vol = -; if (*path) { /* If the pointer is not a null */
for (tt = *path; (UINT)*tt >= (_USE_LFN ? ' ' : '!') && *tt != ':'; tt++) ; /* Find ':' in the path */
if (*tt == ':') { /* If a ':' is exist in the path name */
tp = *path;
i = *tp++ - '';
if (i < && tp == tt) { /* Is there a numeric drive id? */
if (i < _VOLUMES) { /* If a drive id is found, get the value and strip it */
vol = (int)i;
*path = ++tt;
}
} else { /* No numeric drive number */
#if _STR_VOLUME_ID /* Find string drive id */
static const char* const str[] = {_VOLUME_STRS};
const char *sp;
char c;
TCHAR tc; i = ; tt++;
do {
sp = str[i]; tp = *path;
do { /* Compare a string drive id with path name */
c = *sp++; tc = *tp++;
if (IsLower(tc)) tc -= 0x20;
} while (c && (TCHAR)c == tc);
} while ((c || tp != tt) && ++i < _VOLUMES); /* Repeat for each id until pattern match */
if (i < _VOLUMES) { /* If a drive id is found, get the value and strip it */
vol = (int)i;
*path = tt;
}
#endif
}
return vol;
}
#if _FS_RPATH && _VOLUMES >= 2
vol = CurrVol; /* Current drive */
#else
vol = ; /* Drive 0 */
#endif
}
return vol;
}

本函数获取 path 后解析 path 得到 logical drive number

代码中

第15行 判断 path 的内容是否为空字符 NULL

第16行 检测冒号 ‘:’,for循环的条件为 路径名中的字符 >= (_USE_LFN ? ' ': '!') 且 != ‘:’,只要_USE_LFN>0则第一个条件恒满足,找到冒号‘:’后则第二个条件失败,即跳出循环

第17行 再次确认当前路径字符为冒号‘:’

第18行 暂存*path

第19行 得到路径中的首字符那个数字字符对应的数字

第20行 判断该数字在0~9之中,且路径中的第二个字符为冒号‘:’

第21行 判断该数字在定义的范围内

第22行 将该数字赋值给vol

第46行 最终将vol值返回

帮助理解的代码示例

示例一 指针与字符串

 #include "stdio.h"

 void ptf(char **p);

 int main(void)
{
char *pstr = "0:wojiushiyixia"; ptf(&pstr); return ;
} void ptf(char **p)
{
if(*p)
{
printf("*p = %d\n", *p);
printf("*p = %s\n", *p);
}
else
{
printf("*p = NULL\n");
} }

运行环境 C-Free5.0

运行结果

 示例二 多参数宏定义

 #include "stdio.h"

 #define _VOLUME_STRS    "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3"

 int main(void)
{
int i;
static const char* const str[] = {_VOLUME_STRS}; for(i = ; i < ; i++)
{
printf("str[%d] = %s\n", i, str[i]);
} return ;
}

运行环境 C-Free5.0

运行结果

学习1__STM32--FatFS之逻辑盘符与物理盘符的更多相关文章

  1. Linux学习之管道符、重定向、通配符、转义符、环境变量

    Linux学习之管道符.重定向.通配符.转义符.环境变量 1. 输入输出重定向 输入重定向是指把文件导入命令中. 输出重定向是指把原本要输出到屏幕的数据信息写入指定文件中. a 标准输入重定向(STD ...

  2. USB学习笔记连载(十二):USB描述符

    USB设备是端口,接口,配置的集合,USB协议是以各种USB描述符来表征USB设备的功能.计算机通过这些描述符来获得USB设备的功能. USB描述符包括: USB标准设备描述符,USB集线器描述符.H ...

  3. 学习C#修饰符:类修饰符和成员修饰符

    C#修饰符之类修饰符:public.internal. partial.abstract.sealed.static C#修饰符之成员修饰符:public.protected.private.inte ...

  4. WEB学习路线2019完整版(附视频教程+网盘下载地址)

    WEB学习路线2019完整版(附视频教程+网盘下载地址).适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利.高薪水的职业了.所以现在学习web前端开发的技术人员也是 ...

  5. 《Python Web开发学习实录》高清PDF版|百度网盘免费下载|Python Web开发学习实录

    <Python Web开发学习实录>高清PDF版|百度网盘免费下载|Python Web开发学习实录 提取码:9w3o 内容简介 Python是目前流行的动态脚本语言之一. 李勇,本书共1 ...

  6. 电脑盘符为什么从C盘开始?A盘和B盘去哪了?

    虽然我们几乎每天都在跟电脑打交道,但是不知道大家有没有过疑惑,为什么电脑盘符是从C盘开始命名呢?有没有A盘和B盘??A盘和B盘去哪了??? 其实,A盘和B盘是真实存在的. 在早期的DOS时代,计算机的 ...

  7. 怎么制作U盘系统/PE启动盘

    原地址:http://jingyan.baidu.com/article/3c48dd3453d05de10be358fb.html 不用光驱就能启动系统,做一个U盘启动系统就搞定,下面我给大家演示如 ...

  8. VirtualBox虚拟磁盘文件.vdi从C盘转移到D盘

    起因很简单:C盘快爆满了,用PS修个图的都无法保存.用Everything搜索了下C盘,发现有个WIN7的.vdi文件,竟然占据了15G的宝贵C盘空间!记得有一次,我直接把.vdi文件转移,然后在Vi ...

  9. Win & Mac 系统之间U盘传递的U盘文件格式选取问题

    Win & Mac 系统之间U盘传递的U盘文件格式选取问题 1. Win系统与Mac系统之间可以通过 exFat U盘文件系统传递 exFAT(Extended File Allocation ...

随机推荐

  1. Python_内置函数之map()

    map 会根据提供的函数对指定序列做映射. 代码如下: def square(x): return x ** 2 ret = map(square, [1, 2, 3, 4, 5]) # 计算列表各元 ...

  2. apply和call方法

    真伪数组转换 /* apply和call方法的作用: 专门用于修改方法内部的this 格式: call(对象, 参数1, 参数2, ...); apply(对象, [数组]); */ function ...

  3. [转帖]windows7/windows NT介绍

    windows7/windows NT介绍 原文应该是IT168发布的 但是一直没找到 感觉看了之后 明白了很多 技术都是互相融合的 没有严格意义上的对立直说.   Windows 7/Windows ...

  4. If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.

    学习Spring Boot 过程中遇到了下列这个问题 Description: Failed to configure a DataSource: 'url' attribute is not spe ...

  5. PermGen space 内存溢出

    1.修改D:\tools\tomcat\tomcat - 7\apache-tomcat-7.0.91\bin tomcat 路径下bin 文件的catalina.bat文件 添加 JAVA_OPTS ...

  6. Python基础知识2-内置数据结构(下)

    bytes.bytearray #思考下面例子: a = 1 b = a print(a == b)#True print(a is b)#True print(id(a) is id(b))#Fal ...

  7. CSS自定义属性expression_r

    CSS的出现使网页制作者在对网页元素的控制方便许多,当然,有利必有弊,CSS只能对颜色.大小.距离等静态样式有效,对于要实现某些html元素的动态样式就显得有些力不从心.有了CSS的自定义属性expr ...

  8. idea的pom.xml中提示dependency‘’not found

    今天下午在更新svn上的项目到本地,发现pom文件中的如下依赖的version一直标红,鼠标放上去显示“dependency not found.” 同时检查了Maven Projects中该项目引入 ...

  9. 引入kaptcha实现验证码验证

    1.导入jar包, 可以选择去 https://mvnrepository.com 里面搜索,也可以直接复制下面的代码 2.复制到maven配置文件pom.xml中并保存 <dependency ...

  10. ArrayList 初学小结!

    package good.com; import java.util.ArrayList;//导入 ArrayList 包 调用动态数组! public class ArrayListList { / ...