Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2020, 18:39   #1
AnPis
Пользователь
 
Регистрация: 02.04.2020
Сообщений: 30
Вопрос Точные интервалы между пакетами во внешний порт

Делаю тестовую систему для запуска на обычном компе с виндой.
Запускается набор одинаковых независимых процессов, каждый из которых шлет данные в свой USB порт.
Нужно выдерживать интервалы между пакетами данных в единицы миллисекунд и с точностью до миллисекунды. Функция Sleep тут не катит.
Пробовал использовать PerformanceCounter.
Не смог организовать так, чтобы не притормаживать другие параллельные потоки опросом счетчика.
Как правильно решить задачу?
AnPis вне форума Ответить с цитированием
Старый 02.04.2020, 20:00   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Никак Виндоус это ОС с вытесняющей многозадачностью. Она вам ничего не гарантирует. Хотите выдерживать берёте микро контроллер и ОС жесткого реального времени.

Во-вторых какой смысл выдерживать интервалы для USB? USB это шина построенная на принципах временного разделения обслуживания портов. Поэтому ваш HUB в материнской плате сам вычитывает из ОЗУ пакеты и посылает их в порт, а затем раз в 1 мс меняет номер порта и шлёт на следующий. Если устройства быстрые, то переключение идёт раз 0,125 мс
Соответственно вам даже заботиться о этом не нужно. Сразу подготавливаете все пакеты они встают в очередь и железо само вычитывает и отправляет с нужными интервалами.


Цитата:
Сообщение от AnPis Посмотреть сообщение
Функция Sleep тут не катит.
NtDelayExecution позволяет организовать паузы менее 1 мс.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 03.04.2020, 21:11   #3
AnPis
Пользователь
 
Регистрация: 02.04.2020
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Никак Виндоус это ОС с вытесняющей многозадачностью. Она вам ничего не гарантирует. Хотите выдерживать берёте микро контроллер и ОС жесткого реального времени.
Спасибо, это мне известно.
Просто приходится очередной раз переносить готовое решение со старого компа на новый в новое окружение.
При переезде с WinXP на Win7 хорошо отлаженный процесс пошел в раскосяк. Выяснил: функци Sleep
Там я пользовался


NtDelayExecution позволяет организовать паузы менее 1 мс.[/QUOTE]
AnPis вне форума Ответить с цитированием
Старый 03.04.2020, 21:18   #4
AnPis
Пользователь
 
Регистрация: 02.04.2020
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Никак Виндоус это ОС с вытесняющей многозадачностью. Она вам ничего не гарантирует. Хотите выдерживать берёте микро контроллер и ОС жесткого реального времени.
Спасибо, это мне известно.
Просто приходится очередной раз переносить готовое решение со старого компа на новый в новое окружение.
При переезде с WinXP на Win7 хорошо отлаженный процесс пошел в раскосяк. Выяснил: функция Sleep в Win7 гуляет как хочет: назначаешь 10мс, а можешь получить от 3 до 20.
Попробовал использовать PerformanceCounter. Кое как "вылечил". Но ценой излишнего притормаживания других потоков.
Сейчас приходится опять с 32 битной платформы перелопачивать на 64 битную.
Вот и решил поспрашивать опытных человеков, чтобы зря не блуждать.

Цитата:
NtDelayExecution позволяет организовать паузы менее 1 мс.
Копнул по справке на сайте мелкософта. Не смог найти документацию на эту вещь.
Где посмотреть? На каких платформах поддерживается?
AnPis вне форума Ответить с цитированием
Старый 03.04.2020, 22:21   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от AnPis Посмотреть сообщение
Sleep в Win7 гуляет как хочет: назначаешь 10мс, а можешь получить от 3 до 20.
Вот с этого надо было начинать. Тогда вам подойдёт любой другой таймер.
Sleep - да пляшет, но только в главном потоке в побочном она выдерживается строго.
Если конечно процессор не загружен другими потоками.

1. Sleep можно заменить мультимедиыйным таймером.
timeSetEvent+ timeBeginPeriod

timeBeginPeriod(1); // Устанавливаем минимальное время срабатывания мультимидийного таймера в 1мс
timeBeginPeriod - функция глобальная влияет не только на ваши но и на все программы в системе.

2. Так же Sleep можно заменить на таймер ожидания он хорошо работает с точностью в 1 мс
hTimer := CreateWaitableTimer(nil, True, 'WaitableTimer');


3. А вот если нужно более точно то NtDelayExecution у неё стоит прёфикс Nt так что должна работать на всех ОС данного семейства.
Насколько помню поддерживается начиная с XP.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 03.04.2020 в 22:31.
Pavia вне форума Ответить с цитированием
Старый 04.04.2020, 17:35   #6
AnPis
Пользователь
 
Регистрация: 02.04.2020
Сообщений: 30
По умолчанию

Спасибо, Pavia. Буду пробовать.

Все изначально было написано в C++. Там была полная свобода вплоть до WinAPI.
Приходится переносить все в C#, .NЕT.
Большая часть упомянутого не значится в справочниках мелкософта для этой платформы.
Буду полагаться на таймеры в каждом потоке, которые будут притормаживать поток на установленный интервал.
AnPis вне форума Ответить с цитированием
Старый 04.04.2020, 18:40   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от AnPis Посмотреть сообщение
назначаешь 10мс, а можешь получить от 3 до 20.
Повысьте приоритет потока до THREAD_PRIORITY_TIME_CRITICAL а класс приоритет до REALTIME_PRIORITY_CLASS.

Имейте ввиду, система *никогда* не прерывает такой поток.
Нужны права админа.
waleri вне форума Ответить с цитированием
Старый 06.04.2020, 17:00   #8
AnPis
Пользователь
 
Регистрация: 02.04.2020
Сообщений: 30
По умолчанию

Спасибо, но это - по пионерски.
Был такой случай - после этого ничего с компом сделать не мог, пока не перестартовал.
Это небезопасно и неудобно.
Компьютер - это компьютер, а не контроллер.
AnPis вне форума Ответить с цитированием
Старый 06.04.2020, 19:02   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от AnPis Посмотреть сообщение
но это - по пионерски.
Когда будете использовать timeSetEvent / timeBeginPeriod обратите внимание на приоритет их потока.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с пакетами ppm51 Общие вопросы по Java, Java SE, Kotlin 0 20.05.2018 16:44
Где узнать точные циферы? Utkin Свободное общение 23 25.12.2009 16:30
Помогите разобраться с пакетами AleX CODER Работа с сетью в Delphi 1 19.12.2008 11:35
Ноты и интервалы между ними треч Помощь студентам 5 01.02.2008 02:39
работа с Ethernet пакетами kdaemonv Работа с сетью в Delphi 4 06.02.2007 13:37