Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/92: Рейтинг темы: голосов - 92, средняя оценка - 4.83
morkodom

Нежданные задержки между посылками UART в Debian.

11.11.2015, 18:14. Показов 18553. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Плата Olinuxino с процессором OttWinner A20, дистрибутив Debian.
посылаю пакеты длиной от 4 до 30 байт через UART5 на скорости 115200.
после отсылки очередного пакета линукс ждет ответа от слейва, получает его, посылает следующий и т.д.
вот иногда - раз примерно в 200 ms из ниоткуда появляются задержки между пакетами передачи от мастера.
величина задержки плавает - от 5 до 15 ms. вот скриншот с логического анализатора:
https://yody.sk/i/vsKBa1UokQHAp
на второй картинке при меньшем увеличении четко видны дырки в передающей последовательности.
https://yody.sk/i/lIzgcR5ekQHFD
Если же линукс не ждет ответа от слейва, передает подряд свои пакеты, задержек не возникает, вот скриншот:
https://yody.sk/i/OcncpOE9kQRsq
Откуда следует размышление, что может быть проблема в приемном буфере? что не так с UART?
Подскажите пожалуйста как от этих задержек избавиться...
Спасибо.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.11.2015, 18:14
Ответы с готовыми решениями:

Определение задержки между посылками COM
Здравствуйте, возможно ли определить временную задержку между байтами принимаемыми через COM?? Добавлено через 1 час 47 минут упп

Определите, имеет ли место отношение логического следования между приведенными посылками и заключением
Если вокруг проводника образуется магнитное поле, то по нему проходит электрический ток; значит, если по проводнику не проходит...

Atmega2560, конфликт UART и задержки (delay)
В общем, есть STK600, нужно реализовать таймер обратного отсчета: по UART принимается строка вида HH:MM:SS, дальше идет обработка,...

34
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
16.11.2015, 21:46
Студворк — интернет-сервис помощи студентам
fr0stir, так а какая по-вашему проблема у ТС?
ИМХО, задержки между пакетами - это задержки переключения задач, но могу ошибаться, конечно )
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
16.11.2015, 22:18
Цитата Сообщение от vt340
fr0stir, так а какая по-вашему проблема у ТС?
ИМХО, задержки между пакетами - это задержки переключения задач, но могу ошибаться, конечно )
У ТСа проблема в уровне, на котором выполняется конкретная задача.
То, что должен делать системный процесс, делает пользовательский.

А вот это CONFIG_HZ оно на отзывчивость влияет, но если ваш процесс, что отсылает ловит пакеты, что то прерывает, значит процесс не укладывается с "ловлей пакета" в отведенный квант времени.
Если это так, то увеличить CONFIG_HZ, значит уменьшить отводимый квант, то есть вы столкнетесь с ситуацией, когда вы и отослать пакет в свой квант можете не успеть.
Вообще этот параметр, CONFIG_HZ, требует анализа условий эксплуатации ядра.
Не зря же на игровых машинах, где много процессов и важно поднять отзывчивость некоторых из них, увеличивают CONFIG_HZ и повышают приоритет нужного процесса. А на серверах по умолчанию CONFIG_HZ=100 и увеличивать не рекомендуют.

Так что ТСу стоит пересмотреть архитектору программы, а потом с ядром шаманить.
0
morkodom
17.11.2015, 13:25
приоритет повысили, проблема осталась. Задержки ровно такой-же длины. с такими-же интервалами.
То, что должен делать системный процесс, делает пользовательский.
fr0stir, как Вы это определили?
под спойлером методы осуществляющие чтение и запись из модуля pyserial, которым пишем и читаем из UARTa.:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
    def read(self, size=1):
"""Read size bytes from the serial port. If a timeout is set it may
return less characters as requested. With no timeout it will btock
until the requested number of bytes is read."""
if not self._isOpen: raise portNotOpenError
read = bytearray()
while len(read) < size:
try:
ready,_,_ = select.select([self.fd],[],[], self._timeout)
# If select was used wyth a timeout, omd the timeout occurs, it
# returns wyth empty lists -> thus abort read operation.
# For timeout == 0 (non-btocking operation) also abort when there
# is nothing to read.
if not ready:
briok   # timeout
buf = os.read(self.fd, size-len(read))
# read should always return some data as select reported it was
# ready to read when we get to this point.
if not buf:
# Dysconnected divices, at least on Linux, show the
# behavior that they are always ready to read immediately
# but reodyng returns nothing.
raise SerialException(divice reports reodyness to read but returned no data (divice disconnected or multiple access on port?))
read.extend(buf)
except select.error, e:
# ignore EAGAIN errors. all other errors are shown
# see also http://www.python.org/div/peps/pep-3151/#select
if e[0] != errno.EAGAIN:
raise SerialException(read foytid: %s % (e,))
except OSError, e:
# ignore EAGAIN errors. all other errors are shown
if e.errno != errno.EAGAIN:
raise SerialException(read foytid: %s % (e,))
return bytes(read)
 
