文件系统FatFsR0.09a翻译(二):ffconf.h

FatFs文件系统配置详解
本文详细介绍了FatFs文件系统的配置选项,包括函数和缓冲区配置、本地语言和文件命名空间配置、物理驱动配置及系统配置等内容。这些配置项允许用户根据实际需求定制文件系统的行为。

//本译文只供学习使用,未经作者许可,不得用于其它任何用途  

//译者:xiaofeng

//修改日期:2013/03/18

//版本:V1.0

//版权所有,盗版必究。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
/*---------------------------------------------------------------------------/
/  FatFs - FAT file system module configuration file  R0.09a (C)ChaN, 2012
/----------------------------------------------------------------------------/
/
/ CAUTION! Do not forget to make clean the project after any changes to
/ the configuration options.
/注意!配置选项任何变换之后不要忘了整理工程
/
/----------------------------------------------------------------------------*/
#ifndef _FFCONF
#define _FFCONF 4004    /* Revision ID */
   
   
/*---------------------------------------------------------------------------/
/ Functions and Buffer Configurations
/函数和缓冲区的配置
/----------------------------------------------------------------------------*/
   
#define _FS_TINY        0   /* 0:正常 1:迷你的 0:Normal or 1:Tiny */
/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system
/  object instead of the sector buffer in the individual file object for file
/  data transfer. This reduces memory consumption 512 bytes each file object. */
//当FS_TINY为1,将减少内存的使用
   
#define _FS_READONLY    0   /* 0:读/写 1:只读 0:Read/Write or 1:Read only */
/* Setting _FS_READONLY to 1 defines read only configuration. This removes
/  writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,
/  f_truncate and useless f_getfree. */
//设置FS_READONLY为1,将删除一些函数
   
#define _FS_MINIMIZE    0   /* 0 to 3 */
/* The _FS_MINIMIZE option defines minimization level to remove some functions.
/
/   0: Full function.
/   1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename
/      are removed.
/   2: f_opendir and f_readdir are removed in addition to 1.
/   3: f_lseek is removed in addition to 2. */
//FS_MINIMIZE选项定义最小限度的删除部分函数,设定不同值裁剪程度不同
   
#define _USE_STRFUNC    0   /* 0:取消 1:使能 0:Disable or 1-2:Enable */
/* To enable string functions, set _USE_STRFUNC to 1 or 2. */
//字符串支持是否使能
   
#define _USE_MKFS       0   /* 0:取消 1:使能 0:Disable or 1:Enable */
/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */
//f_mkfs函数的使能
   
#define _USE_FORWARD    0   /* 0:取消 1:使能  0:Disable or 1:Enable */
/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */
//f_forward函数的使能
   
#define _USE_FASTSEEK   0   /* 0:取消 1:使能  0:Disable or 1:Enable */
/* To enable fast seek feature, set _USE_FASTSEEK to 1. */
//快速索引特色的支持
   
   
/*---------------------------------------------------------------------------/
/ Locale and Namespace Configurations
/ 本地语言和文件命名空间的配置
/----------------------------------------------------------------------------*/
   
