Добрый день! Возникла такая проблема, стабильно принимать сообщения раз в 1 мс. Операционная система Windows, пишу на Qt, протокол передачи UDP. Размер сообщения 13 байт. Сообщения стабильно посылает контроллер устройств раз в 1 мс. Выносил в отдельный поток с высоким приоритетом прием сообщений с контроллера устройств, но все равно появляются задержки. Может кто нибудь скажет, как справиться с этой проблемой? Буду очень рад, если предложите свои мысли, решения.
Re: udp без задержек
От:
Аноним
Дата:
17.12.13 07:55
Оценка:
Здравствуйте, leonneon, Вы писали:
L>Добрый день! Возникла такая проблема, стабильно принимать сообщения раз в 1 мс. Операционная система Windows, пишу на Qt, протокол передачи UDP. Размер сообщения 13 байт. Сообщения стабильно посылает контроллер устройств раз в 1 мс. Выносил в отдельный поток с высоким приоритетом прием сообщений с контроллера устройств, но все равно появляются задержки. Может кто нибудь скажет, как справиться с этой проблемой? Буду очень рад, если предложите свои мысли, решения.
А в чем проблема? Сообщения теряются или вам хочется точно раз в 1мс еще какие то действия предпринять? Типа ответ отправить?
В любом случае, Windows это не Real Time система, соответственно время выполнения операций не гарантируется.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, leonneon, Вы писали:
L>>Добрый день! Возникла такая проблема, стабильно принимать сообщения раз в 1 мс. Операционная система Windows, пишу на Qt, протокол передачи UDP. Размер сообщения 13 байт. Сообщения стабильно посылает контроллер устройств раз в 1 мс. Выносил в отдельный поток с высоким приоритетом прием сообщений с контроллера устройств, но все равно появляются задержки. Может кто нибудь скажет, как справиться с этой проблемой? Буду очень рад, если предложите свои мысли, решения.
А>А в чем проблема? Сообщения теряются или вам хочется точно раз в 1мс еще какие то действия предпринять? Типа ответ отправить? А>В любом случае, Windows это не Real Time система, соответственно время выполнения операций не гарантируется.
Мне нужно принимать сообщения точно раз в 1 мс. Ответ отправлять не обязательно.
Re[3]: udp без задержек
От:
Аноним
Дата:
17.12.13 09:31
Оценка:
L>Мне нужно принимать сообщения точно раз в 1 мс. Ответ отправлять не обязательно.
А что вам должна эта точность дать? В чем фишка? Время точно узнать, когда датаграмма прибудет?
L>>Мне нужно принимать сообщения точно раз в 1 мс. Ответ отправлять не обязательно.
А>А что вам должна эта точность дать? В чем фишка? Время точно узнать, когда датаграмма прибудет?
Отвечу поподробней. В общем контроллер устройств управляет фазовращателями(не особо важно в этом контексте). В нем имеется 2 генератора состояний: 1, 0, -1, 0 и 0, 1, 0, -1, которые изменяются циклически.
Первый генератор изменяет свои состояния раз в 1 мс. За 8мс будет такая последовательность 1 0 -1 0 1 0 -1 0. Второй генератор изменяет состояние раз в 1,25 мс. За 10 мс. будет такая последовательность 0 1 0 -1 0 1 0 -1.
Сам контроллер устройств работает на частоте 125 микросекунд. Назовем изменение контроллера устройств за 125 микросек. — тактом. Так вот, каждые 8 тактов будет изменяться положение первого генератора. А каждые 10 тактов изменяется положение второго генератора. 8 — тактов это 1 мс. 10 тактов это 1.25 мс. В программе мне нужно получать точно заданную во времени последовательность генераторов. Например первого генератора, который изменяет состояния с частотой 1 мс. должен получить такую последовательность 1 0 -1 0 1 0 -1 0 1 0 -1 0 за 12 мс. Контроллер устройств шлет сообщения каждые 8 тактов. В сообщении посылается количество тактов и другие показатели(напряж. сила тока). В итоге получив количество тактов я могу восстановить последовательность состояний генераторов, разделив на 32 и 40. Эти числа значат полный оборот генератора состояний. В общем для этого и нужна такая точность при приеме сообщения.
L>Отвечу поподробней. В общем контроллер устройств управляет фазовращателями(не особо важно в этом контексте). В нем имеется 2 генератора состояний: 1, 0, -1, 0 и 0, 1, 0, -1, которые изменяются циклически.
Ох, я надеюсь это не софт для АЭС или спутника какого? Ибо использование стоковой железяки с виндой для таких задач — большая ошибка.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
L>>Отвечу поподробней. В общем контроллер устройств управляет фазовращателями(не особо важно в этом контексте). В нем имеется 2 генератора состояний: 1, 0, -1, 0 и 0, 1, 0, -1, которые изменяются циклически. O>Ох, я надеюсь это не софт для АЭС или спутника какого? Ибо использование стоковой железяки с виндой для таких задач — большая ошибка.
Если поточнее, то для слежения и наведения антенны в реальном времени.
Здравствуйте, leonneon, Вы писали:
L>Отвечу поподробней. В общем контроллер устройств управляет фазовращателями(не особо важно в этом контексте). В нем имеется 2 генератора состояний: 1, 0, -1, 0 и 0, 1, 0, -1, которые изменяются циклически.
В такой постановке задача нереальная, а уж тем более под гражданской ОС, типа Windows. Контроллеры должны ставить отметки времени в своих пакетах, тем или иным образом, тогда можно будет попытаться их как-то синхронизировать.
L>Добрый день! Возникла такая проблема, стабильно принимать сообщения раз в 1 мс. Операционная система Windows, пишу на Qt, протокол передачи UDP
В (обычной) версии Windows эта проблема не имеет надёжного решения.
Обратите внимание на QNX, заточенной под решение таких задач. Qt for QNX ЕМНИП существует и развивается.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, leonneon, Вы писали:
L>>В общем для этого и нужна такая точность при приеме сообщения.
Pzz>Все равно не понятно. Что вы делаете с принятыми сообщениями?
Если более подробней вдаваться в подробности, то есть один из вариантов решения задачи. У себя в программе я реализовал, подобие контроллера устройств, с такой же частотой вращения 125 микросек, где так же имеется счетчик тактов. Через каждые 1 и 1,25 мс изменяется положение генераторов. Такт как и в контроллере устройств, изменяется от 0 до 65536. Вся суть такая, чтобы контроллер устройств и опорный контроллер вращались на одной частоте, т.е. у них должны совпадать количества тактов. Если как то синхронизировать их работу, то задача будет решена. На Windows можно обеспечить микросекундные задержки, это можно сделать при помощи Boost chrono, это мне подсказали в форуме.
Здравствуйте, leonneon, Вы писали:
L>Если более подробней вдаваться в подробности, то есть один из вариантов решения задачи. У себя в программе я реализовал, подобие контроллера устройств, с такой же частотой вращения 125 микросек, где так же имеется счетчик тактов. Через каждые 1 и 1,25 мс изменяется положение генераторов. Такт как и в контроллере устройств, изменяется от 0 до 65536. Вся суть такая, чтобы контроллер устройств и опорный контроллер вращались на одной частоте, т.е. у них должны совпадать количества тактов. Если как то синхронизировать их работу, то задача будет решена. На Windows можно обеспечить микросекундные задержки, это можно сделать при помощи Boost chrono, это мне подсказали в форуме.
Ваш контроллер что делает, и с какой скоростью должен реагировать?
Здравствуйте, SkyDance, Вы писали:
L>>Добрый день! Возникла такая проблема, стабильно принимать сообщения раз в 1 мс. Операционная система Windows, пишу на Qt, протокол передачи UDP
SD>В (обычной) версии Windows эта проблема не имеет надёжного решения. SD>Обратите внимание на QNX, заточенной под решение таких задач. Qt for QNX ЕМНИП существует и развивается.
Тут проблема еще в том, что есть быстродействующий спектроанализатор, который общается с программой при помощи usb и у него драйвер написан под Windows. Скорость получения от него данных меньше 1 мс. В общем получается процессор сильно нагружается при работе всего этого.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, leonneon, Вы писали:
L>>Если более подробней вдаваться в подробности, то есть один из вариантов решения задачи. У себя в программе я реализовал, подобие контроллера устройств, с такой же частотой вращения 125 микросек, где так же имеется счетчик тактов. Через каждые 1 и 1,25 мс изменяется положение генераторов. Такт как и в контроллере устройств, изменяется от 0 до 65536. Вся суть такая, чтобы контроллер устройств и опорный контроллер вращались на одной частоте, т.е. у них должны совпадать количества тактов. Если как то синхронизировать их работу, то задача будет решена. На Windows можно обеспечить микросекундные задержки, это можно сделать при помощи Boost chrono, это мне подсказали в форуме.
Pzz>Ваш контроллер что делает, и с какой скоростью должен реагировать?
Вообще мой контроллер это бесконечный цикл, счетчик которого является — такт, который изменяется от 0 до 65536 циклически. В цикле стоит задержка sleep(125 микросекунд). В итоге такт изменяется каждые 125 микросекунд. Когда такт становится равным 8(это 1 мс). То изменяем значение первого генератора. Например у него была 1 меняем на 0, затем еще через 8 тактов, 0 на -1, потом -1 на 0. При каждом изменении состояния посылаем сигнал c измененным значением. То же самое и для второго генератора, который меняется раз в 10 тактов. Так же каждый 8 такт, посылаем сигнал со значением такта, т.е. последовательность сигналов будет такая 0 8 16 24 32 40.... и т.д. В итоге нужно количество тактов в моем контроллере приравнять с контроллером устройств, чтобы они изменяли положения своих генераторов синхронно.
Re: udp без задержек
От:
Аноним
Дата:
18.12.13 12:07
Оценка:
Все внимательно прочел.
И так: управлять чем либо real time, windows не может. Вам могут много насоветовать всякой ерунды ( изменить разрешение системного таймера, пользовать высокоточным таймером и.т.д ). Все это херня — Windows не система реального времени ( по сути а ней более менее в реальном времени работает только обработчик таймерных прерываний ) и не надо на нее навешивать несвойственные задачи. Windows (не)нужен: для организации рабочего места оператор а (GUI), для организации высокоскоростных расчетов, как сервер (БД, подключение удаленных клиентов и.т.п) *. Для задач, о которых вы говорите — нужна специализированная железка работающая в RT ( неважно, контроллер со свое прошивкой или однокристаллка с QNX ).
* Вместо слова Windows подставьте по вкусу Linux, MacOS, OpenBSD да хоть Android.
Здравствуйте, leonneon, Вы писали:
L>Вообще мой контроллер это бесконечный цикл, счетчик которого является — такт, который изменяется от 0 до 65536 циклически. В цикле стоит задержка sleep(125 микросекунд). В итоге такт изменяется каждые 125 микросекунд. Когда такт становится равным 8(это 1 мс). То изменяем значение первого генератора. Например у него была 1 меняем на 0, затем еще через 8 тактов, 0 на -1, потом -1 на 0. При каждом изменении состояния посылаем сигнал c измененным значением. То же самое и для второго генератора, который меняется раз в 10 тактов. Так же каждый 8 такт, посылаем сигнал со значением такта, т.е. последовательность сигналов будет такая 0 8 16 24 32 40.... и т.д. В итоге нужно количество тактов в моем контроллере приравнять с контроллером устройств, чтобы они изменяли положения своих генераторов синхронно.
Давайте не будем пока погружаться в подробности, типа числа тактов в цикле.
Вот у вас есть компьютер. В него каждую миллисекунду приходят по UDP некие данные. А что из него наружу выходит, кроме картинки на экране?
Здравствуйте, leonneon, Вы писали:
L>Тут проблема еще в том, что есть быстродействующий спектроанализатор, который общается с программой при помощи usb и у него драйвер написан под Windows. Скорость получения от него данных меньше 1 мс. В общем получается процессор сильно нагружается при работе всего этого.
Вы недооцениваете производительность современных процессоров. За 1 мс он успевает не представляете сколько всего сделать.
Здравствуйте, Аноним, Вы писали:
А>И так: управлять чем либо real time, windows не может. Вам могут много насоветовать всякой ерунды ( изменить разрешение системного таймера, пользовать высокоточным таймером и.т.д ). Все это херня — Windows не система реального времени ( по сути а ней более менее в реальном времени работает только обработчик таймерных прерываний ) и не надо на нее навешивать несвойственные задачи. Windows (не)нужен: для организации рабочего места оператор а (GUI), для организации высокоскоростных расчетов, как сервер (БД, подключение удаленных клиентов и.т.п) *. Для задач, о которых вы говорите — нужна специализированная железка работающая в RT ( неважно, контроллер со свое прошивкой или однокристаллка с QNX ).
Я очень подозреваю, что товарищу и не нужен никакой RT. Если ему надо просто аккуратно собирать информацию и показывать ее на экране, времянка вообще особого значения не имеет. Если же он там крутит тяжелыми механическими устройствами, вряд ли ошибка в несколько миллисекунд при воздействии на такое устройство хоть как-то будет заметна. Лишь бы не накапливалась систематическая погрешность (когда ошибка всегда в одну сторону, грубо говоря).
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, leonneon, Вы писали:
L>>Вообще мой контроллер это бесконечный цикл, счетчик которого является — такт, который изменяется от 0 до 65536 циклически. В цикле стоит задержка sleep(125 микросекунд). В итоге такт изменяется каждые 125 микросекунд. Когда такт становится равным 8(это 1 мс). То изменяем значение первого генератора. Например у него была 1 меняем на 0, затем еще через 8 тактов, 0 на -1, потом -1 на 0. При каждом изменении состояния посылаем сигнал c измененным значением. То же самое и для второго генератора, который меняется раз в 10 тактов. Так же каждый 8 такт, посылаем сигнал со значением такта, т.е. последовательность сигналов будет такая 0 8 16 24 32 40.... и т.д. В итоге нужно количество тактов в моем контроллере приравнять с контроллером устройств, чтобы они изменяли положения своих генераторов синхронно.
Pzz>Давайте не будем пока погружаться в подробности, типа числа тактов в цикле.
Pzz>Вот у вас есть компьютер. В него каждую миллисекунду приходят по UDP некие данные. А что из него наружу выходит, кроме картинки на экране?
В пакете приходят 13 байт. В первых двух байтах значения идентификаторов команд. В следующих двух байтах приходит количество тактов, в остальных значения аттенюаторов, напряжений и сил тока.
Вот все что приходит от контроллера устройств. Про картинку я не совсем понял.
Здравствуйте, leonneon, Вы писали:
L>В пакете приходят 13 байт. В первых двух байтах значения идентификаторов команд. В следующих двух байтах приходит количество тактов, в остальных значения аттенюаторов, напряжений и сил тока. L>Вот все что приходит от контроллера устройств. Про картинку я не совсем понял.
Еще раз. Есть ваш компьютер с вендой. В него приходят пакеты, как вы выше объяснили. А что из него выходит? Из компьютера с вендой, а не из контроллера устройств.