Перейти к содержанию
    

Что может замедлять работу 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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

 

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

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

Изменено пользователем sambotey

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве увеличение количества файлов влечет за собой увеличение времени создания файла и записи в него?

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

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

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

 

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

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

Изменено пользователем sambotey

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Изменено пользователем sambotey

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...