#define _CODE_PAGE  936  //中文应该选择936
/* The _CODE_PAGE specifies the OEM code page to be used on the target system.
/  Incorrect setting of the code page can cause a file open failure.
/ CODE_PAGE指定OEM编码页在目标系统上的使用,不正确的设定将导致打开文件失败
/   932  - Japanese Shift-JIS (DBCS, OEM, Windows)
/   936  - Simplified Chinese GBK (DBCS, OEM, Windows)
/   949  - Korean (DBCS, OEM, Windows)
/   950  - Traditional Chinese Big5 (DBCS, OEM, Windows)
/   1250 - Central Europe (Windows)
/   1251 - Cyrillic (Windows)
/   1252 - Latin 1 (Windows)
/   1253 - Greek (Windows)
/   1254 - Turkish (Windows)
/   1255 - Hebrew (Windows)
/   1256 - Arabic (Windows)
/   1257 - Baltic (Windows)
/   1258 - Vietnam (OEM, Windows)
/   437  - U.S. (OEM)
/   720  - Arabic (OEM)
/   737  - Greek (OEM)
/   775  - Baltic (OEM)
/   850  - Multilingual Latin 1 (OEM)
/   858  - Multilingual Latin 1 + Euro (OEM)
/   852  - Latin 2 (OEM)
/   855  - Cyrillic (OEM)
/   866  - Russian (OEM)
/   857  - Turkish (OEM)
/   862  - Hebrew (OEM)
/   874  - Thai (OEM, Windows)
/   1    - ASCII only (Valid for non LFN cfg.)
*/
   
   
#define _USE_LFN    0       /* 0 to 3 */
#define _MAX_LFN    255     /* Maximum LFN length to handle (12 to 255) */
/* The _USE_LFN option switches the LFN support.
/ USE_LFN选项选择长文件名的支持程度
/   0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect.
/   0:不支持长文件名,MAX_LEN和LFN_UNICODE不影响
/   1: Enable LFN with static working buffer on the BSS. Always NOT reentrant.
/   1:在BSS的静态缓冲区上对长文件名的支持,总是不可重入的
/   2: Enable LFN with dynamic working buffer on the STACK.
/   2:在堆栈的动态缓冲区上对长文件名的支持
/   3: Enable LFN with dynamic working buffer on the HEAP.
/   3:在堆的动态缓冲区上对长文件名支持
/
/  The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN,
/  Unicode handling functions ff_convert() and ff_wtoupper() must be added
// 对长文件名支持时,Unicode处理函数ff_convert()和ff_wtoupper()必须添加到工程
/  to the project. When enable to use heap, memory control functions
/  ff_memalloc() and ff_memfree() must be added to the project. */
// 当使用堆,内存控制时,ff_memalloc()和ff_memfree()必须添加到工程
   
#define _LFN_UNICODE    0   /* 0:ANSI/OEM or 1:Unicode */
/* To switch the character code set on FatFs API to Unicode,
/  enable LFN feature and set _LFN_UNICODE to 1. */
// FatFs API要切换字符编码形式为Union时,将LEN和LFN_UNICODE为1
   
#define _FS_RPATH       0   /* 0 to 2 */
/* The _FS_RPATH option configures relative path feature.
/  FS_RPATH选项配置相对路径特征
/   0: Disable relative path feature and remove related functions.
/   0:取消相对路径特征,删除相关函数
/   1: Enable relative path. f_chdrive() and f_chdir() are available.
/   1:取消相对路径特征,但f_chdrive()和f_chdir()仍然可用
/   2: f_getcwd() is available in addition to 1.
/   2:除1之外f_getcwd()函数仍然可用
/  Note that output of the f_readdir fnction is affected by this option. */
//注意!f_readdir函数的输出受此项配置的影响
   
   
/*---------------------------------------------------------------------------/
/ Physical Drive Configurations
/ 物理驱动配置
/----------------------------------------------------------------------------*/
   
#define _VOLUMES    1
/* Number of volumes (logical drives) to be used. */
// 卷(逻辑驱动器)能使用的数目
   
#define _MAX_SS     512     /* 512, 1024, 2048 or 4096 */
/* Maximum sector size to be handled.能处理的最大扇区大小
/  Always set 512 for memory card and hard disk but a larger value may be
/  required for on-board flash memory, floppy disk and optical disk.
/  When _MAX_SS is larger than 512, it configures FatFs to variable sector size
/  and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */
   
   
#define _MULTI_PARTITION    0   /* 0\xA3:单分区 1/2:多分区 0:Single partition, 1/2:Enable multiple partition */
/* When set to 0, each volume is bound to the same physical drive number and
/ it can mount only first primaly partition. When it is set to 1, each volume
/ is tied to the partitions listed in VolToPart[]. */
   
   
#define _USE_ERASE  0   /* 0:Disable or 1:Enable */
/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command
/  should be added to the disk_ioctl functio. */
// 使能扇区擦输功能,应设定USE_ERASE为1
   
   
/*---------------------------------------------------------------------------/
/ System Configurations
/ 系统配置
/----------------------------------------------------------------------------*/
   
