Easyelectronics.ru • Просмотр темы - Нежданные задержки между посылками UART в Debian.

Easyelectronics.ru

Электроника для всех
Текущее время: 19 авг 2018, 21:53

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 12 ноя 2015, 19:01 
Только пришел

Зарегистрирован: 12 ноя 2015, 18:10
Сообщения: 8
Плата Olinuxino с процессором AllWinner A20, дистрибутив Debian.
посылаю пакеты длиной от 4 до 30 байт через UART5 на скорости 115200.
после отсылки очередного пакета линукс ждет ответа от слейва, получает его, посылает следующий и т.д.
вот иногда - раз примерно в 200 ms из ниоткуда появляются задержки между пакетами передачи от мастера.
величина задержки плавает - от 5 до 15 ms. вот скриншот с логического анализатора:
https://yadi.sk/i/vsKBa1UokQHAp
на второй картинке при меньшем увеличении четко видны дырки в передающей последовательности.
https://yadi.sk/i/lIzgcR5ekQHFD
Если же линукс не ждет ответа от слейва, передает подряд свои пакеты, задержек не возникает, вот скриншот:
https://yadi.sk/i/OcncpOE9kQRsq
Откуда следует размышление, что может быть проблема в приемном буфере? что не так с UART?
Подскажите пожалуйста как от этих задержек избавиться...
Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 12 ноя 2015, 20:54 
Старожил

Зарегистрирован: 26 апр 2013, 23:55
Сообщения: 974
...для начала как вы выставили таймауты для работы с портом и код.
И Debian - не ОСРВ по-умолчанию.

Правда и вымысел об операционных системах Linux реального времени

_________________
Белорусский журнал «Радиолюбитель»
Мои разработки http://raxp.radioliga.com


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 12 ноя 2015, 21:47 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
Для начала надо просто узнать, как ТС с UART работает.
Для Unix стандартная метода - настроить tty на UART в данном случае.
То есть для Debian и прочих *nix`ов UART будет текстовой консолью.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 13 ноя 2015, 12:14 
Только пришел

Зарегистрирован: 12 ноя 2015, 18:10
Сообщения: 8
вот код драйвера на питоне.
Код:
# -*- coding: utf-8 -*-

import serial
from security_processor import PS
from remote_control_panel import RCP
from io import IO
from control_leds import CL
from log import exc

RS485_ADDRESS  = '/dev/ttyS2' # номер интерфейса uart
RS485_BAUDRATE = 115200 # максимальная скорость uart


########################################################################
class Driver():
    """Класс для работы с RS-485"""

    #----------------------------------------------------------------------
    def __init__(self, port = RS485_ADDRESS):
        """Constructor"""
        self._port = port
        self._ser = serial.Serial()
        self._ser.port = self._port
        self._ser.baudrate = RS485_BAUDRATE
        self._ser.bytesize = serial.EIGHTBITS    #number of bits per bytes
        self._ser.stopbits = serial.STOPBITS_ONE #number of stop bits
        self._ser.parity = serial.PARITY_NONE    #set parity check: no parity
        ##self._ser.timeout = None                 #timeout = None: wait forever
        ##self._ser.timeout = 0                    #timeout = 0: non-blocking mode (return immediately on read)
        self._ser.timeout = 0.01                 #timeout = x: set timeout to x seconds (float allowed)
        self._ser.xonxoff = False                #disable software flow control
        self._ser.rtscts = False                 #disable hardware (RTS/CTS) flow control
        self._ser.dsrdtr = False                 #disable hardware (DSR/DTR) flow control
        self._ser.writeTimeout = 0.05            #timeout for write
       
        try:
            self._ser.open()
        except Exception, err:
            exc("error open serial port: %s" % str(err))
            if self._ser:
                self.close()
        if self._ser.isOpen():
            self._ser.flushInput()
            self._ser.flushOutput()

    #----------------------------------------------------------------------
    def init(self):
        """"""
        pass

    #----------------------------------------------------------------------
    def write(self, data):
        """Записываем данные в подчиненное устройство"""
        res = None
        if not self._ser.isOpen():
            raise Exception('must open before write')
        try:
            res = self._ser.write(data)
        except Exception, e:
            exc('rs485 write error: %s' % str(e))
            self._ser.flushInput()
            self._ser.flushOutput()
       
        return res

    #----------------------------------------------------------------------
    def read(self, length=None):
        """Считываем данные с подчиненного устройства"""
        res = None
        if not self._ser.isOpen():
            raise Exception('must open before read')
        try:
            if length:
                res = self._ser.read(length)
            else:
                res = self._ser.read()
                res += self._ser.read(self._ser.inWaiting())
        except Exception, e:
            exc('rs485 read error: %s' % str(e))
            self._ser.flushInput()
            self._ser.flushOutput()
       
        return res

    #----------------------------------------------------------------------
    def close(self):
        """Закрываем соединение с подчиненным устройством"""
        self._ser.close()



Цитата:
И Debian - не ОСРВ по-умолчанию.

Значит-ли это что я должен отказаться от Debian?
Может можно как-то разобраться где именно затык?
вот ссылка на исходники сериального драйвера serial_core.c
моего линуха:
https://github.com/linux-sunxi/linux-sunxi/blob/sunxi-3.4/drivers/tty/serial/serial_core.c#L498
это оно? мне стоит попробовать поковырять функцию uart_write ?
Есть у кого-то подобный опыт? можно как-то вытащить из этой функции отладочную информацию?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 13 ноя 2015, 15:43 
Здравствуйте!

Зарегистрирован: 13 ноя 2015, 15:06
Сообщения: 1
Show

Была похожая проблема когда с линухом и wince начинал заниматься.


Последний раз редактировалось xVekx 13 ноя 2015, 17:11, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 13 ноя 2015, 16:07 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
В данном (пример ТСа на питоне) случае проблема не в Debian, не в UART, а в том, как данные отсылаются в устройство /dev/ttyS.
Кто отвечает за работу с пакетами? Ядерный модуль или пользовательская программа?
Похоже именно программа работая в user-space послав пакет ждет ответ от слейва.
При таком подходе даже в ОСРВ будут проблемы с UART.
Во втором случае, у xVekx`а (неплохо бы простыню кода в спойлер спрятать) программа только формирует строку, а с UART непосредственно работает система, имея более высокий приоритет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 13 ноя 2015, 16:37 
Старожил

