FatFs

FatFs是专为小型嵌入式设备开发的一个兼容微软fat的文件系统,采用ANSI C编写,采用抽象的硬件I/O层以及提供持续的维护,因此具有良好的硬件无关性以及可移植性。

  1. 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打开此宏。

  1. /* DFS: ELM FATFS options */
  2. #defineRT_USING_DFS_ELMFAT

FAT文件系统扇区大小

  1. /* Maximum sector size to be handled. */
  2. #defineRT_DFS_ELM_MAX_SECTOR_SIZE512

这个洪用于指定FatFs的内部扇区大小,注意,这个宏需要大于等于实际硬件驱动的扇区大小。例如,某spi flash芯片扇区为4096字节,则上述宏需要修改为4096,否则FatFs从驱动读入数据时就会发生数组越界而导致系统崩溃(新版本在系统执行时给出警告信息)。

  1. /* Number of volumes (logical drives) to be used. */
  2. #defineRT_DFS_ELM_DRIVES2

FatFs支持多分区,默认支持一个分区,如果想要在多个设备上挂载FatFs,可以修改上述宏定义。

  1. /* Reentrancy (thread safe) of the FatFs module. */
  2. #defineRT_DFS_ELM_REENTRANT

Elm FatFs充分考虑了多线程安全读写安全的情况,当在多线程中读写FafFs时,为了避免重入带来的问题,需要打开上述宏。如果系统仅有一个线程操作文件系统,不会出现重入问题,则可以关闭上述宏以节省资源。

  1. #define RT_DFS_ELM_USE_LFN 3
  2. #define RT_DFS_ELM_MAX_LFN 255
  3. #define RT_DFS_ELM_CODE_PAGE 437

默认情况下,FatFs使用8.3方式的文件命名规则,这种方式具有如下缺点:

  • 文件名(不含后缀)最长不超过8个字符,后缀最长不超过3个字符。文件名和后缀超过限制后将会被截断。
  • 文件名不支持大小写(显示为大写)
    如果需要支持长文件名,则需要打开上述宏。注意,Elm FatFs支持三种方式的长文件名

  • 1 采用静态缓冲区支持长文件名,多线程操作文件名时将会带来重入问题。

  • 2 采用栈内临时缓冲区支持长文件名。对栈空间需求较大。
  • 3 使用heap(malloc申请)缓冲区存放长文件名。最安全。
    在RT-Thread中,如果对需要使用长文件名,建议使用长文件名模式3,即按照如下方式定义
  1. #define RT_DFS_ELM_USE_LFN 3

当打开长文件名支持时,FatFs内部会使用Unicode编码文件名,而完整Unicode字库较大,不利于嵌入式设备上使用,FatFs可以单独配置文件名编码,在rtconfig.h指定宏RT_DFS_ELM_CODE_PAGE的值可以配置FatFs的编码。如果需要存储中文文件名,可以使用936编码(GBK编码),如下所示

  1. #define RT_DFS_ELM_CODE_PAGE 936

当打开长文件名宏RT_DFS_ELM_USE_LFN时,RT-Thread/FatFs默认使用936编码。936编码需要一个大约180KB的字库。如果仅使用英文字符作为文件,则可以设置宏为437(美国英语),这样就可以节省这180KB的Flash空间。

FatFs所支持的文件编码如下所示。

  1. /* The _CODE_PAGE specifies the OEM code page to be used on the target system.
  2. / Incorrect setting of the code page can cause a file open failure.
  3. /
  4. / 932 - Japanese Shift-JIS (DBCS, OEM, Windows)
  5. / 936 - Simplified Chinese GBK (DBCS, OEM, Windows)
  6. / 949 - Korean (DBCS, OEM, Windows)
  7. / 950 - Traditional Chinese Big5 (DBCS, OEM, Windows)
  8. / 1250 - Central Europe (Windows)
  9. / 1251 - Cyrillic (Windows)
  10. / 1252 - Latin 1 (Windows)
  11. / 1253 - Greek (Windows)
  12. / 1254 - Turkish (Windows)
  13. / 1255 - Hebrew (Windows)
  14. / 1256 - Arabic (Windows)
  15. / 1257 - Baltic (Windows)
  16. / 1258 - Vietnam (OEM, Windows)
  17. / 437 - U.S. (OEM)
  18. / 720 - Arabic (OEM)
  19. / 737 - Greek (OEM)
  20. / 775 - Baltic (OEM)
  21. / 850 - Multilingual Latin 1 (OEM)
  22. / 858 - Multilingual Latin 1 + Euro (OEM)
  23. / 852 - Latin 2 (OEM)
  24. / 855 - Cyrillic (OEM)
  25. / 866 - Russian (OEM)
  26. / 857 - Turkish (OEM)
  27. / 862 - Hebrew (OEM)
  28. / 874 - Thai (OEM, Windows)