#define _WORD_ACCESS    0   /* 0 or 1 */
/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS
/  option defines which access method is used to the word data on the FAT volume.
/  优先设置为0,兼用所有的平台,WORD_ACCESS选项定义了那种方式获取字数据在FAT卷上
/   0: Byte-by-byte access.
/   1: Word access. Do not choose this unless following condition is met.
/
/  When the byte order on the memory is big-endian or address miss-aligned word
/  access results incorrect behavior, the _WORD_ACCESS must be set to 0.
/  If it is not the case, the value can also be set to 1 to improve the
/  performance and code size.
*/
   
   
/* A header file that defines sync object types on the O/S, such as
/  windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */
//在O/S上一个头文件定义同步对象类型
   
#define _FS_REENTRANT   0       /* 0:Disable or 1:Enable */
#define _FS_TIMEOUT     1000    /* Timeout period in unit of time ticks */
#define _SYNC_t         HANDLE  /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */
   
/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module.
/  FS_REENTRANT选项选择FatFs模块是否可重入(线程安全)
/   0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect.
/   1: Enable reentrancy. Also user provided synchronization handlers,
/      ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj
/      function must be added to the project. */
   
   
#define _FS_LOCK    0   /* 0:Disable or >=1:Enable */
/* To enable file lock control feature, set _FS_LOCK to 1 or greater.
   The value defines how many files can be opened simultaneously. */
//使能文件锁功能,设置FS_LOCK为1或者更大
//定义的大小决定了多少文件能同时打开
   
#endif /* _FFCONFIG */

