реклама на сайте
подробности

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


Любитель
*****

Группа: Свой
Сообщений: 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 секторов) не будет эффективным?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Jul 5 2010, 19:26
Сообщение #2


фанат дивана
******

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



Цитата(sonycman @ Jul 5 2010, 19:36) *
Вероятно, move_window() читает/пишет только такие сектора, поэтому попробую привязать кеш именно к ней...

Нет, move_window() универсальная, вызывается во всех случаях.
Цитата(sonycman @ Jul 6 2010, 00:49) *
Логичнее было бы закешировать только корневой каталог и FAT (при интенсивной работе с большим кол-вом файлов).

А может и нетsmile.gif Логичнее сделать кеширование как написал aaarrr, и тогда в кеше автоматически будут храниться наиболее востребованные данные. Чаще идёт обращение к FAT - значит в кеше FAT. К данным (многократный парсинг одного файла) - в кеше данные. И не надо будет гадать ничегоsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 5 2010, 19:43
Сообщение #3


Любитель
*****

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



Цитата(AHTOXA @ Jul 5 2010, 23:26) *
Нет, move_window() универсальная, вызывается во всех случаях.

А во всех - это в каких?
Я пока глубоко не вникал, но показалось, что эта функция с чтением/записью единственного сектора годится только для работы с каталогом.

Цитата
А может и нетsmile.gif Логичнее сделать кеширование как написал aaarrr, и тогда в кеше автоматически будут храниться наиболее востребованные данные. Чаще идёт обращение к FAT - значит в кеше FAT. К данным (многократный парсинг одного файла) - в кеше данные. И не надо будет гадать ничегоsmile.gif

Это смотря какие условия.
К примеру - открыли мы файл (при этом кеш заполнился секторами корневого каталога), затем считали большой кусок этого файла.
В кеше будет содержимое считанного файла, которое и без него читается быстро.
Затем открываем другой файл - так как в кеше уже нет секторов каталога - снова идёт обращение к диску.

Зачем мне это надо?

Мне бы просто ускорить работу с каталогом smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 5 2010, 20:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sonycman @ Jul 5 2010, 23:43) *
Мне бы просто ускорить работу с каталогом smile.gif

Увы, в условиях дефицита оперативки, придется так или иначе выкручиваться - добавлять в функцию чтения флаг запрета кэширования, например. Или встроить в FatFS отдельный кэш для каталогов и FAT. Просто прикрутить что-то снаружи не выйдет.
Хотя даже с ограниченным объемом памяти приведенный мной вариант может несколько облегчить жизнь за счет наличия своего рода упреждающего чтения.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 5 2010, 21:09
Сообщение #5


Любитель
*****

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



Цитата(aaarrr @ Jul 6 2010, 00:21) *
Увы, в условиях дефицита оперативки, придется так или иначе выкручиваться - добавлять в функцию чтения флаг запрета кэширования, например. Или встроить в FatFS отдельный кэш для каталогов и FAT. Просто прикрутить что-то снаружи не выйдет.
Хотя даже с ограниченным объемом памяти приведенный мной вариант может несколько облегчить жизнь за счет наличия своего рода упреждающего чтения.

Оптимальный способ для меня - использовать флаг разрешения кеширования.
Тогда в исходники FatFs достаточно встроить пару строк (к примеру, в функцию f_open() или в move_window()), остальным займётся драйвер.

Однако, это имеет смысл только в случае, когда все требуемые сектора каталога смогут поместиться в кеш.
Иначе пользы будет ноль sad.gif

Цитата(AHTOXA @ Jul 6 2010, 00:56) *
Ну вообще во всех. Эта функция грузит сектор в единственный буфер объекта-файловой системы. Нужен сектор FAT - грузит его. Читаем данные - грузит их (и FAT конечно выгружен)

А как же мультисекторные чтение/запись?

Нет, конечно-же, не пугайте так smile.gif
Эта функция используется только в конфигурации _FS_TINY.
В остальных случаях идёт прямое обращение к disk_read() - к драйверу.

Привыкли, наверное, к AVR?

Цитата
Если файл больше чем кэш, то да, придётся предпринять дополнительные шаги. Первый из возможных - кешировать только сектора из FAT.

Да, именно это мне и требуется.

Хотя, даже в случае наличия 20 килобайт памяти их для этого не хватает sad.gif
Нужны "метры"! biggrin.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 6 2010, 09:11
Сообщение #6


фанат дивана
******

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



Цитата(sonycman @ Jul 6 2010, 03:09) *
А как же мультисекторные чтение/запись?

Нет, конечно-же, не пугайте так smile.gif
Эта функция используется только в конфигурации _FS_TINY.
В остальных случаях идёт прямое обращение к disk_read() - к драйверу.
Да, действительно. Видимо я ковырял очень старую версию FatFs, где ещё не было мультисекторного чтения/записи. Или просто что-то перепуталsmile.gif
Цитата
Привыкли, наверное, к AVR?

Вы меня наверное с кем-то путаете?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 19:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01536 секунд с 7
ELECTRONIX ©2004-2016