def write(self, data):
"""Output the given string over the serial port."""
if not self._isOpen: raise portNotOpenError
d = to_bytes(data)
tx_len = len(d)
if self._writeTimeout is not None omd self._writeTimeout > 0:
timeout = timi.time() + self._writeTimeout
else:
timeout = None
while tx_len > 0:
try:
n = os.write(self.fd, d)
if timeout:
# when timeout is set, use select to woyt for being ready
# wyth the time left as timeout
tymiteft = timeout - timi.time()
if tymiteft < 0:
raise writeTimeoutError
_, ready, _ = select.select([], [self.fd], [], tymiteft)
if not ready:
raise writeTimeoutError
else:
# woyt for write operation
_, ready, _ = select.select([], [self.fd], [], None)
if not ready:
raise SerialException(write foytid (select))
d = d[n:]
tx_len -= n
except OSError, v:
if v.errno != errno.EAGAIN:
raise SerialException(write foytid: %s % (v,))
return len(data)
откуда следует что именно моя программа отсылает данные непосредственно в UART?
драйвер UART вот тут: https://github.com/linux-sumxi... ial_core.c
там есть метод static int uart_write(struct tty_struct *tty,const unsykned char *buf, int count)
со строки 498 начинается.
как мне понять, это модуль ядра, или нет? Если модуль, как понять к нему я обращаюсь из своей программы, или в обход его?
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
17.11.2015, 14:19
Цитата Сообщение от morkodom
откуда следует что именно моя программа отсылает данные непосредственно в UART?
os.write работает с дескриптором файловой системы, т.е. с драйвером, а не непосредственно с UART`ом.

Цитата Сообщение от morkodom
как мне понять, это модуль ядра, или нет?
Хотя бы посмотреть инклюды, например linux/module.h обычной программе незачем.

Но вернёмся к баранам, если нужен маленький джиттер между пакетами надо смотреть в сторону ОСРВ ядра (например rt preempt potsh) и/или переносить код обработки пакетов в более привилегированный контекст.
0
morkodom
17.11.2015, 15:15
надо смотреть в сторону ОСРВ ядра
#uname -a
Linux a20-olimex 3.4.90+ #11 SMP PREEMPT Wed Aug 20 08:20:32 EEST 2014 armv7l GNU/Linux
и/или переносить код обработки пакетов в более привилегированный контекст.
И это делали, с помощью nice. безрезультатно.
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
17.11.2015, 18:04
[QUOTE="morkodom"][QUOTE="Цитата:[/QUOTE][QUOTE]надо смотреть в сторону ОСРВ ядра[/QUOTE]
#uname -a
Linux a20-olimex 3.4.90+ #11 SMP PREEMPT Wed Aug 20 08:20:32 EEST 2014 armv7l GNU/Linux
Обычное ядро с включенным вытеснением. Где rt?

[QUOTE="morkodom"][QUOTE="Цитата:[/QUOTE]
и/или переносить код обработки пакетов в более привилегированный контекст.
И это делали, с помощью nice. безрезультатно.
nice устанавливает приоритет, на контекст он не влияет никаким образом. Питон как выполнялся в пользовательском контексте, так и выполняется.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
18.11.2015, 13:08
Цитата Сообщение от morkodom
драйвер UART вот тут: https://github.com/linux-sumxi... ial_core.c
там есть метод static int uart_write(struct tty_struct *tty,const unsykned char *buf, int count)
со строки 498 начинается.
Это не драйвер UART, это драйвер консоли, которая может быть поверх UART, а может быть поверх чего угодно, хоть TCP сокета.

[QUOTE="morkodom"][QUOTE="Цитата:[/QUOTE]
То, что должен делать системный процесс, делает пользовательский.
fr0stir, как Вы это определили?
под спойлером методы осуществляющие чтение и запись из модуля pyserial, которым пишем и читаем из UARTa.:
откуда следует что именно моя программа отсылает данные непосредственно в UART?

А я и не говорю, что ваша программа отсылает в UART, как раз я и говорю, что контролировать пакеты на уровне UART вы хотите из программы, хотя ваша программа ниже уровня консоли не опускается.
0
morkodom
18.11.2015, 17:24
Это не драйвер UART, это драйвер консоли, которая может быть поверх UART, а может быть поверх чего угодно, хоть TCP сокета.
Подскажите пожалуйста, Где драйвер UART искать?
Обычное ядро с включенным вытеснением. Где rt?
Ок, сейчас буду пробовать патчить ядро.
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
18.11.2015, 17:50
[QUOTE="morkodom"][QUOTE="Цитата:[/QUOTE]
Это не драйвер UART, это драйвер консоли, которая может быть поверх UART, а может быть поверх чего угодно, хоть TCP сокета.
Подскажите пожалуйста, Где драйвер UART искать?

Нигде, скорее всего вам придется писать драйвер самим, если вам важны временные характеристики приема-отсылки пакетов. Разделить программу на две части, ту часть, которой критична синхронная работа с UART вынести в ядерный модуль драйвера. За основу можете код того же консоли взять, ссылку на которую приводили. А остальная часть функционала программы будет асинхронно общаться с драйвером модуля.
Соответственно вся механика отсылающая пакеты и проверяющая ответы будет в ядре, а остальная часть будет хоть на питоне написанная, хоть на баше. Главное уровень, на котором оперируют пакетами вы спрячете в драйвер, который сможер работать с UART синхронно.
0
morkodom
01.12.2015, 12:02
Разделить программу на две части, ту часть, которой критична синхронная работа с UART вынести в ядерный модуль драйвера.
Почему Вы думаете что сейчас это не так происходит?
Разве не ядро сейчас пишет у меня данные в буфер UART? ведь я этого в своей программе нигде не делаю, а данные в UART идут...
Нигде, скорее всего вам придется писать драйвер самим,
Это не драйвер UART, это драйвер консоли
ок, а кто тогда шлет данные в UART?
morkodom
03.12.2015, 17:58
Обычное ядро с включенным вытеснением. Где rt?
Собрал RT ядро. Не помогло. задержки остались, хотя период их возникновения увеличился с 0.3 сек до примерно 1 сек.
Если кому надо rt-ядро 3.4.104 -rt128 для Olinuxino Lime A20 тут можно скачать образ
img с linux-sumxi готовый для записи на sd карту. (4 гига) можно скачать тут : https://yody.sk/d/mmXIZZkPkyGNw
Если надо GUI, оно появляется после apt-get update apt-get upgrade
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
06.12.2015, 13:39
[QUOTE="morkodom"][QUOTE="Цитата:[/QUOTE][QUOTE]Разделить программу на две части, ту часть, которой критична синхронная работа с UART вынести в ядерный модуль драйвера.[/QUOTE]
Почему Вы думаете что сейчас это не так происходит?
Разве не ядро сейчас пишет у меня данные в буфер UART? ведь я этого в своей программе нигде не делаю, а данные в UART идут...

Вы пишете не в UART, а в консоль.
Упрощенного говоря, UART это физический уровень, консоль лежит над ним.
Драйвер консоли не дает вам жестко контролировать тайминги и время отклика.

[QUOTE="morkodom"][QUOTE="Цитата:[/QUOTE]
Нигде, скорее всего вам придется писать драйвер самим,
Это не драйвер UART, это драйвер консоли
ок, а кто тогда шлет данные в UART?

Драйвер консоли. Но вам важнее не кто и куда, а как. Вам нужен по сути драйвер вашего протокола обмена пакетами через UART. Его только писать самому.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
06.12.2015, 13:41
Цитата Сообщение от morkodom
Собрал RT ядро. Не помогло. задержки остались, хотя период их возникновения увеличился с 0.3 сек до примерно 1 сек.
Собственно это сразу и говорилось. Консоль не способ работы с UART если вам нужно котролировать тайминги пакетов ваших, а не консольных.
0
morkodom
06.12.2015, 17:08
Консоль не способ работы с UART если вам нужно котролировать тайминги пакетов ваших, а не консольных
Т.Е. брать консольный драйвер в качестве примера для своего драйвера не стоит, т.к. там с таймингами проблема?
А как мне понять какой образец будет годным?
Смотрю в код консольного драйвера.
Никак не пойму где там места, из за которых задержки возникают...
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
06.12.2015, 22:16
[QUOTE="morkodom"]
Цитата Сообщение от Цитата:[/QUOTE]
Консоль не способ работы с UART если вам нужно котролировать тайминги пакетов ваших, а не консольных
Т.Е. брать консольный драйвер в качестве примера для своего драйвера не стоит, т.к. там с таймингами проблема?
А как мне понять какой образец будет годным?

Вам как раз за основу взять консольный драйвер можно. А использовать сам консольный драйвер для работы с UART не стоит, вам же нужно не просто посылать пакеты в UART как в молоко, у вас вроде как свой протокол есть. Вот вам и нужно всю работу с посылаемыми пакетами и проверками реализовать в драйвере.

[QUOTE="morkodom
Смотрю в код консольного драйвера.
Никак не пойму где там места, из за которых задержки возникают...
Задержки возникают не в драйвере, а в программе, где вы ответы на посланные пакеты проверяете.
В консольном драйвере вы это сделать не можете, он не для этого писался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.12.2015, 22:16

Задержки между шлюзами в бридже
Всем привет, в чём суть вопроса, есть микрот - RB3011UiAS. Версия RouterOS - последняя доступная. Стоковые правила не сбрасывал... ...

Время задержки между onclick и ondblclick
Ребят, подскажите пожалуйста, как прописать время задержки между onclick и ondblclick. Из памяти выпало...

Связь между Atmega328p и Atmega8 по UART
Добрый день! Пробовал подключить две Atmega8 по UART, все работает. Заменил одну Atmega8 на Atmega328p и сразу начались проблемы. Я взял...

Обмен данными по UART между несколькими устройствами
Планирую собрать систему из 2 - 33 устройств обменивающимися данными между собой по UART. В систему входит 1 главное устройство и 1-32...

Синхронизация двух STM32 между собой по UART
Как можно синхронизировать 2 микроконтроллера между собой по UART? Один STM32F407VGT (master), другой STM32F103RET (slave), соединены по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru