c - 中断处理程序中的 printk,真的那么糟糕吗?

标签 c linux-kernel interrupt-handling printk

大家都知道中断处理程序应该越短越好。并且在中断处理程序中添加像 printk 这样的函数来进行调试是不应该做的。 实际上,我之前在为我编写的中断驱动的字符设备调试 linux 内核时尝试过它,它破坏了驱动程序的时序。

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

那么为什么它不起作用呢?

最佳答案

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

如果您在时间关键的地方想要获得一些调试输出,您可以考虑在现代内核中使用 trace_printk 函数。这实际上只是将输入放入跟踪环形缓冲区,您可以稍后阅读。看看this article了解全部详情。

关于c - 中断处理程序中的 printk,真的那么糟糕吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8738951/

相关文章:

go - 如何发送中断信号

linux - schedule() 什么时候返回?

c++ - 根据该实用程序的源代码创建类似 Linux "df"的实用程序

memory-management - 当进程访问刚用 brk/sbrk 分配的地址时,内核会发生什么?

c - 具有多个定义的嵌入式 C 和 AVR GCC 编译问题

x86 - Linux/SMP 自旋锁不必要地慢吗?

c - 如何正确实现 kthreads 的完成?

创建第二个数组时,C 数组给出地址而不是值

c - 通过地址将结构传递给函数与 C 中的指针

c - 从现有字符串创建字母数字 + '_' 字符串的更简单方法?