2012-01-05 5 views
11

todos saben que el controlador de interrupciones debe ser lo más corto posible. y agregar funciones como printk para la depuración dentro de un manejador de interrupciones es algo que no se debe hacer. En realidad, lo intenté antes cuando estaba depurando el kernel de Linux para un dispositivo de char de interrupción que escribí, y arruinó el tiempo del controlador.printk dentro de un manejador de interrupciones, ¿es realmente tan malo?

La pregunta que tengo, ¿por qué está sucediendo esto? printk ¡la función está en el búfer! significa, por lo que entiendo, que los datos se insertan en una cola, y que se están manejando más tarde, muy probablemente después de que el controlador de interrupciones haya finalizado.

¿Por qué no funciona?

+4

Considere la posibilidad de que su llamada de impresión solo llene el búfer, forzándolo a enjuagar. ¿Qué sucederá al hacer E/S en su manejador de interrupciones? –

+0

SÍ, es realmente tan malo. Gracias y buenas noches. –

+0

It * does * work. 'printk' está diseñado para ser llamado desde el contexto de interrupción o proceso. Si no fuera así, no sería de mucha utilidad para la depuración. Sin embargo, obviamente no lo llamas en contexto de interrupción en un controlador de producción. – EML

Respuesta

26

La función printk no solo se inserta en una cola/búfer: suponiendo que el nivel de registro sea lo suficientemente alto, la salida de printk se emitirá a la consola inmediatamente, como parte de la llamada al printk. Esto es especialmente lento si la consola está, por ejemplo, en un puerto serie. Pero en cualquier caso, printk sí introduce una sobrecarga considerable y puede afectar el tiempo.

Si tiene un lugar crítico de tiempo en el que desea obtener algún resultado de depuración, puede verlo utilizando la función trace_printk en núcleos modernos. De hecho, esto solo pone entrada en el anular de rastreo y puede leerlo más tarde. Eche un vistazo a this article para más detalles.

+0

¿Cómo se depura como una alternativa a trace_printk? ¿Es lo suficientemente bueno o tiene alguna advertencia? – user31986

-3

Sí, es muy malo ya que printf probablemente no sea reentrante. Lo que puede ocurrir es que el programa principal invoque printf, se produzca una interrupción mientras se ejecuta printf, y luego el manejador de IRQ vuelve a llamar al printf: pueden ocurrir cosas muy malas (por ejemplo, interbloqueo, búferes internos corruptos, etc.)

+7

La pregunta es sobre 'printk', no' printf' que ni siquiera existe en el kernel. Y el 'printk' del kernel de Linux es reentrante y se puede llamar desde el contexto de interrupción, etc. Por lo tanto, esta respuesta está totalmente equivocada. – Roland

+0

Uh, leí mal el título, y el nombre de la función tiene un carácter final funky en su publicación:/ – zvrba

+0

¿En serio qué estás tratando de agregar a la discusión? Me pregunto por qué esa respuesta no está marcada como negativa. – user31986

Cuestiones relacionadas