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

 
 
6 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> stm32 и FatFs от Chan
Ioann_II
сообщение Mar 30 2017, 02:04
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Здравствуйте, Уважаемые коллеги.

Снова нуждаюсь в Ваших подсказках.

Наконец-то подключил файловую систему от Чана и решил её опробовать.
Версия R0.11 от 02-02-2015.
Пробую открыть файл и дописать в его конец данные:
Код
f_open(&MyFile, "stm32.txt", FA_WRITE | FA_OPEN_ALWAYS);
f_lseek(&MyFile, f_size(&MyFile));
f_write(&MyFile, wtext, strlen((char *)wtext), &wbytes);


По описанию, FA_OPEN_ALWAYS должна открывать файл, если он есть и создавать если его нет.
Код выполняется, но:
- если такой файл уже есть, то очень быстро, менее 1с.
- если файла нет, то f_open и f_lseek срабатывают быстро, а вот f_write - долго, примерно минута. файл с данными появляются.

С чем это может быть связано? Куда "копать"?

_FS_NORTC пробовал (время не организовывал).
портирование от Domen Puncer, немного переделал.

Спасибо.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 30 2017, 07:36
Сообщение #2


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



три вопроса:
0) почему не последняя версия?
1) почему потребовалось портироваоие а не оригинальный код
2) есть ли работа с DMA в diskio и учтены ли требования по выравниванию структур? Это пришлось делать.

Сообщение отредактировал Genadi Zawidowski - Mar 30 2017, 07:47
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Mar 30 2017, 16:54
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(Ioann_II @ Mar 30 2017, 05:04) *
С чем это может быть связано? Куда "копать"?


Смотреть в Ваши низкоуровневые функции чтения/записи диска, к которым обращается FatFS, и пытаться понять, что в них происходит: либо чтение одного и того что с одной и той же ошибкой, или чтение всего FAT в поисках чего-то и т.п.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 30 2017, 23:57
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



0) почему не последняя версия?
Версия та, что была предложена в CubeMX. Полагаю, надо сначала её запустить, а потом уже и посвежее можно попробовать.
1) почему потребовалось портироваоие а не оригинальный код
Имею в виду под портированием реализацию низкоуровневых функций. Несколько разных вариантов из интернета пробовал - всё вообще тупо висло.
Поэтому (т.к. "с наскока" не вышло), стал разбираться последовательно. Чтение и запись секторов работают нормально, проверено. Регистр CSD тоже, из него берутся нужные параметры для ioctl. Таймауты сделаны без таймеров.
2) есть ли работа с DMA в diskio и учтены ли требования по выравниванию структур? Это пришлось делать.
DMA нет. Структур (кроме тех, которые в самой FatFs) не использую.

Ещё. Несколько дней назад на этот-же МК портировал систему FAT32. Там таких проблем не выявлено....
Да, ещё вот - на карте уже записано с пяток файлов, общим объёмом 80Мб.

Сейчас попробовал почистить карту - стало всё быстро....

Получается, что если карта заполнена, то новый файл будет создаваться очень долго??
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Mar 31 2017, 06:31
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(Ioann_II @ Mar 31 2017, 02:57) *
Получается, что если карта заполнена, то новый файл будет создаваться очень долго??

Если на карте тысячи файлов, то возникают задержки в секунды.
У Вас кривое "портирование", низкоуровневые функции работы с диском нужно отлаживать либо писать заново.

Порядок действий при отладке такой:
1) Низкоуровневые функции запускаются сами по себе, без FATFS, измеряется их скорость работы.
2) В низкоуровневых функциях раскидываются команды дёргания ногой процессора, сигнал снимается осциллоскопом, таким образом выявляются места, где функция тормозит.
3) То же самое, что в п 2, но с FATFS
4) Читается моя тема про скорость работы карт памяти, https://electronix.ru/forum/index.php?showt...;hl=MiklPolikov , делаются выводы, низкоуровневые функции и fATfs перенастратваются, п 1-3 проходятся заново.
5) Принимается решение избавится от интерфейса SPI( я угадал ? ) и перейти на SDIO
6)П 1-4 проходятся заново


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 31 2017, 06:37
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Ioann_II @ Mar 31 2017, 01:57) *
Получается, что если карта заполнена, то новый файл будет создаваться очень долго??

Нет, это только означает что у Вас неправильные пчёлы кривой код.
Да вроде в той сборке FatFS, что когда скачивал уже были примеры портирования под разные МК. Наверняка там было и для STM32. Сам не пробовал ибо сразу написал свой low level diskio.
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 31 2017, 07:41
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Цитата(MiklPolikov @ Mar 31 2017, 09:31) *
Если на карте тысячи файлов, то возникают задержки в секунды.
У Вас кривое "портирование", низкоуровневые функции работы с диском нужно отлаживать либо писать заново.

