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!