Como posso reduzir o alto uso de CPU dos DPCs com portas seriais USB?

1

Eu tenho um aplicativo que se comunica com até 50 dispositivos em portas seriais. A comunicação ocorre em encadeamentos e os encadeamentos são limitados para que apenas um determinado número esteja ativo de uma só vez. Os encadeamentos são criados conforme necessário, fazem seu trabalho e terminam e liberam seus recursos usados.

Em alguns casos, as portas seriais são implementadas com portas Ethernet TCP / IP Moxa. Um driver Moxa é executado no PC, que expõe os dispositivos Moxa na rede como uma porta COM.

Em outros casos, as portas seriais são implementadas através de hubs USB que fornecem 10 portas seriais cada.

Aqui está o problema. Quando somente as portas seriais Moxa são usadas e (digamos) 8 estão habilitadas, o uso da CPU do aplicativo oscila entre 1% e 30%, dependendo de quantos segmentos estão ativos. O aplicativo se comporta de maneira sensata e o PC é responsivo.

Quando 8 portas USB são ativadas, o uso da CPU do aplicativo atinge um pico de 50-60%, como esperado, mas o uso da CPU do PC total sobe para quase 100% e permanece lá. Não é de surpreender que tudo pare.

Eu usei o Process Explorer e descobri que a maior parte do uso da CPU fora do meu aplicativo estava em duas tarefas - Processo ocioso do sistema / DPCs (Chamadas de procedimento adiadas) e Processo / sistema ocioso do sistema. O uso nessas tarefas tem um pico de cerca de 40% cada. Quando apenas as portas Moxa estão em uso, essas tarefas não mostram um uso significativo da CPU.

Eu tentei mexer na prioridade do thread e isso não faz diferença. As portas funcionam com uma taxa de transmissão relativamente baixa (2400).

A execução de uma ferramenta de verificação de latência DPC mostra até 6ms de latência quando as portas seriais USB estão em uso.

    
por rossmcm 06.12.2011 / 22:24

1 resposta

1

O alto uso da CPU resultou do fato de que no aplicativo cada canal abriu sua porta serial no início da sessão e a manteve aberta durante a sessão do aplicativo. Isso funcionou bem com as portas baseadas nos adaptadores Moxa ethernet para porta COM ou com portas "locais", mas nas portas USB, apenas a porta aberta causa o uso da CPU DPC. Ter 16 portas USB abertas torna o PC inutilizável, apesar de não haver tráfego em nenhuma porta.

Eu alterei o aplicativo para que as portas sejam abertas sempre que forem necessárias (o que dura apenas alguns segundos a cada minuto) e fechadas imediatamente depois.

    
por 11.12.2011 / 09:59