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

 
 
 
Reply to this topicStart new topic
> FAT как дописывать файлы?
*rust*
сообщение Mar 14 2011, 11:46
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335



Добрый день, Господа!

Пишу на АРМ под Си. Работаю с SD-картой и файловой системой FAT. Задача подразумевает запись файлов большого размера 1ГБ и более до 2ГБ. Существует проблема, что если при записи файла произойдет сбой (выключение питания и т.д) до закрытия файла, все данные потеряются. Каким-нибудь образом можно решить задачу, например закрыть файл после очередного цикла записи, а потом заново открыть и дописать? Нашел функцию f_sync, которая как бы подобна функции f_close, но при этом файл можно дозаписывать, но f_sync работает ужасно медленно. В цикле без f_sync запись происходит на скорости 20Mbit/s, а с ней скорость падает на порядок. Как можно решить эту проблему?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Mar 14 2011, 12:15
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Судя по всему, речь идет о FatFS от Chan'а?
f_sync надо использовать разумно. Так же стоит писать большими блоками. Если писать побайтно и после каждой записи делать sync естественно будут тормоза.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
*rust*
сообщение Mar 14 2011, 13:01
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335



Судя по всему, речь идет о FatFS от Chan'а?
Да, Вы правы.

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

Как это разумно? Я пишу по 32кБ, далее вызываю функцию f_sync, и так по кругу пока не закончатся данные.
Большие блоки это сколько?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Mar 14 2011, 14:36
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Большие блоки, это больше сектора. sm.gif Судя, по всему, у Вас это выполняется. Блоки именно 32 К или примерно? Я к тому, чтобы попробовать писать по смещениям кратным 512, тогда ФС не придется подгружать блок с носителя, потом изменять и писать обратно.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
akimych
сообщение Mar 14 2011, 17:23
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-01-11
Пользователь №: 62 073



Имхо, с фат-ом проблема состоит в том, что саму таблицу размещения надо постоянно сохранять. Возможно в этом и причина сильного падения скорости.
Go to the top of the page
 
+Quote Post
*rust*
сообщение Mar 14 2011, 19:41
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335



Блоки точно по 32КБ.


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

Для akimych, можно поподробнее?
Go to the top of the page
 
+Quote Post
yashok
сообщение Mar 15 2011, 06:04
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



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

При записи файла информация на диск записывается порциями равными размеру сектора (параметр _MAX_SS). Может быть несколько буферов в зависимости от настроек (см _FS_MINIMIZE). Один для внутренних структур ФС и по одному на каждый открытый файл. Это в лучшем случаи, если стоит минимизация ФС, то один буфер на все нужды. Так вот если для каждого файла есть свой буфер его размер равен размеру сектора и как только этот буфер заполняется он переписывается на носитель. Также меняется сама таблица фат.
Таким образом f_sync только перезаписывает таблицу каталога.

Сообщение отредактировал yashok - Mar 15 2011, 06:05
Go to the top of the page
 
+Quote Post
*rust*
сообщение Mar 15 2011, 07:44
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335



yashok, спасибо, достаточно подробно.Так что же следует делать для увеличения скорости при использовании f_sync?
Go to the top of the page
 
+Quote Post
yashok
сообщение Mar 15 2011, 07:52
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



Да вроде не должно из-за f_sync так скорость падать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 15 2011, 13:20
Сообщение #10


Гуру
******

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



Цитата(*rust* @ Mar 15 2011, 10:44) *
Так что же следует делать для увеличения скорости при использовании f_sync?

Вызывать ее как можно реже. Если данные идут сплошным потоком, то не надо вызывать ее после каждого 32кБ блока, делайте это один раз на N блоков + по таймауту.
Любая "out of order" запись SD-карты роняет производительность в разы.
Go to the top of the page
 
+Quote Post
*rust*
сообщение Mar 15 2011, 14:45
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335



Понятно, ладно всем спасибо!
Go to the top of the page
 
+Quote Post
akimych
сообщение Mar 15 2011, 18:38
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-01-11
Пользователь №: 62 073



Какой смысл f_sync сохранять только каталог и не сохранять таблицу размещения, кто тогда таблицу размещения сохраняет?
Go to the top of the page
 
+Quote Post
zksystem
сообщение Mar 16 2011, 04:32
Сообщение #13


embedder
***

Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911



В таких случаях я делал так: создавал сразу большой файл, например 2Гб, в этом случае таблицу FAT уже писать не надо, ну и в энергонезависимой памяти хранил позицию записи. Работало безотказно.


--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
Go to the top of the page
 
+Quote Post
yashok
сообщение Mar 16 2011, 04:43
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



Цитата
Какой смысл f_sync сохранять только каталог и не сохранять таблицу размещения, кто тогда таблицу размещения сохраняет?

Она сохраняется когда идет непосредственная запись файла. Когда требуется при записи переходить в новый кластер, ищется свободный кластер и в цепочку кластеров для данного файла в таблице FAT добавляется номер этого кластер.
Go to the top of the page
 
+Quote Post

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

 


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


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