Зарегистрирован: 26 апр 2013, 23:55
Сообщения: 974
Цитата:
Значит-ли это что я должен отказаться от Debian?
нет, прочитать статью до конца по ссылке до "Preemptible Kernel" и ответить на вопрос предыдущего поста.

_________________
Белорусский журнал «Радиолюбитель»
Мои разработки http://raxp.radioliga.com


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 13 ноя 2015, 17:21 
Старожил

Зарегистрирован: 19 июн 2012, 14:17
Сообщения: 3440
fr0ster писал(а):
Кто отвечает за работу с пакетами? Ядерный модуль или пользовательская программа?
Похоже именно программа работая в user-space послав пакет ждет ответ от слейва.
При таком подходе даже в ОСРВ будут проблемы с UART.

С чего бы это вдруг. Есть вполне успешные ОСРВ на микроядерной архитектуре (QNX, PikeOS,..), там всё крутится в userspace, и драйвера, и программы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 13 ноя 2015, 17:59 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
яверт писал(а):
fr0ster писал(а):
Кто отвечает за работу с пакетами? Ядерный модуль или пользовательская программа?
Похоже именно программа работая в user-space послав пакет ждет ответ от слейва.
При таком подходе даже в ОСРВ будут проблемы с UART.

С чего бы это вдруг. Есть вполне успешные ОСРВ на микроядерной архитектуре (QNX, PikeOS,..), там всё крутится в userspace, и драйвера, и программы.


Это в общем все там реалтаймовое, юзерспейсовое и микроядерное, а как доходит до деталей, то ой.
Эта реалтаймовость и микроядерность у QNX оначает лишь две вещи, автору программы дается возможность написать реалтаймовую программу и отбирается возможность кривонаписанным кодом отнять реалтаймовость у прочих процессов. То есть переход на ОСРВ автоматом руки программисту не выправляет, он только оберегает от кривых рук одного прочих программистов пишущих для той же системы. Это я про криворукость вообще, а не в чей то огород.

Вот это и есть успешность, а не как на некоторых системах было, процесс затупил, так либо все его ждут, либо втихаря отстреливают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 14 ноя 2015, 06:47 
Старожил

Зарегистрирован: 28 янв 2012, 21:27
Сообщения: 292
Откуда: Питер
Драйвер на питоне - это круто!
Я бы написал ядерный модуль, который выполняет все задачи, критичные к времени выполнения. Ради минимальных задержек можно повеситься на прерывание UART и формировать пакет прямо в этом прерывании... А остальные задачи реализовать в userspace. И незачем переходить на другую ОС.
Почитайте "Цилюрик О.И. - Модули ядра Linux".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 14 ноя 2015, 12:04 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
Про ядра и модули Цилюрика чтать имеет смысл для начала только, потом нужно что посвежее.
За 4 года архитектура изменилась слегка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 14 ноя 2015, 12:15 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2530
Откуда: КЧР, поселок Нижний Архыз
Советую не на пхытоне сделать, а на сях. И открывать терминал в режиме неблокирующего считывания. Пользуюсь самописным велосипедом, никаких проблем нет.
А в блокирующем чтении, да еще с пхытоном наверняка получается внешняя буферизация, что и приводит к задержкам.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 14 ноя 2015, 12:45 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
Eddy_Em писал(а):
Советую не на пхытоне сделать, а на сях.


И на сях бывают тормоза написанные, а пхытон как клей для модулей и библиотек вполне себе юзабелен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 14 ноя 2015, 21:16 
Старожил

Зарегистрирован: 28 янв 2012, 21:27
Сообщения: 292
Откуда: Питер
fr0ster писал(а):
Про ядра и модули Цилюрика чтать имеет смысл для начала только, потом нужно что посвежее.
За 4 года архитектура изменилась слегка.

Да, вы правы. Что именно советуете почитать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 14 ноя 2015, 23:28 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
Гуглить linux kernel architecture и Linux kernel modules programming, искать ссылки на тексты посвежее.
Хорошая отправная точка статья на википедии Linux_kernel

Но для начала прочесть Цилюрика и вообще что то о сборке ядра(начала они разные, одному начала разработка USB драйвера, а другому просто собрать helloworld модуль).
Если раньше не доводилось собирать ядра и модули Linux то при попытке сборки нужно помнить, что ссылки на папку с исходниками ядра, должны быть не на просто на распакованные, а на сконфигурированные.
Доя гарантии стоит собрать из исходников версию ядра, в Дебиан-подобных системах используя fakeroot и dpkg,
установить это ядро, чтоб загружалось, и далее при сборке модулей указывать эту сконфигурированную папку, тогда модуль соберется без вяка и загрузится без проблем. Ну если в колде ошибок не насажать :)

И таки да, читая того же Цилюрик или еще кого, в случае проблем не винить сразу свои руки, бывает просто архитектура ядра изменилась и документ про более старое ядро.

ЗЫ А любителям дзена и трудностей, изучать исходники ядра :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 15 ноя 2015, 04:16 
Старожил

Зарегистрирован: 28 янв 2012, 21:27
Сообщения: 292
Откуда: Питер
fr0ster писал(а):
ЗЫ А любителям дзена и трудностей, изучать исходники ядра :)

Кстати, для ковыряния в коде ядра довольно удобно использовать этот ресурс: http://lxr.free-electrons.com


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 15 ноя 2015, 12:05 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1165
margadon писал(а):
https://github.com/linux-sunxi/linux-sunxi/blob/sunxi-3.4/drivers/tty/serial/serial_core.c#L498это оно? мне стоит попробовать поковырять функцию uart_write ?

Нет, надо просто изменить конфигурацию ядра. В вашем по дефолту HZ_250 и PREEMPT_NONE, попробуйте HZ_1000 и PREEMPT.
И потом запускать приложение с повышенным приоритетом (см. команду nice)

_________________
less is more


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 15 ноя 2015, 13:17 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
Вот ссылка на статьи Цилюрика по теме. Единственно там части с 43 по 47 не нашлись, но вручную поправив номер например части 42 с https://www.ibm.com/developerworks/ru/l ... _kernel_42 на https://www.ibm.com/developerworks/ru/l ... _kernel_44 попадете на нужную часть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 16 ноя 2015, 12:24 
Здравствуйте!

Зарегистрирован: 16 ноя 2015, 12:11
Сообщения: 1
Цитата:
Нет, надо просто изменить конфигурацию ядра. В вашем по дефолту HZ_250 и PREEMPT_NONE, попробуйте HZ_1000 и PREEMPT.
И потом запускать приложение с повышенным приоритетом (см. команду nice)


посмотрел конфиг ядра там
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREEMPT=y
CONFIG_PREEMPT_COUNT=y
CONFIG_HZ=100

Проблема осталась.
Те ли я настройки смотрю?


Вложения:
Комментарий к файлу: конфиг
myconfigA20.txt [95.77 Кб]
Скачиваний: 111
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 17 ноя 2015, 21:25 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
fantom писал(а):
Цитата:
Нет, надо просто изменить конфигурацию ядра. В вашем по дефолту HZ_250 и PREEMPT_NONE, попробуйте HZ_1000 и PREEMPT.
И потом запускать приложение с повышенным приоритетом (см. команду nice)


посмотрел конфиг ядра там
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREEMPT=y
CONFIG_PREEMPT_COUNT=y
CONFIG_HZ=100

Проблема осталась.
Те ли я настройки смотрю?


Все зависит от того, какую проблему хотите решить.
Та, что у ТСа была этой настройкой не решается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 17 ноя 2015, 22:33 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1165
fr0ster, так а какая по-вашему проблема у ТС?
ИМХО, задержки между пакетами - это задержки переключения задач, но могу ошибаться, конечно )

_________________
less is more


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 17 ноя 2015, 23:05 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
vt340 писал(а):
fr0ster, так а какая по-вашему проблема у ТС?
ИМХО, задержки между пакетами - это задержки переключения задач, но могу ошибаться, конечно )


У ТСа проблема в уровне, на котором выполняется конкретная задача.
То, что должен делать системный процесс, делает пользовательский.

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

Так что ТСу стоит пересмотреть архитектору программы, а потом с ядром шаманить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 18 ноя 2015, 14:12 
Только пришел

Зарегистрирован: 12 ноя 2015, 18:10
Сообщения: 8
приоритет повысили, проблема осталась. Задержки ровно такой-же длины. с такими-же интервалами.
Цитата:
То, что должен делать системный процесс, делает пользовательский.

fr0ster, как Вы это определили?
под спойлером методы осуществляющие чтение и запись из модуля pyserial, которым пишем и читаем из UARTa.:
Show

откуда следует что именно моя программа отсылает данные непосредственно в UART?
драйвер UART вот тут: https://github.com/linux-sunxi/linux-sunxi/blob/sunxi-3.4/drivers/tty/serial/serial_core.c
там есть метод static int uart_write(struct tty_struct *tty,const unsigned char *buf, int count)
со строки 498 начинается.
как мне понять, это модуль ядра, или нет? Если модуль, как понять к нему я обращаюсь из своей программы, или в обход его?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 18 ноя 2015, 15:06 
Старожил

Зарегистрирован: 19 июн 2012, 14:17
Сообщения: 3440
margadon писал(а):
откуда следует что именно моя программа отсылает данные непосредственно в UART?

os.write работает с дескриптором файловой системы, т.е. с драйвером, а не непосредственно с UART`ом.

margadon писал(а):
как мне понять, это модуль ядра, или нет?

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

Но вернёмся к баранам, если нужен маленький джиттер между пакетами надо смотреть в сторону ОСРВ ядра (например rt preempt patch) и/или переносить код обработки пакетов в более привилегированный контекст.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 18 ноя 2015, 16:02 
Только пришел

Зарегистрирован: 12 ноя 2015, 18:10
Сообщения: 8
Цитата:
надо смотреть в сторону ОСРВ ядра

#uname -a
Linux a20-olimex 3.4.90+ #11 SMP PREEMPT Wed Aug 20 08:20:32 EEST 2014 armv7l GNU/Linux
Цитата:
и/или переносить код обработки пакетов в более привилегированный контекст.

И это делали, с помощью nice. безрезультатно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу 1, 2  След.

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


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

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


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

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

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