Un controlador de dispositivo (para dispositivos como I2C) normalmente se divide en una interfaz de aplicación y una interfaz de hardware.
La interfaz de la aplicación normalmente solo coloca los datos que desea enviar al dispositivo en un búfer, y notifica a la parte de la interfaz de hardware del controlador que hay datos para enviar, y luego regresa a la persona que llama. Pedir datos implicaría comprobar si hay suficientes datos disponibles y esperar a que los datos estén disponibles o devolverlos de inmediato.
La sección de hardware de la interfaz tomaría los datos en el búfer de escritura y los pasaría al hardware tan rápido como el hardware pueda aceptarlo. El hardware normalmente notifica al controlador, por una interrupción, para decir que ha recibido datos para procesar. , o puede aceptar más datos para transmitir.
Existe un requisito de que las secciones de hardware y aplicaciones no intenten modificar los buffers de almacenamiento compartido al mismo tiempo, y hay varias maneras en que esto se puede lograr.
El uso de interrupciones es óptimo, porque el procesador solo tiene que trabajar en el mantenimiento del hardware cuando el hardware indica que está listo. Hacer lo mismo en las tareas implica un proceso conocido como 'sondeo' que pregunta al hardware si está listo. Puede pensar que esto es análogo a apagar el timbre de su teléfono y descolgar el teléfono periódicamente para ver si alguien está llamando.