Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2019, 20:57

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 16 окт 2017, 21:25 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 754
Откуда: Украина, Харьков
Добрый вечер!
Использую Cubieboard2 (процессор Cortex-A7 Allwinner A20). Через переходник USB-UART CP2102 данные передаю с STM32F407 на Cubieboard2. Всё работает под Ubuntu (armbian.com). Код который опрашивает порт написан на Qt. Работает прекрасно, но нашёл изъян. Данные принимаемые через USB-UART приходят не всегда через одинаковые промежутки времени.
STM32F407 отправляет пакет данные каждые 10 мс. Соответственно, я должен получать данные каждые 10 мс.
Но я получаю часть данных (около 20-100 пакетов) вовремя каждые 10 мс.
Потом задержка на 40 мс.
Далее получаю пропущенные пакеты через 1-5 мс. (10-20 пакетов)
И снова процесс нормализуется на неопределённое время (20-100 пакетов).
Какая причина такого поведения? Ядро linux?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 16 окт 2017, 22:31 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3302
Так понимаю Cubieboard2 тут хост? Тогда по идее STM32F407 не передает, а отвечает на запрос хоста, то есть если хост тормозит с запросом, то и данные приходят с запозданием. Поскольку опрашивающий код написан на Qt полагаю он выполняется в юзерспейсе, а поскольку ядро линукса не реалтаймовое, то тормоза вполне ожидаемы. Тут надо код опрашивающий выносить в ядро плюс ядро настраивать на реалтаймовость.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 16 окт 2017, 23:05 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 754
Откуда: Украина, Харьков
fr0ster писал(а):
Так понимаю Cubieboard2 тут хост? Тогда по идее STM32F407 не передает, а отвечает на запрос хоста...

Нет STM32F407 каждые 10 мс посылает данные в Cubieboard2. Cubieboard2 ничего не отправляет в STM32F407.

fr0ster писал(а):
...Поскольку опрашивающий код написан на Qt полагаю он выполняется в юзерспейсе, а поскольку ядро линукса не реалтаймовое, то тормоза вполне ожидаемы...

Пока это и считаю проблемой


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 16 окт 2017, 23:34 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3302
__bl__ писал(а):
fr0ster писал(а):
Так понимаю Cubieboard2 тут хост? Тогда по идее STM32F407 не передает, а отвечает на запрос хоста...

Нет STM32F407 каждые 10 мс посылает данные в Cubieboard2. Cubieboard2 ничего не отправляет в STM32F407.


Если хост у вас Cubieboard2, то STM32F407 послать ничего не может, только ответить на запрос от хоста.
Вполне вероятно у вас тип передачи данных не подходящий к вашей задаче.

__bl__ писал(а):
fr0ster писал(а):
...Поскольку опрашивающий код написан на Qt полагаю он выполняется в юзерспейсе, а поскольку ядро линукса не реалтаймовое, то тормоза вполне ожидаемы...

Пока это и считаю проблемой


Что именно? Тормоза или перенос из юзерспейса в кернелспейс?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 16 окт 2017, 23:52 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 754
Откуда: Украина, Харьков
fr0ster писал(а):
...Если хост у вас Cubieboard2, то STM32F407 послать ничего не может, только ответить на запрос от хоста...

Соединение следующее:
USB (Cubieboard2) <==> USB (CP2102) UART <==> UART STM32F407.

fr0ster писал(а):
...Что именно? Тормоза или перенос из юзерспейса в кернелспейс?

Ну не совсем тормоза, а скорее фризы до 40 мс. Данные не теряются, а накапливаются, но потом отдаются. Считаю, что проблема в переходе из ядра в юзерспейс.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 17 окт 2017, 00:01 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3302
У вас описание не в терминах USB протокола.
Плюс тормоза и не значит потеря данных, а именно задержка в доставке.
Просто потому, что инициатор взаимодействия в юзерспейсе.
Вот чтоб этого перехода не было, запилите модуль, работающий с USB девайсом


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 17 окт 2017, 02:22 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 754
Откуда: Украина, Харьков
fr0ster писал(а):
...Вот чтоб этого перехода не было, запилите модуль, работающий с USB девайсом

Перешёл с USB-UART преобразователя (СР2102) на hardware UART порт Cubieboard2. Проблема осталась.
Модуль ядра начну писать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 17 окт 2017, 02:25 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
__bl__ писал(а):
fr0ster писал(а):
...Вот чтоб этого перехода не было, запилите модуль, работающий с USB девайсом

Перешёл с USB-UART преобразователя (СР2102) на hardware UART порт Cubieboard2. Проблема осталась.
Модуль ядра начну писать.

