|
FatFs на STM32 - кеширование FAT32?, чтобы ускорить f_open() |
|
|
|
Jul 5 2010, 09:55
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Всем доброго времени суток.
На девайсе под управлением STM32 есть процедура, которая создаёт сортированный по алфавиту список файлов FAT32 диска на флеш карточке. Используется FatFs версии 0.08. Количество файлов в списке может быть максимум 500.
На днях обратил внимание, что львиная доля времени (около 90%), затрачиваемого на сортировку, потребляется функцией файловой системы f_open(). Поковырявшись в её дебрях, обнаружил, что в свою очередь это вызвано подфункцией move_window(), которая подгружает по одному сектору из, вероятно, каталога фат.
То есть чтобы открыть файл, файловая система продирается через структуру фат до того, как найдёт запись с информацией по нужному файлу. Считывание ведётся по одному сектору. И так для каждого файла.
Вот и подумалось тут, а почему бы не ввести кеширование для секторов, запрашиваемых функцией move_window()?
Главный вопрос здесь - хватит ли для этого 10-20 килобайт оперативки? К сожалению, приходится довольствоваться только внутренним ОЗУ контроллера.
Наверное, для FAT32 с большим количеством файлов кеширование 20 килобайт (40 секторов) не будет эффективным?
|
|
|
|
|
 |
Ответов
|
Jul 5 2010, 19:26
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(sonycman @ Jul 5 2010, 19:36)  Вероятно, move_window() читает/пишет только такие сектора, поэтому попробую привязать кеш именно к ней... Нет, move_window() универсальная, вызывается во всех случаях. Цитата(sonycman @ Jul 6 2010, 00:49)  Логичнее было бы закешировать только корневой каталог и FAT (при интенсивной работе с большим кол-вом файлов). А может и нет  Логичнее сделать кеширование как написал aaarrr, и тогда в кеше автоматически будут храниться наиболее востребованные данные. Чаще идёт обращение к FAT - значит в кеше FAT. К данным (многократный парсинг одного файла) - в кеше данные. И не надо будет гадать ничего
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 5 2010, 19:43
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(AHTOXA @ Jul 5 2010, 23:26)  Нет, move_window() универсальная, вызывается во всех случаях. А во всех - это в каких? Я пока глубоко не вникал, но показалось, что эта функция с чтением/записью единственного сектора годится только для работы с каталогом. Цитата А может и нет  Логичнее сделать кеширование как написал aaarrr, и тогда в кеше автоматически будут храниться наиболее востребованные данные. Чаще идёт обращение к FAT - значит в кеше FAT. К данным (многократный парсинг одного файла) - в кеше данные. И не надо будет гадать ничего  Это смотря какие условия. К примеру - открыли мы файл (при этом кеш заполнился секторами корневого каталога), затем считали большой кусок этого файла. В кеше будет содержимое считанного файла, которое и без него читается быстро. Затем открываем другой файл - так как в кеше уже нет секторов каталога - снова идёт обращение к диску. Зачем мне это надо? Мне бы просто ускорить работу с каталогом
|
|
|
|
|
Jul 5 2010, 21:09
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(aaarrr @ Jul 6 2010, 00:21)  Увы, в условиях дефицита оперативки, придется так или иначе выкручиваться - добавлять в функцию чтения флаг запрета кэширования, например. Или встроить в FatFS отдельный кэш для каталогов и FAT. Просто прикрутить что-то снаружи не выйдет. Хотя даже с ограниченным объемом памяти приведенный мной вариант может несколько облегчить жизнь за счет наличия своего рода упреждающего чтения. Оптимальный способ для меня - использовать флаг разрешения кеширования. Тогда в исходники FatFs достаточно встроить пару строк (к примеру, в функцию f_open() или в move_window()), остальным займётся драйвер. Однако, это имеет смысл только в случае, когда все требуемые сектора каталога смогут поместиться в кеш. Иначе пользы будет ноль  Цитата(AHTOXA @ Jul 6 2010, 00:56)  Ну вообще во всех. Эта функция грузит сектор в единственный буфер объекта-файловой системы. Нужен сектор FAT - грузит его. Читаем данные - грузит их (и FAT конечно выгружен) А как же мультисекторные чтение/запись? Нет, конечно-же, не пугайте так  Эта функция используется только в конфигурации _FS_TINY. В остальных случаях идёт прямое обращение к disk_read() - к драйверу. Привыкли, наверное, к AVR? Цитата Если файл больше чем кэш, то да, придётся предпринять дополнительные шаги. Первый из возможных - кешировать только сектора из FAT. Да, именно это мне и требуется. Хотя, даже в случае наличия 20 килобайт памяти их для этого не хватает  Нужны "метры"!
|
|
|
|
|
Jul 6 2010, 09:11
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(sonycman @ Jul 6 2010, 03:09)  А как же мультисекторные чтение/запись? Нет, конечно-же, не пугайте так  Эта функция используется только в конфигурации _FS_TINY. В остальных случаях идёт прямое обращение к disk_read() - к драйверу. Да, действительно. Видимо я ковырял очень старую версию FatFs, где ещё не было мультисекторного чтения/записи. Или просто что-то перепутал Цитата Привыкли, наверное, к AVR? Вы меня наверное с кем-то путаете?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
sonycman FatFs на STM32 - кеширование FAT32? Jul 5 2010, 09:55 aaarrr Цитата(sonycman @ Jul 5 2010, 13:55) Наве... Jul 5 2010, 10:04 sonycman Цитата(aaarrr @ Jul 5 2010, 14:04) Ну поч... Jul 5 2010, 10:35  aaarrr Цитата(sonycman @ Jul 5 2010, 14:35) move... Jul 5 2010, 10:43   sonycman Цитата(aaarrr @ Jul 5 2010, 14:43) Читать... Jul 5 2010, 10:52    aaarrr Цитата(sonycman @ Jul 5 2010, 14:52) Коне... Jul 5 2010, 12:12 sonycman Спасибо!
Что-то вроде этого задумывал и я, тол... Jul 5 2010, 13:36 sonycman Хм, вот все же странно как то у Чена сделан подход... Jul 5 2010, 18:49    aaarrr Цитата(sonycman @ Jul 6 2010, 00:59) Одна... Jul 5 2010, 21:12     sonycman Цитата(aaarrr @ Jul 6 2010, 01:12) Конечн... Jul 5 2010, 21:35      aaarrr Цитата(sonycman @ Jul 6 2010, 01:35) В эт... Jul 5 2010, 21:51       sonycman Цитата(aaarrr @ Jul 6 2010, 01:51) Нет, э... Jul 5 2010, 22:01        aaarrr Цитата(sonycman @ Jul 6 2010, 02:01) А дл... Jul 5 2010, 22:15     sonycman Цитата(AHTOXA @ Jul 6 2010, 13:11) Вы мен... Jul 6 2010, 10:24      defunct Цитата(sonycman @ Jul 6 2010, 13:24) это ... Jul 12 2010, 20:13       aaarrr Цитата(defunct @ Jul 13 2010, 00:13) А чт... Jul 12 2010, 21:41        sonycman Цитата(aaarrr @ Jul 13 2010, 01:41) Подоб... Jul 12 2010, 21:47         aaarrr Цитата(sonycman @ Jul 13 2010, 01:47) Не ... Jul 12 2010, 22:52          sonycman Цитата(aaarrr @ Jul 13 2010, 02:52) А не ... Jul 13 2010, 00:19  AHTOXA Цитата(sonycman @ Jul 6 2010, 01:43) А во... Jul 5 2010, 20:56 sonycman Получил результаты своего отладочного логгера, кот... Jul 5 2010, 23:44 Ivan Kuznetzov извиняюсь за оффтоп, sonycman, как у Вас объявлена... Aug 22 2010, 20:20 sonycman Цитата(Ivan Kuznetzov @ Aug 23 2010, 00:2... Aug 23 2010, 01:41  Ivan Kuznetzov Цитата(sonycman @ Aug 23 2010, 07:41) Име... Aug 25 2010, 17:56 aaarrr Посмотрите в map-файле, что стоит перед data[], от... Aug 25 2010, 18:14
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|