如何在内核驱动程序ISR中使用延迟

时间:2016-04-05 05:11:58

标签: linux-kernel delay sleep isr

我知道我当然不能使用msleep或usleep或任何此类函数来引入内核ISR例程中的延迟。
我有一个内核驱动程序,其中定义了一些ISR。在其中一个ISR块中,我必须插入一些毫秒级的延迟。让我们说:

{  
//A  
//here I need sleep  
//B  
} 

我可以使用类似的东西:

{  
//A  
for(i=0;i<1000;i++);
//B  
}  

假设我的处理器正在以1Gbps的速度执行,上面的for循环会给我一个1000 usecs的延迟,即1ms?

3 个答案:

答案 0 :(得分:0)

你不能在中断处理程序中睡觉。

此外,你应该在中断处理程序中等待很长时间;这将阻止同一CPU上的所有进程和所有其他中断。

如果你的驱动程序需要在不同的时间做两件事,它应该使用第二个中断或计时器来做第二件事。

答案 1 :(得分:0)

我很想知道故意拖延ISR的原因。一般来说,这是禁忌。如果您认为自己需要,那么很可能意味着您需要重新考虑代码设计。

至于引入微观延迟,我使用的一件事是cpu_relax()。对于某些CPU架构,此函数也在内核中用于实现上述udelay()ndelay()。我建议你看一看,看看Linux内核中这个函数的用途和方式。这可能会为您的具体情况提供一些想法。

答案 2 :(得分:-2)

函数udelay和ndelay实现忙等待延迟,因此您可以在ISR中使用它们。正如Tsyvarev所说。