|
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? Вы меня наверное с кем-то путаете?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 6 2010, 10:24
|

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

|
Цитата(AHTOXA @ Jul 6 2010, 13:11)  Вы меня наверное с кем-то путаете? Показалось просто. Извините Прогнал сортировщик на файлах в другой папке, общим количеством в 500. Первый файл - 129 секторов каталога, похоже на предыдущий скан. Зато вот последний: CODE 00004000 00004001 00004002 00004003 00004004 00004005 00004006 00004007 00004008 00004009 0000400a 0000400b 0000400c 0000400d 0000400e 0000400f 00004010 00004011 00004012 00004013 00004014 00004015 00004016 00004017 00004018 00004019 0000401a 0000401b 0000401c 0000401d 0000401e 0000401f 00004020 00004021 00004022 00004023 00004024 00004025 00004026 00004027 00004028 00004029 0000402a 0000402b 0000402c 0000402d 0000402e 0000402f 00004030 00004031 00004032 00004033 00004034 00004035 00004036 00004037 00004038 00004039 0000403a 0000403b 0000403c 0000403d 0000403e 0000403f 0000386c 00004040 00004041 00004042 00004043 00004044 00004045 00004046 00004047 00004048 00004049 0000404a 0000404b 0000404c 0000404d 0000404e 0000404f 00004050 00004051 00004052 00004053 00004054 00004055 00004056 00004057 00004058 00004059 0000405a 0000405b 0000405c 0000405d 0000405e 0000405f 00004060 00004061 00004062 00004063 00004064 00004065 00004066 00004067 00004068 00004069 0000406a 0000406b 0000406c 0000406d 0000406e 0000406f 00004070 00004071 00004072 00004073 00004074 00004075 00004076 00004077 00004078 00004079 0000407a 0000407b 0000407c 0000407d 0000407e 00612980 00612981 00612982 00612983 00612984 00612985 00612986 00612987 00612988 00612989 0061298a 0061298b 0061298c 0061298d 0061298e 0061298f 00612990 00612991 00612992 00612993 00612994 00612995 00612996 00612997 00612998 00612999 0061299a 0061299b 0061299c 0061299d 0061299e 0061299f 006129a0 006129a1 006129a2 006129a3 006129a4 006129a5 006129a6 006129a7 006129a8 006129a9 006129aa 006129ab 006129ac 006129ad 006129ae 006129af 006129b0 006129b1 006129b2 006129b3 006129b4 006129b5 006129b6 006129b7 006129b8 006129b9 006129ba 006129bb 006129bc 006129bd 006129be 006129bf 00003b73 006129c0 006129c1 006129c2 006129c3 006129c4 006129c5 006129c6 006129c7 006129c8 006129c9 006129ca 006129cb 006129cc 006129cd 006129ce 006129cf 006129d0 006129d1 006129d2 006129d3 006129d4 006129d5 006129d6 006129d7 006129d8 006129d9 006129da 006129db 006129dc 006129dd 006129de 006129df 006129e0 006129e1 006129e2 006129e3 006129e4 006129e5 006129e6 006129e7 006129e8 006129e9 006129ea 006129eb 006129ec 006129ed 006129ee 006129ef 006129f0 006129f1 006129f2 006129f3 006129f4 006129f5 006129f6 006129f7 006129f8 006129f9 006129fa 006129fb 006129fc 006129fd 006129fe
это вообще жесть - 256 секторов, четыре полных кластера! Попробую сделать простой кеш в виде считывания при любом запросе сразу 8 секторов. Отводить 20 килобайт не вижу смысла - огромное количество запрашиваемых секторов в них разместить никак не получится. Отведу память чисто под эти 8 секторов, и всё. Посмотрим, какие будут результаты...
|
|
|
|
Сообщений в этой теме
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 Цитата(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
|
|
|