Полная версия этой страницы:
FAT как дописывать файлы?
*rust*
Mar 14 2011, 11:46
Добрый день, Господа!
Пишу на АРМ под Си. Работаю с SD-картой и файловой системой FAT. Задача подразумевает запись файлов большого размера 1ГБ и более до 2ГБ. Существует проблема, что если при записи файла произойдет сбой (выключение питания и т.д) до закрытия файла, все данные потеряются. Каким-нибудь образом можно решить задачу, например закрыть файл после очередного цикла записи, а потом заново открыть и дописать? Нашел функцию f_sync, которая как бы подобна функции f_close, но при этом файл можно дозаписывать, но f_sync работает ужасно медленно. В цикле без f_sync запись происходит на скорости 20Mbit/s, а с ней скорость падает на порядок. Как можно решить эту проблему?
Dron_Gus
Mar 14 2011, 12:15
Судя по всему, речь идет о FatFS от Chan'а?
f_sync надо использовать разумно. Так же стоит писать большими блоками. Если писать побайтно и после каждой записи делать sync естественно будут тормоза.
*rust*
Mar 14 2011, 13:01
Судя по всему, речь идет о FatFS от Chan'а?
Да, Вы правы.
f_sync надо использовать разумно. Так же стоит писать большими блоками. Если писать побайтно и после каждой записи делать sync естественно будут тормоза.
Как это разумно? Я пишу по 32кБ, далее вызываю функцию f_sync, и так по кругу пока не закончатся данные.
Большие блоки это сколько?
Dron_Gus
Mar 14 2011, 14:36
Большие блоки, это больше сектора.

Судя, по всему, у Вас это выполняется. Блоки именно 32 К или примерно? Я к тому, чтобы попробовать писать по смещениям кратным 512, тогда ФС не придется подгружать блок с носителя, потом изменять и писать обратно.
akimych
Mar 14 2011, 17:23
Имхо, с фат-ом проблема состоит в том, что саму таблицу размещения надо постоянно сохранять. Возможно в этом и причина сильного падения скорости.
*rust*
Mar 14 2011, 19:41
Блоки точно по 32КБ.
Цитата
Имхо, с фат-ом проблема состоит в том, что саму таблицу размещения надо постоянно сохранять. Возможно в этом и причина сильного падения скорости.
Для akimych, можно поподробнее?
yashok
Mar 15 2011, 06:04
При использовании f_sync перезаписывается таблица каталога (сохраняется новый размер и дата изменения файла). Так же если стоит FAT32 при f_sync может еще переписывается загрузочная запись раздела, если она была изменена.
При записи файла информация на диск записывается порциями равными размеру сектора (параметр _MAX_SS). Может быть несколько буферов в зависимости от настроек (см _FS_MINIMIZE). Один для внутренних структур ФС и по одному на каждый открытый файл. Это в лучшем случаи, если стоит минимизация ФС, то один буфер на все нужды. Так вот если для каждого файла есть свой буфер его размер равен размеру сектора и как только этот буфер заполняется он переписывается на носитель. Также меняется сама таблица фат.
Таким образом f_sync только перезаписывает таблицу каталога.
*rust*
Mar 15 2011, 07:44
yashok, спасибо, достаточно подробно.Так что же следует делать для увеличения скорости при использовании f_sync?
yashok
Mar 15 2011, 07:52
Да вроде не должно из-за f_sync так скорость падать.
aaarrr
Mar 15 2011, 13:20
Цитата(*rust* @ Mar 15 2011, 10:44)

Так что же следует делать для увеличения скорости при использовании f_sync?
Вызывать ее как можно реже. Если данные идут сплошным потоком, то не надо вызывать ее после каждого 32кБ блока, делайте это один раз на N блоков + по таймауту.
Любая "out of order" запись SD-карты роняет производительность в разы.
*rust*
Mar 15 2011, 14:45
Понятно, ладно всем спасибо!
akimych
Mar 15 2011, 18:38
Какой смысл f_sync сохранять только каталог и не сохранять таблицу размещения, кто тогда таблицу размещения сохраняет?
zksystem
Mar 16 2011, 04:32
В таких случаях я делал так: создавал сразу большой файл, например 2Гб, в этом случае таблицу FAT уже писать не надо, ну и в энергонезависимой памяти хранил позицию записи. Работало безотказно.
yashok
Mar 16 2011, 04:43
Цитата
Какой смысл f_sync сохранять только каталог и не сохранять таблицу размещения, кто тогда таблицу размещения сохраняет?
Она сохраняется когда идет непосредственная запись файла. Когда требуется при записи переходить в новый кластер, ищется свободный кластер и в цепочку кластеров для данного файла в таблице FAT добавляется номер этого кластер.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.