Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FAT как дописывать файлы?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
*rust*
Добрый день, Господа!

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

f_sync надо использовать разумно. Так же стоит писать большими блоками. Если писать побайтно и после каждой записи делать sync естественно будут тормоза.

Как это разумно? Я пишу по 32кБ, далее вызываю функцию f_sync, и так по кругу пока не закончатся данные.
Большие блоки это сколько?
Dron_Gus
Большие блоки, это больше сектора. sm.gif Судя, по всему, у Вас это выполняется. Блоки именно 32 К или примерно? Я к тому, чтобы попробовать писать по смещениям кратным 512, тогда ФС не придется подгружать блок с носителя, потом изменять и писать обратно.
akimych
Имхо, с фат-ом проблема состоит в том, что саму таблицу размещения надо постоянно сохранять. Возможно в этом и причина сильного падения скорости.
*rust*
Блоки точно по 32КБ.


Цитата
Имхо, с фат-ом проблема состоит в том, что саму таблицу размещения надо постоянно сохранять. Возможно в этом и причина сильного падения скорости.

Для akimych, можно поподробнее?
yashok
При использовании f_sync перезаписывается таблица каталога (сохраняется новый размер и дата изменения файла). Так же если стоит FAT32 при f_sync может еще переписывается загрузочная запись раздела, если она была изменена.

При записи файла информация на диск записывается порциями равными размеру сектора (параметр _MAX_SS). Может быть несколько буферов в зависимости от настроек (см _FS_MINIMIZE). Один для внутренних структур ФС и по одному на каждый открытый файл. Это в лучшем случаи, если стоит минимизация ФС, то один буфер на все нужды. Так вот если для каждого файла есть свой буфер его размер равен размеру сектора и как только этот буфер заполняется он переписывается на носитель. Также меняется сама таблица фат.
Таким образом f_sync только перезаписывает таблицу каталога.
*rust*
yashok, спасибо, достаточно подробно.Так что же следует делать для увеличения скорости при использовании f_sync?
yashok
Да вроде не должно из-за f_sync так скорость падать.
aaarrr
Цитата(*rust* @ Mar 15 2011, 10:44) *
Так что же следует делать для увеличения скорости при использовании f_sync?

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

Она сохраняется когда идет непосредственная запись файла. Когда требуется при записи переходить в новый кластер, ищется свободный кластер и в цепочку кластеров для данного файла в таблице FAT добавляется номер этого кластер.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.