Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2741
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

 

Файловая система FAT

710

22

#endif

 

23

if (fno.fattrib & AM_DIR) { /* Это каталог */

 

24

i = strlen(path);

 

25

sprintf(&path[i], "/%s", fname);

 

26

/* Рекурсивно сканировать каталог */

 

27

res = scan_files(path);

 

28

if (res != FR_OK) break;

 

29

path[i] = 0;

 

30

} else { /* Это файл */

 

31

trace_printf("%s/%s\n", path, fname);

 

32

}

 

33}

34f_closedir(&dir);

35}

36return res;

37}

25.1.3. Как сконфигурировать библиотеку FatFs

Библиотека FatFs является гибко настраиваемой. Набор параметров конфигурации (то есть конфигурационные макросы) позволяет уменьшить общий размер библиотеки и включать/отключать некоторые возможности на этапе компиляции.

Все параметры конфигурации автоматически экспортируются CubeMX в файл ffconf.h. А теперь разберем наиболее важные. Для более полного рассмотрения этого вопроса читателю следует обратиться к официальной документации10.

_FS_TINY: этот макрос может принимать значения 0 (по умолчанию) и 1. Эта опция

позволяет уменьшить потребление SRAM библиотекой FatFs. Если установлено значение 0, каждый экземпляр структуры FIL имеет собственный временный буфер, используемый во время чтения/записи файла. Вместо этого, когда установлено значение 1, используется глобальный пул, определенный в структуре FATFS. Это замедляет операции чтения/записи.

_FS_READONLY: этот макрос может принимать значения 0 (по умолчанию) и 1. Дан-

ный макрос пропускает компиляцию тех функций, которые используются для изменения файловой системы, удаляя такие API-функции, как f_write(), f_sync(),

f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree(), а также до-

полнительные функции записи.

_FS_MINIMIZE: этот макрос задает уровень минимизации библиотеки, который за-

ключается в перемещении некоторых API-функций. Если установлено значение 0, доступны все API. Если установлено значение 1, функции f_stat(),

f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(), f_truncate() и f_rename()

удаляются. Если установлено значение 2, функции f_opendir(), f_readdir() и f_closedir() удаляются в дополнение к тем процедурам, когда для _FS_MINIMIZE установлено значение 1. Если установлено значение 3, функция f_lseek() также удаляется.

_CODE_PAGE: этот параметр указывает кодовую страницу OEM, которая будет ис-

пользоваться в целевой системе. Неправильная установка кодовой страницы

10 http://elm-chan.org/fsw/ff/en/config.html

Файловая система FAT

711

может привести к ошибке при открытии файла. Для западных стран CP1252 (он же Latin1) является наиболее распространенной кодовой страницей, используе-

мой в ОС Windows.

_USE_LFN: этот параметр включает поддержку длинных имен файлов (Long File

Names, LFN). При включении режима LFN в проект необходимо добавить функции поддержки Unicode, содержащиеся в файле option/unicode.c. Более того, при включении поддержки LFN нам необходимо предоставить заранее выделенный буфер для хранения длинного имени файла. Это требование плохо задокументировано в библиотеке FatFs, и неопытные люди тратят много времени, пытаясь разобраться, как получить LFN-имена. Процедура scan_files(), которую мы видели ранее, четко показывает, как выполнять эту операцию. Буфер lfname статически размещается в стеке в строке 6. Затем указатель fno.lfname устанавливается так, чтобы указывать на буфер lfname в строке 13. Таким же образом размер буфера указывается в строке 14. Это позволяет библиотеке FatFs корректно получать LFN-имя файла или каталога. В противном случае буфер fno.fname будет содержать имя файла в формате 8.3.

_MAX_LFN: определяет максимальную длину LFN для обработки (от 12 до 255).

_LFN_UNICODE: этот параметр переключает кодировку символов в API. (0: ANSI/OEM

или 1: Unicode). Чтобы использовать строки в Unicode для имен путей, вы должны включить функцию LFN и установить для _LFN_UNICODE значение 1. Этот параметр также влияет на поведение функций строкового ввода-вывода. Обратите внимание, что для обеспечения прозрачного использования строк Unicode в библиотеке FatFs сама библиотека определяет тип данных TCHAR, который автоматически преобразуется в char, если поддержка Unicode отключена, или в uint16_t, если включена. Для получения дополнительной информации по этой теме обратитесь к документации FatFs11.

_VOLUMES: этот макрос устанавливает максимальное количество логических дис-

ков на каждый физический диск. По умолчанию для этого макроса установлено значение 1. Дополнительные сведения по этой теме см. в документации FatFs12.

_FS_REENTRANT: эта опция переключает реентерабельность (потокобезопасность) в

самой библиотеке FatFs. Доступ к файлам/каталогам на разных томах всегда реентерабельны и может работать одновременно вне зависимости от этого параметра. Функции управления томами (f_mount(), f_mkfs() и f_fdisk()) всегда не реентерабельны. Доступ к файлам/каталогам на одном томе нереентерабелен, если для макроса _FS_REENTRANT установлено значение 1. Чтобы включить эту функцию, пользователю также необходимо предоставить процедуры обработчиков синхро-

низации, ff_req_grant(), ff_rel_grant(), ff_del_syncobj() и ff_cre_syncobj(). Ин-

женеры ST реализовали эти процедуры так, что они используют семафоры FreeRTOS. Взгляните на файл option/syscall.c, чтобы узнать подробности.

_SYNC_t: когда для макроса _FS_REENTRANT установлено значение 1, необходимо

также задать этот макрос, который определяет «тип» структуры синхронизации. При использовании FreeRTOS вместе с библиотекой FatFs этому макросу присва-

ивается тип osSemaphoreId.

11http://elm-chan.org/fsw/ff/en/filename.html#uni

12http://elm-chan.org/fsw/ff/en/filename.html#vol