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

 
 
 
Reply to this topicStart new topic
> Проблемка с записью данных в файл, stm32+cubeF2+fatfs+usb
XWoo
сообщение Oct 20 2015, 13:56
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 19-11-09
Пользователь №: 53 737



Доброго времени суток, коллеги.
Наблюдаю следующую вещь. В цикле идёт периодическая запись одного байта в файл. Данные пишутся без проблем. Но если поставить для отладки светодиод в этот цикл, то по осциллограмме получается следующее: несколько раз светодиод моргает с одинаковой задержкой, а один раз эта задержка в несколько раз увеличивается. Задержка получается именно в функции записи в файл (f_printf или f_puts). Если закомментировать эту функцию, то моргание светодиода становится равномерным!
Пробовал писать массив размером 64,128,256,512,1024,2048,4096 байт - ничего не меняется.

Я использую кейл и библиотеку stm32cubef2. В ней есть пример с использованием usbhost и файловой системы fatfs (от chanа) для записи/чтения строки в файл на usb-флэшку. Я заменил fatfs на последнюю версию с сайта автора - всё повторяется. Пробовал работать с разными флэшками на 4 и 8 Гбайт - задержка всё равно есть.

Есть ли решение этой проблемки? Как с этим бороться? Можно ли это задержку убрать или хотябы уменьшить?

По времени получалось следующее: несколько раз, например, задержка в функции записи была 50 мс, а потом один раз становится 500 мс.

Может это такая особенность библиотеки, драйверов или самой fatfs ?

Сообщение отредактировал XWoo - Oct 20 2015, 14:08
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Oct 20 2015, 14:10
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(XWoo @ Oct 20 2015, 14:56) *
Наблюдаю следующую вещь. В цикле идёт периодическая запись одного байта в файл. Данные пишутся без проблем. Но если поставить для отладки светодиод в этот цикл, то по осциллограмме получается следующее: несколько раз светодиод моргает с одинаковой задержкой, а один раз эта задержка в несколько раз увеличивается. Задержка получается именно в функции записи в файл (f_printf или f_puts). Если закомментировать эту функцию, то моргание светодиода становится равномерным!
Пробовал писать массив размером 64,128,256,512,1024,2048,4096 байт - ничего не меняется.
Я использую кейл и библиотеку stm32cubef2. В ней есть пример с использованием usbhost и файловой системы fatfs (от chanа) для записи/чтения строки в файл на usb-флэшку. Я заменил fatfs на последнюю версию с сайта автора - всё повторяется. Пробовал работать с разными флэшками на 4 и 8 Гбайт - задержка всё равно есть.
Есть ли решение этой проблемки? Как с этим бороться? Можно ли это задержку убрать или хотябы уменьшить?


Проблемы как таковой нет sm.gif есть небольшое непонимание некоторых вещей:

- никто не знает (и все может поменяться в любой версии софта), как реализованы высокоуровневые функции над файловой системой (fprintf и им подобные). Как они кешируют данные для записи\чтения и когда решают эти кеши скинуть в файловую систему. Никаких гаранитий по времянкам тут нет.

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

- запись на носители с NAND флэшем никаких особых гарантий по времянкам не дает, поскольку унутре оно в любой момент может начать процесс освобождения erase blocks.

Так что рассчитывать на какие-то конкретные задержки и их отсутствие не стоит.. Можно с грехом пополам рассчитывать на какую-то среднюю производительность, да и то не всегда.
В консерватории надо править, то есть сам высокоуровневый подход к работе с данными.

Go to the top of the page
 
+Quote Post
XWoo
сообщение Oct 20 2015, 14:26
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 19-11-09
Пользователь №: 53 737



CrimsonPig, спасибо за ответ.
А вот если мне надо писать периодически большой объём данных, пришедших, скажем, от ацп и делать это как можно ближе к реальному времени... Как быть? Вот накопил я буфер с несколькими килобайтами данных и пока их пишу на флэшку, сама эта функция записи весь мой реал и "убьёт" (пол секунды - это много). Что делать? Ведь сам ацп заполняет буфер очень быстро, а запись в файл идёт очень медленно.

Сообщение отредактировал XWoo - Oct 20 2015, 14:26
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Oct 20 2015, 14:33
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(XWoo @ Oct 20 2015, 15:26) *
CrimsonPig, спасибо за ответ.
А вот если мне надо писать периодически большой объём данных, пришедших, скажем, от ацп и делать это как можно ближе к реальному времени... Как быть? Вот накопил я буфер с несколькими килобайтами данных и пока их пишу на флэшку, сама эта функция записи весь мой реал и "убьёт" (пол секунды - это много). Что делать? Ведь сам ацп заполняет буфер очень быстро, а запись в файл идёт очень медленно.


Ээээ... если у вас данные поступают со средней скоростью 5Мб\с а средняя скорость записи в файл 2Мб\с то выход один - писать данные в /dev/null sm.gif

Если средняя скорость записи в файл все-таки больше средней скорости поступления данных, то можно использовать очередь из несколько буферов, заполнять их данными в одном "процессе" и в бэкграунде или другом "процессе" писать буфера на диск и возвращать в список "пустых". По-моему похожая тема тут совсем недавно обсуждалась.

