Как я могу уменьшить высокую загрузку ЦП от ЦОД с последовательными портами USB

У меня есть приложение, которое связывается с 50 устройствами через последовательные порты. Связь происходит в потоках, и потоки регулируются, так что только определенное число активно одновременно. Потоки создаются по мере необходимости, выполняют свою работу, завершают и освобождают используемые ресурсы.

В некоторых случаях последовательные порты реализованы с портами Ethernet Moxa TCP/IP. Драйвер Moxa работает на ПК, который представляет устройства Moxa в сети как COM-порт.

В других случаях последовательные порты реализуются через концентраторы USB, которые обеспечивают 10 последовательных портов каждый.

Здесь проблема. When only the Moxa serial ports are used, and (say) 8 are enabled, the CPU usage of the app wavers between 1% and 30%, depending on how many threads are active. The app behaves sensibly and the PC is responsive.

When 8 USB ports are then enabled, the CPU usage of the app peaks at 50-60% as I would expect, but the total PC CPU usage climbs to near 100% and stays there. Not surprisingly everything grinds to a halt.

I used Process Explorer and found that the bulk of the CPU usage outside of my app was in two tasks - System Idle Process/DPCs (Deferred Procedure Calls) and System Idle Process/System. The usage in these tasks peaks at around 40% each. When only Moxa ports are in use, these tasks show no significant CPU usage.

I've tried messing with the thread priority and it makes no difference. The ports run at a relatively low baudrate (2400).

Running a DPC latency checker tool shows up to 6ms latency when the USB serial ports are in use.

1 ответ

Высокая загрузка ЦП объясняется тем, что в приложении каждый канал открывал свой последовательный порт в начале сеанса и оставлял его открытым в течение всего сеанса приложения. Это было хорошо с портами, основанными на адаптерах Ethernet-COM-портов Moxa, или с "локальными" портами, но в портах USB, просто открытый порт вызывает использование ЦП DPC. Наличие 16 открытых портов USB делает компьютер непригодным для использования, несмотря на отсутствие трафика на любом порту.

Я изменил приложение так, чтобы порты открывались всякий раз, когда они требуются (что происходит только на несколько секунд каждую минуту или около того), и закрывались сразу после этого.

Другие вопросы по тегам