Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, leonneon, Вы писали:
L>>Тут проблема еще в том, что есть быстродействующий спектроанализатор, который общается с программой при помощи usb и у него драйвер написан под Windows. Скорость получения от него данных меньше 1 мс. В общем получается процессор сильно нагружается при работе всего этого.
Pzz>Вы недооцениваете производительность современных процессоров. За 1 мс он успевает не представляете сколько всего сделать.
Я получаю данные путем поллинга. Т.е. в цикле вызываю функцию, которая ждет получения данных, и функция которая принимает данные. В итоге процессор нагружается. Мне на форуме говорили, что поллинг плохой прием, который неоправданно жрет процессор, и у usb имеется библиотеки приема данных с нормальными callback, но я в эту тему плохо понимаю.
Здравствуйте, leonneon, Вы писали:
L>Я получаю данные путем поллинга. Т.е. в цикле вызываю функцию, которая ждет получения данных, и функция которая принимает данные. В итоге процессор нагружается. Мне на форуме говорили, что поллинг плохой прием, который неоправданно жрет процессор, и у usb имеется библиотеки приема данных с нормальными callback, но я в эту тему плохо понимаю.
Что значит "ждет получения данных"?
Если вы создали обычный блокирующийся сокет и в цикле зовете recv()/recvfrom(), то эти функции блокируют вызвавший их поток до того момента, пока данные не придут. В заблокированном состоянии поток не жрет процессор.
Если же вы зачем-то перевели сокет в неблокирующийся режим, то recv()/recvfrom() действительно завершатся сразу, даже если данных пока нет. В таком случае, непонятно, зачем вы это сделали.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, leonneon, Вы писали:
L>>В пакете приходят 13 байт. В первых двух байтах значения идентификаторов команд. В следующих двух байтах приходит количество тактов, в остальных значения аттенюаторов, напряжений и сил тока. L>>Вот все что приходит от контроллера устройств. Про картинку я не совсем понял.
Pzz>Еще раз. Есть ваш компьютер с вендой. В него приходят пакеты, как вы выше объяснили. А что из него выходит? Из компьютера с вендой, а не из контроллера устройств.
Из него выходят посылки запроса контроллеру устройств на изменение значения аттенюаторов.
Здравствуйте, leonneon, Вы писали:
Pzz>>Еще раз. Есть ваш компьютер с вендой. В него приходят пакеты, как вы выше объяснили. А что из него выходит? Из компьютера с вендой, а не из контроллера устройств.
L>Из него выходят посылки запроса контроллеру устройств на изменение значения аттенюаторов.
А вот это, пожалуйста, чуть подробнее.
Аттеньюатор — это механическое устройство? Каково время его реакции?
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, leonneon, Вы писали:
Pzz>>>Еще раз. Есть ваш компьютер с вендой. В него приходят пакеты, как вы выше объяснили. А что из него выходит? Из компьютера с вендой, а не из контроллера устройств.
L>>Из него выходят посылки запроса контроллеру устройств на изменение значения аттенюаторов.
Pzz>А вот это, пожалуйста, чуть подробнее.
Pzz>Аттеньюатор — это механическое устройство? Каково время его реакции?
Аттенюаторы относятся к малошумящим преобразователям(МШПр), с их помощью мы подавляем мощность входного сигнала, принимаемого антенной, как я понял. Время реакции не знаю.
L>>>Тут проблема еще в том, что есть быстродействующий спектроанализатор, который общается с программой при помощи usb и у него драйвер написан под Windows. Скорость получения от него данных меньше 1 мс. В общем получается процессор сильно нагружается при работе всего этого. Pzz>>Вы недооцениваете производительность современных процессоров. За 1 мс он успевает не представляете сколько всего сделать. L>Я получаю данные путем поллинга. Т.е. в цикле вызываю функцию, которая ждет получения данных, и функция которая принимает данные. В итоге процессор нагружается. Мне на форуме говорили, что поллинг плохой прием, который неоправданно жрет процессор, и у usb имеется библиотеки приема данных с нормальными callback, но я в эту тему плохо понимаю.
Если нет ограничений на версию винды (и можно поставить восьмерку) — возможно вам будет полезно RIO
Но в любом случае натягивание совы на глобус винды на реалтайм — изначально плохая задумка и гарантированного решения на выходе вы не получите.
+ если совсем ничего не поможет стоит заглянуть в настройки сетевой карты и поотключать всякие 'interrupt moderation', burst-ы и т.п.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, leonneon, Вы писали:
L>>Я получаю данные путем поллинга. Т.е. в цикле вызываю функцию, которая ждет получения данных, и функция которая принимает данные. В итоге процессор нагружается. Мне на форуме говорили, что поллинг плохой прием, который неоправданно жрет процессор, и у usb имеется библиотеки приема данных с нормальными callback, но я в эту тему плохо понимаю.
Pzz>Что значит "ждет получения данных"?
Pzz>Если вы создали обычный блокирующийся сокет и в цикле зовете recv()/recvfrom(), то эти функции блокируют вызвавший их поток до того момента, пока данные не придут. В заблокированном состоянии поток не жрет процессор.
Pzz>Если же вы зачем-то перевели сокет в неблокирующийся режим, то recv()/recvfrom() действительно завершатся сразу, даже если данных пока нет. В таком случае, непонятно, зачем вы это сделали.
Здесь немного про другое. По сокету я работаю с контроллером устройств. А при помощи usb я получаю данные со спектроанализатора, и чтобы получить от него данные я использую поллинг.
Здравствуйте, ononim, Вы писали:
L>>>>Тут проблема еще в том, что есть быстродействующий спектроанализатор, который общается с программой при помощи usb и у него драйвер написан под Windows. Скорость получения от него данных меньше 1 мс. В общем получается процессор сильно нагружается при работе всего этого. Pzz>>>Вы недооцениваете производительность современных процессоров. За 1 мс он успевает не представляете сколько всего сделать. L>>Я получаю данные путем поллинга. Т.е. в цикле вызываю функцию, которая ждет получения данных, и функция которая принимает данные. В итоге процессор нагружается. Мне на форуме говорили, что поллинг плохой прием, который неоправданно жрет процессор, и у usb имеется библиотеки приема данных с нормальными callback, но я в эту тему плохо понимаю. O>Если нет ограничений на версию винды (и можно поставить восьмерку) — возможно вам будет полезно RIO O>Но в любом случае натягивание совы на глобус винды на реалтайм — изначально плохая задумка и гарантированного решения на выходе вы не получите. O>+ если совсем ничего не поможет стоит заглянуть в настройки сетевой карты и поотключать всякие 'interrupt moderation', burst-ы и т.п.
Можно пожалуйста поподробней, про RIO, в чем его основная задача?
L>>>>>Тут проблема еще в том, что есть быстродействующий спектроанализатор, который общается с программой при помощи usb и у него драйвер написан под Windows. Скорость получения от него данных меньше 1 мс. В общем получается процессор сильно нагружается при работе всего этого. Pzz>>>>Вы недооцениваете производительность современных процессоров. За 1 мс он успевает не представляете сколько всего сделать. L>>>Я получаю данные путем поллинга. Т.е. в цикле вызываю функцию, которая ждет получения данных, и функция которая принимает данные. В итоге процессор нагружается. Мне на форуме говорили, что поллинг плохой прием, который неоправданно жрет процессор, и у usb имеется библиотеки приема данных с нормальными callback, но я в эту тему плохо понимаю. O>>Если нет ограничений на версию винды (и можно поставить восьмерку) — возможно вам будет полезно RIO O>>Но в любом случае натягивание совы на глобус винды на реалтайм — изначально плохая задумка и гарантированного решения на выходе вы не получите. O>>+ если совсем ничего не поможет стоит заглянуть в настройки сетевой карты и поотключать всякие 'interrupt moderation', burst-ы и т.п. L>Можно пожалуйста поподробней, про RIO, в чем его основная задача?
сори, ссылочку забыл вставить: http://www.serverframework.com/asynchronousevents/2011/10/windows-8-registered-io-networking-extensions.html
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
L>>>>>>Тут проблема еще в том, что есть быстродействующий спектроанализатор, который общается с программой при помощи usb и у него драйвер написан под Windows. Скорость получения от него данных меньше 1 мс. В общем получается процессор сильно нагружается при работе всего этого. Pzz>>>>>Вы недооцениваете производительность современных процессоров. За 1 мс он успевает не представляете сколько всего сделать. L>>>>Я получаю данные путем поллинга. Т.е. в цикле вызываю функцию, которая ждет получения данных, и функция которая принимает данные. В итоге процессор нагружается. Мне на форуме говорили, что поллинг плохой прием, который неоправданно жрет процессор, и у usb имеется библиотеки приема данных с нормальными callback, но я в эту тему плохо понимаю. O>>>Если нет ограничений на версию винды (и можно поставить восьмерку) — возможно вам будет полезно RIO O>>>Но в любом случае натягивание совы на глобус винды на реалтайм — изначально плохая задумка и гарантированного решения на выходе вы не получите. O>>>+ если совсем ничего не поможет стоит заглянуть в настройки сетевой карты и поотключать всякие 'interrupt moderation', burst-ы и т.п. L>>Можно пожалуйста поподробней, про RIO, в чем его основная задача? O>сори, ссылочку забыл вставить: http://www.serverframework.com/asynchronousevents/2011/10/windows-8-registered-io-networking-extensions.html
L>Тут проблема еще в том, что есть быстродействующий спектроанализатор, который общается с программой при помощи usb и у него драйвер написан под Windows.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, Eugeny__, Вы писали:
L>>Тут проблема еще в том, что есть быстродействующий спектроанализатор, который общается с программой при помощи usb и у него драйвер написан под Windows.
E__>
Это такой осцилограф, ручки которого можно крутить не только на его передней панели, но и через USB. И скриншоты получать.
Здравствуйте, leonneon, Вы писали:
L>Здесь немного про другое. По сокету я работаю с контроллером устройств. А при помощи usb я получаю данные со спектроанализатора, и чтобы получить от него данные я использую поллинг.
По UDP вы тоже работаете через сокет, потому что никак по-другому с UDP не поработаешь.
Pzz>Я очень подозреваю, что товарищу и не нужен никакой RT. Если ему надо просто аккуратно собирать информацию и показывать ее на экране, времянка вообще особого значения не имеет. Если же он там крутит тяжелыми механическими устройствами, вряд ли ошибка в несколько миллисекунд при воздействии на такое устройство хоть как-то будет заметна. Лишь бы не накапливалась систематическая погрешность (когда ошибка всегда в одну сторону, грубо говоря).
А вдруг это система автоматического слежения за целью в РЛС? Чуть зазевался — и потерял цель
Как много веселых ребят, и все делают велосипед...
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, leonneon, Вы писали:
L>>Здесь немного про другое. По сокету я работаю с контроллером устройств. А при помощи usb я получаю данные со спектроанализатора, и чтобы получить от него данные я использую поллинг.
Pzz>По UDP вы тоже работаете через сокет, потому что никак по-другому с UDP не поработаешь.
Так это я и подразумевал, по udp я принимаю через сокет сообщения от контроллера устройств, а для работы со спектроанализатором имеется библиотека, и заголовочный файл, в котором описаны функции для работы с ним. Спектроанализатор общается с компьютером через usb.
Здравствуйте, leonneon, Вы писали:
L>На Windows можно обеспечить микросекундные задержки, это можно сделать при помощи Boost chrono, это мне подсказали в форуме.
Очень легко сделать микросекундные (да, в принципе, и наносекундные) задержки, то есть гарантировать, что следующий оператор в рабочем потоке выполнится не ранее, чем через заданное время задержки. И даже никакой boost для этого не нужен (см QueryPerformanceCounter). Но невозможно гарантировать, что оператор выполнится сразу же за предыдущим. Любой поток имеет полное право (и вовсю пользуется этим правом) заснуть хорошо если на десятки, а то и на сотни миллисекунд в любой момент. То есть, Вы устанавливаете задержку в программе, допустим, 500мкс. На 1000 вызовов у Вас в 900 случаях реальная задержка будет 500мкс, в 98 — 10500мкс, а в 2 случаях — 100500мкс.
Ваша задача на обычном компьютере выглядит совершеннейшей утопией, Вы зря тратите время. И даже QNX тут не поможет, точнее, это будет из пушки по воробьям. Вам нужен специализированный контроллер.
S> Ваша задача на обычном компьютере выглядит совершеннейшей утопией, Вы зря тратите время. И даже QNX тут не поможет, точнее, это будет из пушки по воробьям. Вам нужен специализированный контроллер.
qnx поможет, как и любая ось жесткого реального времени, типа вот. Пример с пушкой врядли подходит. Контроллер поможет конечно под полностью своим софтом, как и скажем, обычный писюк по досом
Как много веселых ребят, и все делают велосипед...
А>* Вместо слова Windows подставьте по вкусу Linux, MacOS, OpenBSD да хоть Android.
А вот тут вы заблуждаетесь — с помощью нехитрых настроек (современные версии) Linux становится в достаточной мере realtime. SHED_FIFO и rtprio > всего кроме net interrupt и timer interrupt. В общем, я на этом не только собаку съел, и, уверяю, это вполне реально.
Здравствуйте, sz36, Вы писали:
S>Здравствуйте, leonneon, Вы писали:
L>>Отвечу поподробней. В общем контроллер устройств управляет фазовращателями(не особо важно в этом контексте). В нем имеется 2 генератора состояний: 1, 0, -1, 0 и 0, 1, 0, -1, которые изменяются циклически.
S> В такой постановке задача нереальная, а уж тем более под гражданской ОС, типа Windows. Контроллеры должны ставить отметки времени в своих пакетах, тем или иным образом, тогда можно будет попытаться их как-то синхронизировать.
При принятии сообщения возникла проблема, пакеты идут неупорядоченно, так есть какая-нибудь возможность получать пакет по порядку, не дожидаясь других пакетов, т.е. сразу. Как отправил контроллер устройств сообщение, так у себя в программе получить сразу же этот пакет?