Порядок действий при отладке такой:
1) Низкоуровневые функции запускаются сами по себе, без FATFS, измеряется их скорость работы.
2) В низкоуровневых функциях раскидываются команды дёргания ногой процессора, сигнал снимается осциллоскопом, таким образом выявляются места, где функция тормозит.
3) То же самое, что в п 2, но с FATFS
4) Читается моя тема про скорость работы карт памяти, https://electronix.ru/forum/index.php?showt...;hl=MiklPolikov , делаются выводы, низкоуровневые функции и fATfs перенастратваются, п 1-3 проходятся заново.
5) Принимается решение избавится от интерфейса SPI( я угадал ? ) и перейти на SDIO
6)П 1-4 проходятся заново


1. Файлов всего 5-6. Общий объём 80МБ.
2. Низкоуровневые функции писаны заново. Чтение и запись сектора - проблем не выявлено. Поскольку при малом использовании объёма карты операции проходят быстро, дело не в этих функциях. Похоже, что долго делается поиск свободных кластеров...
3. Дёргания ногой процессора нет - используется аппаратный интерфейс SPI. Кстати надо проверить, не забыл-ли я в этом проекте поднять скорость SPI после инициализации карты. Хотя это не принципиально.
4. За ссылку спасибо - буду изучать.
5. Не угадали. SDIO на МК нет, поэтому только SPI.... увы. С SDIO, наверное, проще - в CUBEMX есть поддержка его и в проект подключается просто.

Вопрос - как Чан ищет кластер свободный для создания файлов - если тупо перебирает все имеющиеся кластеры, тогда это долгий процесс... и тем более долгий, чем больши кластеров занято...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 31 2017, 09:02
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Ioann_II @ Mar 31 2017, 09:41) *
Вопрос - как Чан ищет кластер свободный для создания файлов - если тупо перебирает все имеющиеся кластеры, тогда это долгий процесс... и тем более долгий, чем больши кластеров занято...

Если подозреваете что дело именно в этом - попробуйте отформатировать карту заново и с большим размером кластера и положить туда потом эти файлы.
И вроде там у Чана был кеш FAT-области. А если нет - его можно сделать. Там насколько помнится можно было выделить сколько-то памяти под буфер, можно было минимум, а можно было побольше. Может из-за нехватки буфера у Вас ПО постоянно перечитывает FAT и запись директории с карты?
Если Вы сами пишете low level IO, то несложно туда добавить печать в лог статистики вызовов - можете промониторить какие функции вызываются, насколько часто и каковы временные соотношения между этими вызовами.

Я пару лет назад использовал FatFS на LPC1788. И тоже через SPI. Писал сам низкий уровень (SSP с FIFO + DMA + достаточные буфера в ОЗУ). Так у меня скорость чтения приближалась к 1МБ/сек. Открытия/закрытия файлов тоже не тормозили.
Посмотрите всё что касается буферизации в FatFS и добавьте везде.
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 31 2017, 11:56
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Цитата(jcxz @ Mar 31 2017, 12:02) *
Если подозреваете что дело именно в этом - попробуйте отформатировать карту заново и с большим размером кластера и положить туда потом эти файлы.
И вроде там у Чана был кеш FAT-области. А если нет - его можно сделать. Там насколько помнится можно было выделить сколько-то памяти под буфер, можно было минимум, а можно было побольше. Может из-за нехватки буфера у Вас ПО постоянно перечитывает FAT и запись директории с карты?
Если Вы сами пишете low level IO, то несложно туда добавить печать в лог статистики вызовов - можете промониторить какие функции вызываются, насколько часто и каковы временные соотношения между этими вызовами.

Я пару лет назад использовал FatFS на LPC1788. И тоже через SPI. Писал сам низкий уровень (SSP с FIFO + DMA + достаточные буфера в ОЗУ). Так у меня скорость чтения приближалась к 1МБ/сек. Открытия/закрытия файлов тоже не тормозили.
Посмотрите всё что касается буферизации в FatFS и добавьте везде.

Форматировать с другим размером кластера - попробую, должно помочь, но не решит кардинально ситуацию. Сейчас 80Мб занято, карта на 8ГБ, а если будет под завязку?... тогда как???

