每个人都知道中断处理程序应该尽可能短。并且在中断处理程序中添加用于调试的printk
等函数是不应该做的。
实际上,我之前在为我编写的中断驱动的char设备调试linux内核时尝试过它,它破坏了驱动程序的时间。
我的问题是,为什么会发生这种情况?
printk
函数被缓冲了!这意味着,据我所知,数据被插入到队列中,并且稍后处理,很可能是在中断处理程序完成之后。
那为什么不起作用?
答案 0 :(得分:29)
printk
函数不只是插入队列/缓冲区 - 假设日志级别足够高,printk
的输出将立即发送到控制台,作为调用的一部分到printk
。如果控制台是在串行端口上,则这尤其慢。但无论如何,printk
确实会引入相当大的开销,并且会影响时序。
如果您有一个需要获得调试输出的时序关键位置,您可以查看在现代内核中使用trace_printk
函数。这实际上只是将输入放入跟踪环形缓冲区,您可以稍后阅读。有关详细信息,请查看this article。
答案 1 :(得分:-4)
是的,这是非常糟糕的,因为printf
很可能不是可重入的。可能发生的是主程序调用printf,中断在printf
执行时到达,然后IRQ处理程序再次调用printf
:可能发生非常糟糕的事情(例如,死锁,损坏的内部缓冲区,等)