Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Что может замедлять работу FatFS?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sambotey
LPC1768 + SDHC.
Для работы с SD-карточкой использую FatFS. Программа должна достаточно быстро создавать на карточке файлы и записывать в них какие-то данные. Величина каждого файла 15-20Кb. Скорость создания файлов - 2-3 файла в секунду. Однако со временем скорость, с которой создаются и записываются файлы, падает. Общая структура программы такова:

Код
while (f_mount(0, &FATFS_Obj) != FR_OK);
while (f_mkdir (str) != FR_OK);
while (1)
{
  //время выполнения этого цикла падает от 1/3секунды до 3 секунд
  while (f_open(&fil_obj, str1, FA_CREATE_ALWAYS|FA_WRITE) != FR_OK);
  f_write(&fil_obj, &ibf, data_length, &ui);
  while (f_close(&fil_obj) != FR_OK);
};


Кто-нибудь сталкивался с подобной проблемой?

Сейчас шлифую свои процедуры из интерфейса с FatFS(файл diskio.c), но пока безрезультатно. Думаю, что пора переходить к функциям самой FatFS(файл ff.c).
sergeeff
Да сама карточка и тормозит. Если вы померяете время записи файла, то 90-95% занимают операции с карточкой.

А со временем появяются дополнительные накладные расходы типа что-то стереть в директории, сами директории растут и прочее.
Lotor
Цитата(sambotey @ Sep 29 2011, 14:43) *
Думаю, что пора переходить к функциям самой FatFS(файл ff.c).

Ошибочное решение. FatFS у меня выдает до 5 МБайта в секунду для SDHC (с буферизацией конечно).
Библиотечные функции трогать не стоит.
sambotey
Цитата(Lotor @ Sep 29 2011, 14:41) *
FatFS у меня выдает до 5 МБайта в секунду для SDHC (с буферизацией конечно).


Что значит "с буферизацией"?


Цитата(sergeeff @ Sep 29 2011, 14:08)
А со временем появяются дополнительные накладные расходы типа что-то стереть в директории, сами директории растут и прочее.

У меня лишь быстро увеличивается количество файлов. А разве увеличение количества файлов влечет за собой увеличение времени создания файла и записи в него? Я тоже предполагал, что виной всему "накладные расходы". Но как с этим бороться? Ведь после закрытия файла мы возвращаемся в исходное положение - освобождается дескриптор файла и все связанные с ним структуры.
Lotor
Цитата(sambotey @ Sep 29 2011, 16:26) *
Что значит "с буферизацией"?

То и значит - формирую буферы по 6 МБайт в SDRAM и затем записываю их. А иначе быстрых скоростей с SDHC и не видать - по спецификации карта может давать задержки до 250 мс, при чем независимо от класса.
skripach
Если есть возможность объединить много мелких файлов в один, увеличить буфер записи.
aaarrr
Цитата(sambotey @ Sep 29 2011, 16:26) *
А разве увеличение количества файлов влечет за собой увеличение времени создания файла и записи в него?

Неизбежно влечет, ведь для создания нового файла нужно полностью перелопатить текущую директорию, чтобы:
а) убедиться, что файла с таким же именем не существует (не знаю, делает ли FatFS, и можно ли отключить)
б) найти/добавить свободное место в директории

Цитата(sambotey @ Sep 29 2011, 16:26) *
Но как с этим бороться?

Кэшировать диск.
Grape

- использовать FAT32. у Чена сделан быстрый поиск свободного места.

- использовать подкаталоги, в каждом, к примеру, max 256 файлов

sambotey
Всем громадное спасибо за множество дельных советов.


Цитата(aaarrr @ Sep 29 2011, 16:02) *
Кэшировать диск.

А это как делается?

Цитата(Lotor @ Sep 29 2011, 15:48) *
То и значит - формирую буферы по 6 МБайт в SDRAM и затем записываю их.

У меня LPC1768, так что могу использовать лишь SRAM и буфер больше 30Kb создать не получается. Сейчас пробую DMA.
aaarrr
Цитата(sambotey @ Sep 30 2011, 10:27) *
А это как делается?

Например, так.
Но если памяти только 30кБайт, то смысла нет практически, к сожалению sad.gif

Цитата(sambotey @ Sep 30 2011, 10:27) *
Что-то я не нашел в спецификации замечания по поводу задержки до 250мс

Оно там есть точно. Просто поищите "ms".
sergeeff
Цитата(sambotey @ Sep 30 2011, 09:27) *
Всем громадное спасибо за множество дельных советов.


Вы, надеюсь, реализовали мультисекторную запись/чтение?
sambotey
Цитата(sergeeff @ Sep 30 2011, 23:45) *
Вы, надеюсь, реализовали мультисекторную запись/чтение?

Да, я информацию всего файла сохраняю в буфер, который уже записываю на карточку именно с помощью мультисекторной записи. Однако проблема с постепенным уменьшением скорости записи осталась.
Здесь мне помог совет
Цитата(Grape @ Sep 29 2011, 17:18) *
- использовать подкаталоги, в каждом, к примеру, max 256 файлов

Сейчас карточка непрерывно пишет со скоростью 2fps. Уже терпимо, но хотелось бы побыстрее. Сейчас пытаюсь упомянутый буфер писать по DMA.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.