printk在一个中断处理程序中,它真的那么糟糕吗?

大家都知道中断处理程序应该尽可能短。 并且在中断处理程序中添加用于调试的函数如printk是不应该做的事情。 实际上,我之前在为我编写的中断驱动的char设备调试linux内核时尝试过它,它破坏了驱动程序的时序。

我的问题是,为什么会发生这种情况? printk函数被缓冲! 这意味着,据我所知,数据被插入到队列中,并且稍后处理,很可能是在中断处理程序完成之后。

那为什么不起作用呢?

printk函数不只是插入队列/缓冲区 – 假设日志级别足够高, printk的输出将立即发送到控制台,作为对printk的调用的一部分。 如果控制台是在串行端口上,则这尤其慢。 但无论如何, printk确实会引入相当大的开销并且会影响时序。

如果您有一个需要获得调试输出的时序关键位置,您可以在现代内核中使用trace_printk函数。 这实际上只是将输入放入跟踪环形缓冲区,您可以稍后阅读。 请查看本文以获取完整详细信息。

是的,这是非常糟糕的,因为printf很可能不是可重入的。 可能发生的是主程序调用printf,一个中断在printf执行时到达,然后IRQ处理程序再次调用printf :可能发生非常糟糕的事情(例如,死锁,损坏的内部缓冲区等)