Долгая реакция на повторное событие от модулей ввода

Требовалось обработать одновременное переключение двух клавиш выключателя. Задействованы два входа на WBIO-DI-WD-14, контроллер HW 6.6.0. События наблюдаю в node-red по MQTT.
Реакция на одиночное переключение быстрая, субъективно менее 100 мс.
Реакция на одновременное переключение двух клавиш странная. Одно событие без задержки, второе тормозит до примерно секунды.
Вот что показали исследования:
В режиме поллинга файлов значения в /sys/class/gpio/gpio262/value /sys/class/gpio/gpio263/value изменяются за миллисекунды, тут все нормально. А вот прерывания приходят явно не на каждое переключение. Краткий лог изменений (в колонках gpio262, gpio263, irq224, irq225):

16-02-2020 15:15:51.377961 0 0 66 126
16-02-2020 15:15:58.669667 1 1 66 127
16-02-2020 15:16:01.714860 0 0 66 127 (interrupt lost?)
16-02-2020 15:16:05.122319 1 1 67 127
16-02-2020 15:16:08.084456 0 0 67 128
16-02-2020 15:16:11.728842 1 1 68 128

на два изменения приходит одно прерывание, или вообще не приходит.

Как временное решение уменьшил epoll timeout в wb-homa-gpio/main.cpp.
100 мс уже позволяет отделить одновременное переключение от поочередного (с точки зрения человека), но CPU usage ожидаемо подскочил.

1 лайк

Так в итоге же вы работаете черзе wb-homa-gpio? Если да, то похоже на баг в wb-homa-gpio. Совсем скоро будет новая бета, там как раз переделывали кусок работы с прерываниями. Должно стать лучше.

да, на wb-homa-gpio. Будет интересно протестировать изменения.

1 лайк

Есть ли обновление wb-homa-gpio с решением этой проблемы?
Использую коммит 7d91b1b со своим патчем.

git master 3ede8f6 не собирается - где найти зависимости?

root@wb:~/wb-homa-gpio# make
g++ -c main.cpp -o main.o   -Wall -DNDEBUG -std=c++14 -Os -I.
In file included from main.cpp:2:0:
gpio_driver.h:5:32: fatal error: wblib/declarations.h: No such file or directory
 #include <wblib/declarations.h>
                                ^
compilation terminated.
Makefile:50: recipe for target 'main.o' failed
make: *** [main.o] Error 1

Судя по всему ничего не изменилось. В последней прошивке такая-же долгая реакция на переключение группы контактов, первый переключается сразу, следующие с задержкой до секунды

Надо установить libwbmqtt1-dev

Попробуйте версию 2.0.8 из unstable .Здесь описано как устанавливать.

Не помогло. тыц

Расскажите, что это на видео, пожалуйста.

В данном случае ваш контроллер WB6 эмулирует своего более старого собрата ADAM 5510 с управлением через сеть PLCNET. Да наверное надо было вам дать видео с веб-морды WB6, но поверьте там реакция такая-же. Модуль реле DO-R10A-8, модуль дискретных входов DI-WD-14. Сигнал с реле8 размыкает сухой контакт EXT1_IN9, на видео видно, что при переключении Relay8 сигнал на EXT1_IN9 меняется быстро. (Я с клавиатуры записываю в поле “Значение переменной” 0 или 1. Сам момент записи виден по смене текста на True, False) Relay2 размыкает сухой контакт на входах EXT1_IN1, EXT1_IN3, EXT1_IN5 и EXT1_IN7. Тут видно что после переключения реле один из контактов мгновенно меняет свое состояние, остальные меняют состояние с задержкой до секунды. Веб

Теперь понятно, будем разбираться.

Не появилось ли решение проблемы?

собрал wb-mqtt-gpio (master), задержка имеется.

Сетап такой: двухклавишный выключатель, два входа DI-WD-14 в nodered привязаны к двум реле, управляют LED лентами.
Клац по двум клавишам сразу - одно реле сразу щелкает, второе тупит.

Workaround все тот же, поставил поменьше интервал в gpio_driver.cpp:
const auto EPOLL_TIMEOUT_MS = 100;

чуть лучше, но все равно заметно подтупливание.

1 лайк

А можете вместо этого просто поставить последнюю версию из apt, переключившись перед этим на testing репозиторий?

И ядро тоже свежее поставьте пожалуйста, тоже apt-ом

Поддержу коллегу. В testing новое ядро, которое лучше обрабарывает такие события от gpio.

wb-mqtt-gpio/testing 2.4.0 armhf [upgradable from: 2.1.0]
поставил. Тупит.

testing 2.4.0 из чего собрана? GitHub - wirenboard/wb-homa-gpio: wb-homa-gpio драйвер еще актуален? Последний коммит в мастер 3ede8f64, Tue Nov 3 19:13:37 2020

Как посмотреть diff между 2.1.0 и 2.4.0?

Как я уже писал, проблема в ядре. У вас оно обновилось?
uname -a что выдаёт?

Ура, на 5.10.35-wb3 проблема не проявляется.