По этому пути (буферизации) тоже думаю идти, но пока что с другой реализацией FAT32, не от Чана. Идея от CC Dharmani, Chennai, переделанная сначала kontroler (http://forum.easyelectronics.ru/viewtopic.php?f=4&t=2460), затем мной... всё просто и прозрачно, но нет работы с каталогами, поддержки длинных имён и кодовых страниц.
Но с буферизацией не так всё гладко - мне надо, чтобы была поддержка "горячего" подключения карты (т.е. карту могут вынуть и вставить почти в любой момент времени). Поэтому думаю номер последнего задействованного кластера писать на карту, в зарезервированной области boot сектора. Чтобы тогда не перебирать все кластеры, которые уже заняты данными.

Именно поэтому и задал вопрос по FatFs от Чана - полагаю, что кто-то с этим уже сталкивался, решал и что-то может подсказать.

Цитата(jcxz @ Mar 31 2017, 09:37) *
Нет, это только означает что у Вас неправильные пчёлы кривой код.
Да вроде в той сборке FatFS, что когда скачивал уже были примеры портирования под разные МК. Наверняка там было и для STM32. Сам не пробовал ибо сразу написал свой low level diskio.

Для уважаемого jcxz:
Может, конечно и "кривой" код... Мой код (точнее, не совсем мой, а переделанный из интернета) - только чтение и запись сектора, а также получение служебных данных (ioctl) и инициализация. Вот код: - покажете что тут криво? (вложение).

Пробовал несколько разных чужих примеров - ничего не "завелось". Все примеры "тупо висли". Это "завёл".

Сообщение отредактировал Ioann_II - Mar 31 2017, 12:13
Прикрепленные файлы
Прикрепленный файл  sd.txt ( 8.93 килобайт ) Кол-во скачиваний: 37
Прикрепленный файл  user_diskio.txt ( 6.39 килобайт ) Кол-во скачиваний: 33
 
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Mar 31 2017, 12:23
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(Ioann_II @ Mar 31 2017, 10:41) *
Похоже, что долго делается поиск свободных кластеров...

вот-вот. Ищите где тормозит по тому алгоритму, что я описал. Без долгой скрупулёзной самостоятельной отладки, увы, не обойтись.
Время работы функций измеряется не в "достаточно быстро", а в микросекундах. Надо измерять.

Цитата
5. Не угадали. SDIO на МК нет, поэтому только SPI.... увы.

Угадал. У Вас SPI.

Отписываюсь от темы.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 31 2017, 14:15
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Цитата(MiklPolikov @ Mar 31 2017, 15:23) *
вот-вот. Ищите где тормозит по тому алгоритму, что я описал. Без долгой скрупулёзной самостоятельной отладки, увы, не обойтись.
Время работы функций измеряется не в "достаточно быстро", а в микросекундах. Надо измерять.


Угадал. У Вас SPI.

Отписываюсь от темы.

Буду искать, о результатах отпишусь. Также придётся разбираться "в дебрях" реализации FatFs....
С надобностью измерять согласен полностью, но только касательно низкоуровневых функций, т.к. время работы функций файловой системы сильно будет зависеть от содержимого диска - как в моём случае.

Да, в этом проекте всё-же забыл сделать переключение на максимальную частоту SPIпосле инициализации - стало работать быстро.
Заполню карту и проверю ещё раз. И попытаюсь время измерить.

Не угадали по решению избавиться от SPI - надеюсь, не обидел....

Сделал переключение на максимальную частоту SPI. И измерение времени:
При наличии файла:
open - 38мс
lseek - 387мс
write - 843мс (пишется 1000раз по 82 байта)
При отсутствии файла (создание)
open - 182мс
lseek - 0
write - 4531мс

Т.е. open почти в 5 раз! и write почти в 12раз!


Сообщение отредактировал Ioann_II - Mar 31 2017, 13:45
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 31 2017, 14:34
Сообщение #12


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
Таймауты сделаны без таймеров.

Это где? Там же все по статусу карты делается...
Если что - мой вариант велосипеда. В файле sdcard.c вариант для SPI начинается со строки 2350.

Сообщение отредактировал Genadi Zawidowski - Mar 31 2017, 14:49
Прикрепленные файлы
Прикрепленный файл  sdcard.rar ( 26.32 килобайт ) Кол-во скачиваний: 32
 
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 31 2017, 14:40
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(Ioann_II @ Mar 31 2017, 17:15) *
При наличии файла:
open - 38мс
lseek - 387мс
write - 843мс (пишется 1000раз по 82 байта)
При отсутствии файла (создание)
open - 182мс
lseek - 0
write - 4531мс

Т.е. open почти в 5 раз! и write почти в 12раз!

По 82 байта писать не есть хорошо. Я бы писал хотя бы кратно секторам, организовав небольшой буфер.
Go to the top of the page
 
+Quote Post
Rash
сообщение Mar 31 2017, 19:47
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Потеря скорости и времени будет, если писать по 82 байта. Скорость можно достичь если кратно секторам и то хотя бы начиная с 1024, а то и лучше 4096 байт, складывая нужные данные в свои буферы. Также есть задержка после записи/чтения данных. Задержка завесит от размера передаваемых данных. Для записи может длится 1-30 мсек. Причём самая длительная имеет одну и туже периодичность, скорее всего зависит при переходе между блоками.

Думал сделать буфер на низком уровне, но не получилось, т.к. есть перекрёстный вызов из FatFs функций Write и Read. Выход, вставить переключение задач пока идёт ожидание, что бы не терять время при частой записи на SD карту.
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Apr 1 2017, 10:21
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Отформатировал карту.
Записал большой объём данных (мегабайт на 300).
Проверил ещё раз:
открытие - 185 мс
поиск конца файла - 0 мс
запись данных 10*82 байт - 81 мс.

Вывод: похоже, что FatFs от Чана тут не при чём... До этого на этой карте тестировал другую FAT32 - Похоже, что там что-то не так. А тут всё норм.

Про 82 байта - это для тестирования так. Запись строки. Понятно, что для файловой системы лучше всего, когда пишется кратно сектору, но это не всегда так.
В частности, мне надо именно 82 байта за каждый раз.

Но всё равно хорошо, что спросил - получил полезную информацию, советы и ссылки.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 03:09
Рейтинг@Mail.ru


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