Jump to content

    

Что может замедлять работу FatFS?

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).

Share this post


Link to post
Share on other sites

Да сама карточка и тормозит. Если вы померяете время записи файла, то 90-95% занимают операции с карточкой.

 

А со временем появяются дополнительные накладные расходы типа что-то стереть в директории, сами директории растут и прочее.

Share this post


Link to post
Share on other sites
Думаю, что пора переходить к функциям самой FatFS(файл ff.c).

Ошибочное решение. FatFS у меня выдает до 5 МБайта в секунду для SDHC (с буферизацией конечно).

Библиотечные функции трогать не стоит.

 

Share this post


Link to post
Share on other sites
FatFS у меня выдает до 5 МБайта в секунду для SDHC (с буферизацией конечно).

 

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

 

 

А со временем появяются дополнительные накладные расходы типа что-то стереть в директории, сами директории растут и прочее.

У меня лишь быстро увеличивается количество файлов. А разве увеличение количества файлов влечет за собой увеличение времени создания файла и записи в него? Я тоже предполагал, что виной всему "накладные расходы". Но как с этим бороться? Ведь после закрытия файла мы возвращаемся в исходное положение - освобождается дескриптор файла и все связанные с ним структуры.

Edited by sambotey

Share this post


Link to post
Share on other sites
Что значит "с буферизацией"?

То и значит - формирую буферы по 6 МБайт в SDRAM и затем записываю их. А иначе быстрых скоростей с SDHC и не видать - по спецификации карта может давать задержки до 250 мс, при чем независимо от класса.

 

Share this post


Link to post
Share on other sites

Если есть возможность объединить много мелких файлов в один, увеличить буфер записи.

Share this post


Link to post
Share on other sites
А разве увеличение количества файлов влечет за собой увеличение времени создания файла и записи в него?

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

а) убедиться, что файла с таким же именем не существует (не знаю, делает ли FatFS, и можно ли отключить)

б) найти/добавить свободное место в директории

 

Но как с этим бороться?

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

Share this post


Link to post
Share on other sites

 

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

 

 

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

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

 

То и значит - формирую буферы по 6 МБайт в SDRAM и затем записываю их.

У меня LPC1768, так что могу использовать лишь SRAM и буфер больше 30Kb создать не получается. Сейчас пробую DMA.

Edited by sambotey

Share this post


Link to post
Share on other sites
А это как делается?

Например, так.

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

 

Что-то я не нашел в спецификации замечания по поводу задержки до 250мс

Оно там есть точно. Просто поищите "ms".

Share this post


Link to post
Share on other sites
Всем громадное спасибо за множество дельных советов.

 

Вы, надеюсь, реализовали мультисекторную запись/чтение?

 

Share this post


Link to post
Share on other sites
Вы, надеюсь, реализовали мультисекторную запись/чтение?

Да, я информацию всего файла сохраняю в буфер, который уже записываю на карточку именно с помощью мультисекторной записи. Однако проблема с постепенным уменьшением скорости записи осталась.

Здесь мне помог совет

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

Сейчас карточка непрерывно пишет со скоростью 2fps. Уже терпимо, но хотелось бы побыстрее. Сейчас пытаюсь упомянутый буфер писать по DMA.

Edited by sambotey

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this