Как делать что-то каждую миллисекунду или лучше в Windows

Этот вопрос не о точном времени выполнения чего-либо в Windows (XP или выше), а скорее о том, чтобы делать что-то очень быстро с помощью обратного вызова или прерывания .

Мне нужно делать что-то регулярно каждые 1 миллисекунду, а лучше даже каждые 100 микросекунд. Что мне нужно сделать, так это управлять некоторым асинхронным оборудованием (Ethernet) с этой скоростью, чтобы выводить устойчивый поток пакетов в сеть и сделать этот поток как можно более регулярным и синхронным. Но если вопрос можно отделить от (Ethernet) устройства, было бы хорошо знать общий ответ.

Прежде чем вы скажете «даже не думайте об использовании Windows !!!!», немного контекста. Не все системы реального времени предъявляют одинаковые требования. В большинстве случаев песни и видео приемлемо воспроизводятся в Windows, несмотря на необходимость обработки блоков звука или изображений в среднем каждые 10-16 мс или около того. При соответствующей буферизации Windows может иметь свои переменные задержки, но оборудование может быть невосприимчивым к ним и поддерживать устойчивый синхронный поток происходящих событий. Даже в этом случае большинство из нас терпят случайные сбои. Мое приложение похоже на это - вероятно, довольно терпимое.

Дорогой вариант для меня - это перенести все мое приложение на Linux. Но Linux - это просто другое программное обеспечение, работающее на одном и том же оборудовании, поэтому я сильно предпочитаю писать более качественное программное обеспечение и придерживаться Windows. У меня есть возможность исключить все конкурирующее оборудование и программное обеспечение (нет доступа к Интернету или другим сетям, нет других запущенных приложений и т. Д.). Есть ли у меня возможность заставить Windows делать это? С какими ограничениями я столкнусь?

Я знаю, что на моем целевом оборудовании есть высокопроизводительный таймер событий, и что этот таймер можно запрограммировать на прерывание, но для него нет драйвера. Могу я написать один? Есть ли там полезные примеры? Я еще не нашел. Будет ли это мешать QueryPerformanceCounter? Означает ли тот факт, что я собираюсь использовать устройство Ethernet, все становится просто, если я использую select () разумно?

Указатели на полезные статьи приветствуются - я нашел десятки обзоров о том, как получить точное время, но пока нет информации о том, как сделать что-то подобное, кроме как с использованием того, что составляет занятое ожидание. Есть ли способ избежать длительного ожидания? Есть ли вариант режима ядра или драйвера устройства?

7
задан omatai 10 August 2011 в 22:19
поделиться