Справочная информация:
В настоящее время у меня есть аппаратное устройство, которое подключается к USB-порту. Аппаратное устройство отвечает за отправку точных периодических сообщений в различные сети, к которым оно, в свою очередь, также подключается. Внутри аппаратного устройства у меня есть пара микрочипов dsPIC. Есть два режима работы.
Один сценарий - это отправка простых «заданий» в dsPIC, которые, в свою очередь, могут отправлять точные сообщения с точностью до 0,001 мс. Эта архитектура не идеальна для более сложных сообщений, когда нам необходимо отправлять периодический пакет, который изменяется в зависимости от событий, происходящих в приложении для ПК. Таким образом, у нас есть второй режим работы, когда наше приложение для ПК будет отправлять периодические сообщения, а dsPIC просто конвертируют и передают в ответ. Все это, между прочим, прозрачно для конечного пользователя нашего программного обеспечения. Наше аппаратное устройство - это испытательный инструмент, используемый в автомобильной отрасли.
В настоящее время мы используем USB-последовательный чип от FTDI и драйверы FTDI для Windows, чтобы связать оборудование с нашим программным обеспечением для ПК.
Проблема в том, что во втором режиме, когда мы отправляем сообщения с ПК, лучшее, что мы можем достичь - это около 1 мс в среднем аппаратном диапазоне. Мы подвергаемся упреждению ядра Windows. Я попробовал несколько «хитростей» для улучшения таких вещей, как:
- Убедиться в том, что наши потоки читателей и писателей живут, когда это возможно, на отдельных процессорах.
- Увеличение приоритета потока писателя при уменьшении приоритета читателя.
- Информирование пользователя об отключении экранной заставки и других приложений при использовании нашего программного обеспечения.
- Замена вызовов createthread вызовами CreateTimerQueueTimer.
Все наше программное обеспечение написано на C / C ++. Я очень хорошо знаком с продвинутым программированием Windows; такие как IO Completions, Overlapped I / O, очереди потоков без блокировки (на самом деле стратегия проектирования), сокеты, потоки, семафоры и т. д. *
Однако я ничего не знаю о разработке драйверов для Windows. Я прочитал несколько статей о KMDF против UDMF против WDM.
Я надеюсь, что опытный разработчик драйвера режима ядра Windows ответит здесь ...
Следующая версия На нашем оборудовании есть возможность заменить чип FTDI и использовать либо интерфейс USB dsPIC, либо, возможно, перенести материал FTDI с открытым исходным кодом Linux на Windows и продолжить использовать чип FTDI в нашем специальном драйвере. Я думаю, что, перейдя к драйверу режима ядра на стороне ПК, я могу установить драйвер ядра, который может отправлять периодические сообщения с более точными интервалами без прерывания и / или, возможно, используя преимущества DMA.
У нас есть конкурент в нашем бизнесе, который, я думаю, делает то же самое с их инструментами. Насколько я знаю, приложения пользовательского пространства не могут планировать поток лучше, чем 1 мс. В настоящее время мы используем timeGetTime в потоке. Я экспериментировал с таймерными очередями (через CreateTimerQueueTimer) без реального улучшения.
Является ли WDM правильным подходом для достижения более точной синхронизации?
Наш конкурент кое-как добивается очень точной синхронизации от сигналов, управляемых Windows, до их аппаратного обеспечения, и они загружают драйвер ядра (.sys), а их устройство работает по USB2.0, как и наше.
Если WDM - это путь, могу ли я посоветовать, какие функции ядра мне следует изучить для настройки времени?
Спасибо за чтение