а, да.. есть всякие мелкие хитрости, которые на элементарных файловых системах типа фата позволяют слегка улучшить производительность, но это не панацея, проблемы в консерватории они не решают...
Например:
- писать данные большими блоками, кратными размеру _кластера_ файловой системы (а не размеру сектора физического носителя)
- заранее увеличить длинну файла до нужного значения (в идеале) или увеличивать размер файла большими кусками сначала, а данные писать в него потом (сначала будет выделена цепочка кластеров, а запись в нее будет вестить без отвлекания на манипуляции с FAT. Если повезет, уменьшается фрагментация файловой системы)
- правильно выбрать параметры (размер кластера, выравнивание) файловой системы (форматирование СД карточек специально предназначенными для этого тулзами, например)


Сообщение отредактировал CrimsonPig - Oct 20 2015, 14:42
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 20 2015, 15:32
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



XWoo, а куб-то пот кайлами в RTX вертится? Никогда его не использовал, поэтому спрашиваю
Если нет - таймер. Флаг подняли - по таймеру моргнули, если в RTX - задача без стека с самым низким приоритетом, ждущая флага (события, wait_evt вроде)
Go to the top of the page
 
+Quote Post
XWoo
сообщение Oct 21 2015, 05:56
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 19-11-09
Пользователь №: 53 737



CrimsonPig, понял вашу мысль. sm.gif Спасибо. Идея с несколькими буферами у меня проскакивала... Это часто используют при работе с ЖК-дисплеями/индикаторами для уменьшения "моргания" при обновления экрана.

toweroff, я никогда не пользовался ни одну ОСРВ. sm.gif Ну не было таких задач, чтоб пришлось бы применять ОС. И не только у меня одного. Знакомые также не юзали ОС (однако они говорят, что рано или поздно придётся). sm.gif Время покажет...

При использовании usb из-под куба тут на форумах где-то говорили, что эта rtx автоматом подключается в код без ведома программиста (это нужно для работы самого usb и всего с ним связанного, именно при применении куба).

Ещё говорят, что usb-драйвер/библиотека/протокол (вся эта программная реализация usb) "съедает" много времени у ядра (и ресурсоёмкая), поэтому рекомендуют ставить самый высокий приоритет usb-прерыванию (0 или 1) соотвествующей функцией при инициализации.

Сообщение отредактировал XWoo - Oct 21 2015, 06:53
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Oct 21 2015, 08:34
Сообщение #7


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(CrimsonPig @ Oct 20 2015, 17:10) *
- никто не знает (и все может поменяться в любой версии софта), как реализованы высокоуровневые функции над файловой системой (fprintf и им подобные). Как они кешируют данные для записи\чтения и когда решают эти кеши скинуть в файловую систему. Никаких гаранитий по времянкам тут нет.


Вообще говоря, fprintf - штука довольно очевидная. Легко изучается, легко подменяется на свой велосипед. Времянки по ней посчитать тоже очень легко (хочешь в тактах, хочешь - осциллографом), и они достаточно стабильные. Разговор "всё может САМО поменяться" вообще ни о чём, с чуть меньшей вероятностью Земля завтра налетит на небесную ось.

А вот ST'шная библиотека хоста - штука довольно странная. Изучать её можно долго, там наверчено хрен знает что. Можно ли это как-то значительно оптимизировать - не знаю... Бесплатных аналогов этой библиотеки не знаю. Хороших платных - тоже не знаю (в прошлой конторе работали с венграми HCC - тоже есть нарекания, но теперь ещё и за деньги; поддержка не очень помогает).

Если не поможет добавление буферов (и запись данных не по одному байту!) - открывается большой простор для творчества и костылестроения. Можно, например, свой драйвер FAT сделать, который будет писать в заранее подготовленный файл - количество записей уменьшится вдвое, не нужно будет обновлять запись FAT.

Цитата(XWoo @ Oct 21 2015, 08:56) *
Ещё говорят, что usb-драйвер/библиотека/протокол (вся эта программная реализация usb) "съедает" много времени у ядра (и ресурсоёмкая), поэтому рекомендуют ставить самый высокий приоритет usb-прерыванию (0 или 1) соотвествующей функцией при инициализации.

Нет, после всех предварительных действий там просто перекладывание данных из памяти в регистры USB.
Правда, действительно, хост неадекватно себя ведёт, если приоритет прерывания достаточно низкий. Кто виноват, понять не удалось.

Цитата(XWoo @ Oct 21 2015, 08:56) *
При использовании usb из-под куба тут на форумах где-то говорили, что эта rtx автоматом подключается в код без ведома программиста (это нужно для работы самого usb и всего с ним связанного, именно при применении куба).

Не читайте советских газет!
Куб, конечно, много чего "без ведома" творит, но не настолько же.

Кстати, куб в принципе не может работать под ОС (точнее, корректно обрабатывать обращения к одной и той же периферии из нескольких потоков).
Хотя может уже и поправили это безобразие:
stm32f1xx_hal_def.h
Код
#if (USE_RTOS == 1)
  #error " USE_RTOS should be 0 in the current HAL release "
#else


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
XWoo
сообщение Oct 21 2015, 08:54
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 19-11-09
Пользователь №: 53 737



esaulenka, советских газет более читать не будем. sm.gif

Буду несколько буферов вводить и т.п. Посмотрим...

В версии куба для f2 уже стало возможным работать из-под ОС (там поправили "это безобразие"). sm.gif

Файл stm32f2xx_hal_def.h

#if (USE_RTOS == 1)
/* Reserved for future use */
#else
...
...
...
#endif /* USE_RTOS */
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Oct 21 2015, 09:07
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(esaulenka @ Oct 21 2015, 09:34) *
Если не поможет добавление буферов (и запись данных не по одному байту!) - открывается большой простор для творчества и костылестроения. Можно, например, свой драйвер FAT сделать, который будет писать в заранее подготовленный файл - количество записей уменьшится вдвое, не нужно будет обновлять запись FAT.


Моя мысль состоит в том, что рассчитывать на что-то отдаленно напоминающее realtime performance (необязательно с микросекундными временами реакции) имея NAND flash со встроенным контроллером и FTL + неизвестно как работающий FAT + сверху USB + C runtime просто глупо. SD-карточка и тем более какой-нибудь ЮСБ - свисток имею полное право без спроса устроить паузу на сотню миллисекунд, и запортить весь erase block размером в несколько мегабайт, опционально покорежив всю файловую систему.
Хочется гарантий - надо искать решения, в спецификациях на которые эти гарантии пописаны. Да и сделать такую систему (железо + весь стек разноуровнего софта сверху весьма непросто).
Так что надо осетра урезать sm.gif
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Oct 21 2015, 10:02
Сообщение #10


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(XWoo @ Oct 21 2015, 11:54) *
В версии куба для f2 уже стало возможным работать из-под ОС (там поправили "это безобразие"). sm.gif
#if (USE_RTOS == 1)
/* Reserved for future use */
#else


Не-а, они просто грабли поглубже спрятали.
Если без RTOS у них взводится свой собственный флажок (см. макросы LOCK), то при наличии операционки даже он отсутствует.


PS если проект ещё на стадии обдумывания, я б взял SD-карточку вместо этого USB. Там заметно прозрачнее всё устроено (хотя, конечно же, таймауты никуда не денутся, в соседней теме человек страдает...).


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
XWoo
сообщение Oct 21 2015, 10:37
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 19-11-09
Пользователь №: 53 737



Понятно. Благодарю за комментарии.

В кубе в примерах есть много примеров работы с периферией как без ОС, так и с ОС. Тот же самый вариант с usb (который я взял для примера) есть и на ОС. Работает вроде как говорят. Сам не проверял.

С sd-карточкой тут уже не получится (сказали, надо usb-флэху). Дедам удобнее коннектить флэшку то в комп, то в девайс. sm.gif Так сказать, мобильность нужна.
Go to the top of the page
 
+Quote Post
Harvester
сообщение Oct 21 2015, 11:15
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(esaulenka @ Oct 21 2015, 11:34) *
Не читайте советских газет!
Куб, конечно, много чего "без ведома" творит, но не настолько же.

Газеты, может действительно не стоит читать, а вот то, что при использовании USB-библиотеки от ST подключается RTX - это факт.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
XWoo
сообщение Oct 21 2015, 11:48
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 19-11-09
Пользователь №: 53 737



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

Вопрос в том, зачем она там нужна? ЧТо там происходит сложного, что туда автоматом "всовывают" эту ОС?

Получается, что в любом кубе под stm32 при использовании hal-usb добавляется и кейл rtx?

Сообщение отредактировал XWoo - Oct 21 2015, 11:58
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Oct 21 2015, 19:53
Сообщение #14


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Взял куб (полугодовой давности, я его не обновляю за ненадобностью).
Выбрал STM32F107 (кроме линейки 32F1xx у меня ничего не скачено - тоже не надо).
Компилятор - кейл.

Включил USB HOST (в режиме mass storage).
Нажал кнопку "сгенерировать проект". Запустил кейл, скомпилировал (собралось сразу, честь и хвала!).
RTX'ом не пахнет (какие доказательства предоставлять?).

Заодно расскажите, как этот куб генерирует проекты и под кейл (якобы с RTX), и под IAR, и под GCC. Там везде RTX ? Или их супер-код сам собой адаптируется?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
XWoo
сообщение Oct 22 2015, 05:42
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 19-11-09
Пользователь №: 53 737



Как ни странно, а мне тоже интересна "автоматическая" надобность ОС в данной библиотеки... Зачем она там подключается? Какова необходимость в ней? 05.gif
С другой стороны usb host работает ведь хорошо (везде и у всех!), если не считать моей проблемки с неодинаковой длительностью записи в файл. biggrin.gif

Сообщение отредактировал XWoo - Oct 22 2015, 05:44
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:18
Рейтинг@Mail.ru


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