FatFs
FatFs是专为小型嵌入式设备开发的一个兼容微软fat的文件系统,采用ANSI C编写,采用抽象的硬件I/O层以及提供持续的维护,因此具有良好的硬件无关性以及可移植性。
- FatFs官方网址 http://elm-chan.org/fsw/ff/00index_e.html
RT-Thread将FatFs整合为一个RT-Thread组件,并置于DFS层之下。因此可以非常方便的在RT-Thread中使用FatFs。
FatFs 相关宏
在RT-Thread中使用Elm FatFs,需要在rtconfig.h打开此宏。
- /* DFS: ELM FATFS options */
- #defineRT_USING_DFS_ELMFAT
FAT文件系统扇区大小
- /* Maximum sector size to be handled. */
- #defineRT_DFS_ELM_MAX_SECTOR_SIZE512
这个洪用于指定FatFs的内部扇区大小,注意,这个宏需要大于等于实际硬件驱动的扇区大小。例如,某spi flash芯片扇区为4096字节,则上述宏需要修改为4096,否则FatFs从驱动读入数据时就会发生数组越界而导致系统崩溃(新版本在系统执行时给出警告信息)。
- /* Number of volumes (logical drives) to be used. */
- #defineRT_DFS_ELM_DRIVES2
FatFs支持多分区,默认支持一个分区,如果想要在多个设备上挂载FatFs,可以修改上述宏定义。
- /* Reentrancy (thread safe) of the FatFs module. */
- #defineRT_DFS_ELM_REENTRANT
Elm FatFs充分考虑了多线程安全读写安全的情况,当在多线程中读写FafFs时,为了避免重入带来的问题,需要打开上述宏。如果系统仅有一个线程操作文件系统,不会出现重入问题,则可以关闭上述宏以节省资源。
- #define RT_DFS_ELM_USE_LFN 3
- #define RT_DFS_ELM_MAX_LFN 255
- #define RT_DFS_ELM_CODE_PAGE 437
默认情况下,FatFs使用8.3方式的文件命名规则,这种方式具有如下缺点:
- 文件名(不含后缀)最长不超过8个字符,后缀最长不超过3个字符。文件名和后缀超过限制后将会被截断。
文件名不支持大小写(显示为大写)
如果需要支持长文件名,则需要打开上述宏。注意,Elm FatFs支持三种方式的长文件名1 采用静态缓冲区支持长文件名,多线程操作文件名时将会带来重入问题。
- 2 采用栈内临时缓冲区支持长文件名。对栈空间需求较大。
- 3 使用heap(malloc申请)缓冲区存放长文件名。最安全。
在RT-Thread中,如果对需要使用长文件名,建议使用长文件名模式3,即按照如下方式定义
- #define RT_DFS_ELM_USE_LFN 3
当打开长文件名支持时,FatFs内部会使用Unicode编码文件名,而完整Unicode字库较大,不利于嵌入式设备上使用,FatFs可以单独配置文件名编码,在rtconfig.h指定宏RT_DFS_ELM_CODE_PAGE
的值可以配置FatFs的编码。如果需要存储中文文件名,可以使用936编码(GBK编码),如下所示
- #define RT_DFS_ELM_CODE_PAGE 936
当打开长文件名宏RT_DFS_ELM_USE_LFN
时,RT-Thread/FatFs默认使用936编码。936编码需要一个大约180KB的字库。如果仅使用英文字符作为文件,则可以设置宏为437(美国英语),这样就可以节省这180KB的Flash空间。
FatFs所支持的文件编码如下所示。
- /* 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.
- /
- / 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)