6 votos

¿Es USB UHCI basado en encuestas o impulsado por interrupciones?

He tenido una discusión con algunos colegas sobre si USB se basa en encuestas o en interrupciones. Algunos afirman que los teclados USB tienen un mayor sobrecargo que, por ejemplo, los teclados PS/2 debido a la necesidad de que el primero sea encuestado por la CPU principal. Ahora, con las velocidades de CPU típicas de hoy en día, probablemente sería una pequeña cantidad de tiempo de CPU gastado en cualquier caso, pero aún así es interesante saberlo.

He intentado investigar por mí mismo. Sospecho que la respuesta podría depender de la interfaz del controlador de host USB. Me centré específicamente en UHCI, que es uno de los estándares originales y es bastante fácil de entender (ftp://ftp.netbsd.org/pub/NetBSD/misc/blymn/uhci11d.pdf). Según mi lectura de esto, parece que se podría argumentar de ambas maneras si los dispositivos USB se basan en encuestas o no.

Entonces aquí algunos hechos que he recopilado de la lectura de la especificación UHCI:

1) Es verdad que un dispositivo USB (al menos antes de USB 3.0, que es lo que se aplica a la mayoría / todos los teclados) no puede enviar activamente una interrupción. Solo pueden responder a una consulta sobre si hay una interrupción pendiente. Por lo tanto, esta consulta debe enviarse periódicamente.

Hasta ahora, el punto 1 sugiere que de hecho es basado en encuestas. Pero entonces tenemos:

2) No es la CPU misma la que envía las consultas, sino más bien el controlador de host.

3) Sin embargo, la CPU principal tiene que programar el controlador de host, estableciendo un cronograma detallado de lo que sucede en cada milisegundo.

4) El controlador de host UHCI puede enviar interrupciones a la CPU principal para alertarla sobre transferencias completadas. Por lo tanto, la CPU principal no necesita encuestar la finalización de las transferencias.

Así que ahora parecería (y esto es lo que algunos colegas argumentaron) que desde el punto de vista de la CPU principal, USB de todos modos no se basa en encuestas. Es el controlador de host que encuesta periódicamente y luego entrega las interrupciones a la CPU principal. Esto no sería tan malo, porque el controlador de host no tiene otros trabajos, así que no es un problema que esté haciendo esta encuesta.

Pero desafortunadamente, no creo que esto sea realmente el caso después de todo, porque:

5) Según mi lectura de UHCI, no hay forma en que la CPU principal pueda configurar un controlador UHCI y un teclado USB de modo que una vez configurados, la CPU principal no tenga que hacer más trabajo hasta que suceda algo, por ejemplo, el usuario presiona una tecla y el teclado establece una interrupción pendiente que se entrega al controlador de host y, en última instancia, al host según se especifica arriba. Según mi lectura, la CPU principal tiene que "trabajar" continuamente para mantenerlo funcionando. Según lo veo, hay dos razones para esto:

  • Los descriptores de transferencia tienen un bit de Interrupción en finalización que se puede establecer para que la CPU principal sea interrumpida al finalizar la transferencia. Hasta aquí todo bien, pero desafortunadamente no hay forma de diferenciar entre respuestas positivas y negativas a consultas de interrupción, por lo que esto significa que la CPU principal será interrumpida cada vez que un dispositivo sea consultado sobre el estado de interrupción, no importa si tiene una interrupción pendiente o no.
  • El cronograma no puede ser reutilizado. Cada descriptor de transferencia tiene un bit ACTIVO que debe establecerse en 1 para que el controlador de host lo ejecute. El controlador de host lo establece en 0 después de haberlo ejecutado. Como resultado, la CPU principal tendrá que pasar periódicamente por los descriptores de transferencia y establecerlos de nuevo como activos, para que se ejecuten nuevamente.

Así que aunque parece que UHCI tiene el potencial de entregar interrupciones "de forma gratuita" a la CPU principal, parece que los dos puntos anteriores lo arruinan y significa que incluso si la CPU principal no tiene que estar comprometida en la encuesta directa del teclado, aún tiene que reprogramar periódicamente la encuesta, incluso en el caso de la ausencia de eventos. Lo que significa que está de alguna manera comprometido en la encuesta.

Realmente me interesa si alguien podría validar estas observaciones, especialmente los dos puntos anteriores. ¡Puntos extra si alguien puede señalar cómo difieren OHCI, EHCI y XHCI en estos aspectos!

2voto

joelmdev Puntos 148

El punto clave es que normalmente, las transferencias de interrupción no se consideran completas hasta que se recibe alguna data. los excelentes documentos del protocolo USB de beyondLogic dicen:

Si una interrupción ha sido encolada por el dispositivo, la función enviará un paquete de datos que contiene información relevante a la interrupción cuando reciba el Token IN. [...] Si, por otro lado, no se presentó una condición de interrupción cuando el host sondeó el endpoint de interrupción con un Token IN, entonces la función señala este estado enviando un NAK.

Para tu controlador específico, la tabla en la página 22 de tu documento menciona el contador de reintentos en 28:27. Si observas la tabla, notarás que ¡"NAK recibido" no lo decrementa! Entonces, siempre y cuando establezcas al menos un reintent y no decrementes, el controlador reintentará indefinidamente en caso de NAKs, sin molestar al host.


Pero hay una manera mucho más sencilla de verificar esto: encuentra un sistema Linux con teclado USB y verifica el contador de interrupciones:

watch -d -n 0.5 cat /proc/interrupts

En mi sistema, hay una línea que dice "IR-PCI-MSI 327680-edge xhci_hcd", y tiene un número que no cambia si no estoy tocando el ratón o teclado. Mover el ratón hace que este número aumente. Entonces claramente es basado en interrupciones.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X