Она останется один фиг - Linux не Realtime, а Event Based система.
Хотите жесткой временной привязки - вкорячивайте туда что то RTOS-овское, от FreeRTOS до vxWorks.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 17 окт 2017, 07:56 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3302
MasterAlexei писал(а):
Она останется один фиг - Linux не Realtime, а Event Based система.
Хотите жесткой временной привязки - вкорячивайте туда что то RTOS-овское, от FreeRTOS до vxWorks.


При этом freertos на кубике жирновато для freertos, а что то типа vxWorks еще и дорого. Имхо самое правильное в архитектуре избавиться от необходимости жесткой реалтаймовости между кубиком и МК.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 21 окт 2017, 01:06 
Старожил

Зарегистрирован: 13 фев 2011, 01:25
Сообщения: 618
Откуда: Севастополь
Есть 2 нюанса :
Первый - сам USBне является реалтаймовым! И дело не в операционках а в стандарте USB, там максимальным приоритетом в обработке обладают только изохронные точки, а USB-UART это обычный bulk! который обрабатывается системой в свободное время. Почитайте сам стандарт USB очень внимательно - чтобы вы ен пытались получить точности в приеме пакетов :) она просто по стандартну не возможна :)

Второй - в дескрипторе устройств передается такой параметр как минимальное время опроса этого устройства , называемое по буржуйски Latency timer. Вот чем меньше его значение - тем быстрее будет возможен опрос данного устройства. Тоже пренеприятная штука - много народа парилось с тем что чипы FTDI теряли пакеты на высоких скоростях. Пока не научились выставлять програмно этот таймер с 16 милисекунд до 4 или 2х. Сразу перестали пропадать пакеты на высоких и не только скоростях.
С проблеммой Латенси - до сих пор бьется народ на блютуз юсби свистках - там например звук в нвушниках ощутимо запаздывает... И только избранные дорогущие свистки - имеют минимальную задержку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 21 окт 2017, 05:01 
Заглядывает иногда

Зарегистрирован: 15 окт 2017, 22:24
Сообщения: 180
Некоторые соображения:
1) У чипов USB-UART обычно есть буфера (FIFO). Usb кидает данные пакетами. Отправку может инициировать только хост, не чаще чем 1 раз в миллисекунду для fullspeed. А потом еще зависит от того как драйверы данные будут из буферов по usb разгружают. И вот тут появляется довольно много неопределенностей.

2) Ядро штука многозадачная, запускает много тредов и проч. И если прямо сейчас вкалывает что-нибудь что нельзя переключить - остальное, включая и вашу программу - отдохнет. У вас ядро хотя-бы с 1000Hz tick-ами и как low-latency (full preemption) собрано? А то дефолтные ядра часто ориентированы на bulk производительность, в ущерб остальному. Запросто может быть 100Hz тик (квант времени == 10 мс!) и без preempt-а, на серверах это дает несколько процентов прибавки к общей производительности. Но если ядро на несколько медленных тиков займется каким-нибудь чтением "диска" - фиг его вышибешь и будете ждать пока оно там какой-нибудь медленный системный вызов завершит. Хрен знает как в армбиане, я себе и рутфс (дебиана) и ядра сам собираю, так понятнее что я получу, смотрите конфиг использованного ядра на предмет Hz и latency.

3) Программа опять же делит время с остальными, включая и ядро. И уж ее то поставить на паузу в многозадачной системе - милое дело. Если реалтайм ну очень важен - кроме понимания тиков еще надо man sched_setscheduler() и то что рядом, чтоли. Там даже можно поиметь какие-то псевдо-реалтаймные гарантии что вас будут обязаны запускать X миллисекунд на интервале Y миллисекунд, если шедулер правильно заказать и настроить. А с переключением задач в виде "по умолчанию" ВАМ НИКТО НИЧЕГО НЕ ОБЕЩАЕТ. Особенно что будут вас пускать не реже чем раз в 10 мс и проч. Это многозадачная система, ваша задача в системе не одна. Даже если вы init=yourprogram сделаете, у ядра свои треды есть для внутренних нужд есть и проч.