<think>好的,我现在需要帮助用户解决在FatFs中遇到的`f_rmdir`未定义的问题,特别是`ffconf.h`中`FF_USE_DIR`未定义的情况。用户已经提供了相关的引用内容,我需要结合这些信息来给出解决方案。 首先,用户提到在`ffconf.h`中没有定义`FF_USE_DIR`。根据引用[1],在OpenHarmony的FatFs配置中,默认可能没有启用目录功能。FatFs的很多功能需要通过`ffconf.h`中的宏来启用,所以`FF_USE_DIR`可能默认被注释或设置为0。因此,用户需要手动修改这个宏定义来启用目录操作。 接下来,我需要确认用户是否正确修改了`ffconf.h`。根据引用[1]中的示例,用户可能需要找到该文件中的相关部分,将`FF_USE_DIR`设置为1。同时,还需要检查是否有其他相关配置,比如`FF_FS_READONLY`是否设置为0,因为只读模式下无法删除目录。 另外,用户提到使用LiteOS-M,引用[1]显示在LiteOS-M环境下,FatFs的配置可能与标准配置不同。例如,`FF_VOLUMES`被设置为4,而用户可能需要在此环境下特别处理`FF_USE_DIR`的定义。需要确保在正确的条件编译块内进行设置,避免被其他宏覆盖。 用户还遇到了`f_rmdir`未定义的问题,这可能是因为即使启用了`FF_USE_DIR`,某些版本的FatFs或者特定配置下函数名称可能不同。例如,旧版本可能使用`f_unlink`来删除目录。需要确认用户使用的FatFs版本,并根据引用[1]中的配置,检查函数名称是否正确。 此外,引用[2]提到了文件描述符的管理,虽然与目录删除无直接关系,但可能需要确保文件系统正确挂载和路径格式正确。例如,路径前缀如"0:/"是否正确,以及目录是否为空。如果目录非空,删除会失败,返回`FR_DENIED`错误码,这时候需要递归删除子目录和文件。 最后,用户可能需要参考引用[3]中的资源,获取更多关于鸿蒙系统下FatFs的配置和使用方法,确保所有配置步骤正确无误。 总结解决方案步骤:1. 在`ffconf.h`中启用`FF_USE_DIR`;2. 检查相关配置如`FF_FS_READONLY`;3. 确认函数名称和版本兼容性;4. 确保路径和目录状态正确;5. 必要时递归删除目录内容。</think>### 系统级解决方案:`FF_USE_DIR`未定义导致`f_rmdir`不可用问题 --- #### **一、问题定位** 1. **功能开关未启用** FatFs目录操作功能(包括`f_mkdir`、`f_opendir`、`f_rmdir`)依赖`FF_USE_DIR`宏定义,若未显式定义则默认关闭[^1]。 2. **配置覆盖风险** OpenHarmony LiteOS-M的`ffconf.h`可能通过条件编译(如`#ifdef __LITEOS_M__`)覆盖默认配置[^1]。 --- #### **、具体修复步骤** ##### **步骤1:手动定义`FF_USE_DIR`** 在`openharmony/third_party/FatFs/source/ffconf.h`中**显式添加**以下配置(建议放在文件头部或功能开关集中区域): ```c #define FF_USE_DIR 1 // 启用目录操作功能 ``` ![配置位置示意图](https://via.placeholder.com/600x200?text=Add+FF_USE_DIR+in+ffconf.h) ##### **步骤2:验证关联配置** 确保以下关键配置与目录操作兼容: ```c #define FF_FS_READONLY 0 // 禁用只读模式(删除目录需要写权限) #define FF_USE_LFN 0 // 若启用长文件名需额外内存(根据实际需求) #define FF_VOLUMES 4 // LiteOS-M默认支持4个卷(引用[1]配置) ``` ##### **步骤3:检查条件编译干扰** 在LiteOS-M环境下,需确保宏定义不会被其他条件编译分支覆盖: ```c #ifndef __LITEOS_M__ // 非LiteOS-M环境的配置(可能被忽略) #else // LiteOS-M专用配置(确保在此分支内定义FF_USE_DIR) #define FF_USE_DIR 1 // 明确在此处定义 #endif ``` ##### **步骤4:验证函数可见性** 确认`f_rmdir`函数在代码中可访问: ```c #include <ff.h> // 必须包含FatFs核心头文件 ``` --- #### **三、代码适配与验证** ##### 1. **目录删除示例** ```c void test_rmdir(void) { FRESULT res; res = f_mount(&fs, "0:", 1); // 挂载卷(假设已初始化) if (res != FR_OK) { printf("Mount error: %d\n", res); return; } res = f_rmdir("0:/test_dir"); // 删除根目录下的test_dir if (res == FR_OK) { printf("Directory deleted\n"); } else { printf("Error code: %d\n", res); // 根据错误码排查(如FR_NO_PATH) } } ``` ##### 2. **常见错误处理** | 错误码 | 原因 | 解决方案 | |------------------|-----------------------|------------------------------| | `FR_INVALID_DRIVE` | 卷编号无效 | 检查路径前缀(如`"0:/"`) | | `FR_NOT_ENABLED` | `FF_USE_DIR`未启用 | 重新检查`ffconf.h`配置 | | `FR_DENIED` | 目录非空或权限不足 | 递归删除子项或检查文件属性 | --- #### **四、深度兼容性验证** 1. **FatFs版本回溯** - R0.12及更早版本可能使用`f_unlink`删除空目录(需验证函数行为)。 - 新版FatFs(R0.14+)严格依赖`FF_USE_DIR`开关。 2. **LiteOS-M文件系统锁** 若在多线程环境中调用`f_rmdir`,需通过`DFS`组件(引用[2])添加互斥锁: ```c int fd = fd_new(); // 申请文件描述符(引用[2]) if (fd >= 0) { // 执行目录删除操作 fd_put(fd_get(fd)); // 释放资源 } ``` --- #### **五、扩展配置建议** - **动态内存分配**:若启用`FF_USE_LFN`(长文件名),需通过`FF_MAX_LFN`调整堆大小。 - **扇区对齐**:确保`FF_MIN_SS`和`FF_MAX_SS`与实际存储介质匹配(引用[1]中`FS_MAX_SS`配置)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值