Easyelectronics.ru

Электроника для всех
Текущее время: 20 ноя 2017, 05:21

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



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

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

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 712
Откуда: Украина, Харьков
Добрый вечер!
Использую 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
Сообщения: 2689
Так понимаю Cubieboard2 тут хост? Тогда по идее STM32F407 не передает, а отвечает на запрос хоста, то есть если хост тормозит с запросом, то и данные приходят с запозданием. Поскольку опрашивающий код написан на Qt полагаю он выполняется в юзерспейсе, а поскольку ядро линукса не реалтаймовое, то тормоза вполне ожидаемы. Тут надо код опрашивающий выносить в ядро плюс ядро настраивать на реалтаймовость.


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

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

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

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

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


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

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 2689
__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
Сообщения: 712
Откуда: Украина, Харьков
fr0ster писал(а):
...Если хост у вас Cubieboard2, то STM32F407 послать ничего не может, только ответить на запрос от хоста...

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

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

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


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

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


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

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

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


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

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1017
Откуда: Германия
__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
Сообщения: 2689
MasterAlexei писал(а):
Она останется один фиг - Linux не Realtime, а Event Based система.
Хотите жесткой временной привязки - вкорячивайте туда что то RTOS-овское, от FreeRTOS до vxWorks.


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


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

Зарегистрирован: 13 фев 2011, 01:25
Сообщения: 605
Откуда: Севастополь
Есть 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
Сообщения: 96
Некоторые соображения:
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
Сообщения: 712
Откуда: Украина, Харьков
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
Сообщения: 96
__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
Сообщения: 2689
Интересно, какая причина в необходимости жесткого реалтайма выше usb?


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

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

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

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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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