Easyelectronics.ru

Электроника для всех
Текущее время: 21 июн 2018, 11:02

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • 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
Сообщения: 971
...для начала как вы выставили таймауты для работы с портом и код.
И Debian - не ОСРВ по-умолчанию.

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

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


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

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


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

Зарегистрирован: 26 апр 2013, 23:55
Сообщения: 971
Цитата:
Значит-ли это что я должен отказаться от 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
Сообщения: 3132
яверт писал(а):
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
Сообщения: 3132
Про ядра и модули Цилюрика чтать имеет смысл для начала только, потом нужно что посвежее.
За 4 года архитектура изменилась слегка.


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

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


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

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3132
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
Сообщения: 3132
Гуглить 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
Сообщения: 1103
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
Сообщения: 3132
Вот ссылка на статьи Цилюрика по теме. Единственно там части с 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 Кб]
Скачиваний: 109
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нежданные задержки между посылками UART в Debian.
СообщениеДобавлено: 17 ноя 2015, 21:25 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3132
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
Сообщения: 1103
fr0ster, так а какая по-вашему проблема у ТС?
ИМХО, задержки между пакетами - это задержки переключения задач, но могу ошибаться, конечно )

_________________
less is more


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

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3132
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 часов


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

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


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

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

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