Кстати у куби должны быть нативные UART-ы, уровни 3.3V если не ошибаюсь. Можете с ним попробовать (обычный 16550 более-менее). Он проще и более предсказуемый. Но с такими аппетитами я бы для начала читал с простого уарта, используя lowlatency ядро и загнав процессу-чтецу "реалтаймный" шедулер. Тогда что-то там про 10 мс в большой многозадачной ОС даже не будет звучать как бред. Еще кстати может иметь смысл частоту зажать на близкие к максимуму (1.08 GHz для Allwinner A10/A20). На маленькой частоте проца (а allwinner по минимуму умеет что-то типа 30МГц, чтоли) до системы может очень долго доходить что нагрузка увеличилась и надо бы частоту задрать. На 30МГц система очень долго раздупляет, народ утверждает что даже на глаз заметно, так что проверить настройки управления частотами (шедулер частот и мин/макс на которых ему разрешено болтаться).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 21 окт 2017, 20:59 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 754
Откуда: Украина, Харьков
balu_dark и LinuxPowered спасибо за помощь.
balu_dark писал(а):
...Latency timer...
у переходника CP2102 такого или аналогичного параметра нет. Пытался начать читать стандарт USB. Пока не осилил.
LinuxPowered писал(а):
...У вас ядро хотя-бы с 1000Hz tick-ами и как low-latency (full preemption) собрано...
Конечно нет. Попробую заново собрать ядро.
LinuxPowered писал(а):
Программа опять же делит время с остальными
Сейчас ищу задержки в коде на Qt.
LinuxPowered писал(а):
...Кстати у куби должны быть нативные UART-ы...
Вы не ошибаетесь. Протестировал порты. Поведение нативных UART и переходника CP2102 одинаковое. Остаётся только пересобрать ядро.
LinuxPowered писал(а):
...частоту зажать на близкие к максимуму (1.08 GHz для Allwinner A10/A20)...
Зажал уже давно. Ещё в самом начале тестов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 22 окт 2017, 21:09 
Заглядывает иногда

Зарегистрирован: 15 окт 2017, 22:24
Сообщения: 180
__bl__ писал(а):
balu_dark и LinuxPowered спасибо за помощь.

Мне нравится учить летать этих птичек. Но имейте в виду что я только учусь и могу ошибаться.
Цитата:
у переходника CP2102 такого или аналогичного параметра нет.

Если нативные uart ведут себя так же, значит дело не в usb и разгрузке буферов чипа.
Цитата:
Пытался начать читать стандарт USB. Пока не осилил.

Он довольно суровый, особенно со всеми 3.х и дополнениями. Проброс через usb uart-а имеет свою специфику, потому что usb совсем другая по свойствам шина, вот его и заподозрили.
Цитата:
Конечно нет. Попробую заново собрать ядро.

Тогда обратите внимание на частоту тиков и чтобы ядро было full preempt. Иначе вы будете надолго терять управление в вашем коде. А если код не выполняется - он пролетает. Могу поискать точные названия параметров конфига ядра, если хотите.
Цитата:
Сейчас ищу задержки в коде на Qt.

Я бы при аппетите с миллисекундами написал простую читалку uart на сях (в сообществе кто-то накатал пример, кривой, но идея понятна) и пустил с правильным шедулером (SCHED_FIFO или SCHED_RR), приличным приоритетом, на 1000Hz full preempt ядре. В системе где нет лишних процессов, особенно реалтаймных. Так десятки мс не будут бредом, хоть и многозадачка. Реалтаймный шедулер позволяет положить систему, поэтому его только рут может ставить. Можно еще systemd при запуске cpu-шедулер поставить, если к вашей системе и сценарию использования применимо.
Цитата:
Протестировал порты. Поведение нативных UART и переходника CP2102 одинаковое.

Тогда с usb подозрения снимаются.
Цитата:
Остаётся только пересобрать ядро.

И реалтаймный шедулер чтецу заказать, наверное. Если миллисекунды важны, чтец должен получать время вперед всех остальных и его не должны вышибать надолго другие. Ну и я бы начал с кода попроще на си и без гуя, чтоли. Что там куть делает и сколько это может занимать я не знаю.
Цитата:
Зажал уже давно. Ещё в самом начале тестов.

Значит дело и не в медленности подъема частот. Может, программа надолго затупляет/что-то делает не так или ее надолго вышибают другие? Может гуйная часть проги надолго втупляет (или куть не для того?) или в системе есть прожорливый высокоприоритетный процесс который вас надолго задвигает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 22 окт 2017, 21:22 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3302
Интересно, какая причина в необходимости жесткого реалтайма выше usb?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cortex-A7. Приём данных через USB с джиттером
СообщениеДобавлено: 22 окт 2017, 21:47 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 754
Откуда: Украина, Харьков
Изменил код чтения портов на Qt. Получился приемлемый джиттер (2-3 мс), что для меня вполне достаточно.

fr0ster писал(а):
Интересно, какая причина в необходимости жесткого реалтайма выше usb?

Измерительная система каждые 10 мс передаёт данные длинной от 512 до 640 байт. Как я сказал выше, джиттер в 2-3 мс меня устраивает.

Сейчас измерительная система работает следующим образом: по нативному uart в cubieboard получаю информацию о пакете данных и через нативный spi считываю их с stm32f407. Проверяю работоспособность дальше.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB