|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.04.2020, 18:39 | #1 |
Пользователь
Регистрация: 02.04.2020
Сообщений: 30
|
Точные интервалы между пакетами во внешний порт
Делаю тестовую систему для запуска на обычном компе с виндой.
Запускается набор одинаковых независимых процессов, каждый из которых шлет данные в свой USB порт. Нужно выдерживать интервалы между пакетами данных в единицы миллисекунд и с точностью до миллисекунды. Функция Sleep тут не катит. Пробовал использовать PerformanceCounter. Не смог организовать так, чтобы не притормаживать другие параллельные потоки опросом счетчика. Как правильно решить задачу? |
02.04.2020, 20:00 | #2 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Никак Виндоус это ОС с вытесняющей многозадачностью. Она вам ничего не гарантирует. Хотите выдерживать берёте микро контроллер и ОС жесткого реального времени.
Во-вторых какой смысл выдерживать интервалы для USB? USB это шина построенная на принципах временного разделения обслуживания портов. Поэтому ваш HUB в материнской плате сам вычитывает из ОЗУ пакеты и посылает их в порт, а затем раз в 1 мс меняет номер порта и шлёт на следующий. Если устройства быстрые, то переключение идёт раз 0,125 мс Соответственно вам даже заботиться о этом не нужно. Сразу подготавливаете все пакеты они встают в очередь и железо само вычитывает и отправляет с нужными интервалами. NtDelayExecution позволяет организовать паузы менее 1 мс.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
03.04.2020, 21:11 | #3 | |
Пользователь
Регистрация: 02.04.2020
Сообщений: 30
|
Цитата:
Просто приходится очередной раз переносить готовое решение со старого компа на новый в новое окружение. При переезде с WinXP на Win7 хорошо отлаженный процесс пошел в раскосяк. Выяснил: функци Sleep Там я пользовался NtDelayExecution позволяет организовать паузы менее 1 мс.[/QUOTE] |
|
03.04.2020, 21:18 | #4 | ||
Пользователь
Регистрация: 02.04.2020
Сообщений: 30
|
Цитата:
Просто приходится очередной раз переносить готовое решение со старого компа на новый в новое окружение. При переезде с WinXP на Win7 хорошо отлаженный процесс пошел в раскосяк. Выяснил: функция Sleep в Win7 гуляет как хочет: назначаешь 10мс, а можешь получить от 3 до 20. Попробовал использовать PerformanceCounter. Кое как "вылечил". Но ценой излишнего притормаживания других потоков. Сейчас приходится опять с 32 битной платформы перелопачивать на 64 битную. Вот и решил поспрашивать опытных человеков, чтобы зря не блуждать. Цитата:
Где посмотреть? На каких платформах поддерживается? |
||
03.04.2020, 22:21 | #5 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
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. |
|
04.04.2020, 17:35 | #6 |
Пользователь
Регистрация: 02.04.2020
Сообщений: 30
|
Спасибо, Pavia. Буду пробовать.
Все изначально было написано в C++. Там была полная свобода вплоть до WinAPI. Приходится переносить все в C#, .NЕT. Большая часть упомянутого не значится в справочниках мелкософта для этой платформы. Буду полагаться на таймеры в каждом потоке, которые будут притормаживать поток на установленный интервал. |
04.04.2020, 18:40 | #7 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
|
06.04.2020, 17:00 | #8 |
Пользователь
Регистрация: 02.04.2020
Сообщений: 30
|
Спасибо, но это - по пионерски.
Был такой случай - после этого ничего с компом сделать не мог, пока не перестартовал. Это небезопасно и неудобно. Компьютер - это компьютер, а не контроллер. |
06.04.2020, 19:02 | #9 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с пакетами | 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 |