sambotey 0 29 сентября, 2011 Опубликовано 29 сентября, 2011 · Жалоба 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 1 29 сентября, 2011 Опубликовано 29 сентября, 2011 · Жалоба Да сама карточка и тормозит. Если вы померяете время записи файла, то 90-95% занимают операции с карточкой. А со временем появяются дополнительные накладные расходы типа что-то стереть в директории, сами директории растут и прочее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 29 сентября, 2011 Опубликовано 29 сентября, 2011 · Жалоба Думаю, что пора переходить к функциям самой FatFS(файл ff.c). Ошибочное решение. FatFS у меня выдает до 5 МБайта в секунду для SDHC (с буферизацией конечно). Библиотечные функции трогать не стоит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sambotey 0 29 сентября, 2011 Опубликовано 29 сентября, 2011 (изменено) · Жалоба FatFS у меня выдает до 5 МБайта в секунду для SDHC (с буферизацией конечно). Что значит "с буферизацией"? А со временем появяются дополнительные накладные расходы типа что-то стереть в директории, сами директории растут и прочее. У меня лишь быстро увеличивается количество файлов. А разве увеличение количества файлов влечет за собой увеличение времени создания файла и записи в него? Я тоже предполагал, что виной всему "накладные расходы". Но как с этим бороться? Ведь после закрытия файла мы возвращаемся в исходное положение - освобождается дескриптор файла и все связанные с ним структуры. Изменено 29 сентября, 2011 пользователем sambotey Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 29 сентября, 2011 Опубликовано 29 сентября, 2011 · Жалоба Что значит "с буферизацией"? То и значит - формирую буферы по 6 МБайт в SDRAM и затем записываю их. А иначе быстрых скоростей с SDHC и не видать - по спецификации карта может давать задержки до 250 мс, при чем независимо от класса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 29 сентября, 2011 Опубликовано 29 сентября, 2011 · Жалоба Если есть возможность объединить много мелких файлов в один, увеличить буфер записи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 29 сентября, 2011 Опубликовано 29 сентября, 2011 · Жалоба А разве увеличение количества файлов влечет за собой увеличение времени создания файла и записи в него? Неизбежно влечет, ведь для создания нового файла нужно полностью перелопатить текущую директорию, чтобы: а) убедиться, что файла с таким же именем не существует (не знаю, делает ли FatFS, и можно ли отключить) б) найти/добавить свободное место в директории Но как с этим бороться? Кэшировать диск. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grape 0 29 сентября, 2011 Опубликовано 29 сентября, 2011 · Жалоба - использовать FAT32. у Чена сделан быстрый поиск свободного места. - использовать подкаталоги, в каждом, к примеру, max 256 файлов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sambotey 0 30 сентября, 2011 Опубликовано 30 сентября, 2011 (изменено) · Жалоба Всем громадное спасибо за множество дельных советов. Кэшировать диск. А это как делается? То и значит - формирую буферы по 6 МБайт в SDRAM и затем записываю их. У меня LPC1768, так что могу использовать лишь SRAM и буфер больше 30Kb создать не получается. Сейчас пробую DMA. Изменено 30 сентября, 2011 пользователем sambotey Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 30 сентября, 2011 Опубликовано 30 сентября, 2011 · Жалоба А это как делается? Например, так. Но если памяти только 30кБайт, то смысла нет практически, к сожалению :( Что-то я не нашел в спецификации замечания по поводу задержки до 250мс Оно там есть точно. Просто поищите "ms". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 30 сентября, 2011 Опубликовано 30 сентября, 2011 · Жалоба Всем громадное спасибо за множество дельных советов. Вы, надеюсь, реализовали мультисекторную запись/чтение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sambotey 0 3 октября, 2011 Опубликовано 3 октября, 2011 (изменено) · Жалоба Вы, надеюсь, реализовали мультисекторную запись/чтение? Да, я информацию всего файла сохраняю в буфер, который уже записываю на карточку именно с помощью мультисекторной записи. Однако проблема с постепенным уменьшением скорости записи осталась. Здесь мне помог совет - использовать подкаталоги, в каждом, к примеру, max 256 файлов Сейчас карточка непрерывно пишет со скоростью 2fps. Уже терпимо, но хотелось бы побыстрее. Сейчас пытаюсь упомянутый буфер писать по DMA. Изменено 3 октября, 2011 пользователем sambotey Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться