我知道我当然不能使用msleep或usleep或任何此类函数来引入内核ISR例程中的延迟。
我有一个内核驱动程序,其中定义了一些ISR。在其中一个ISR块中,我必须插入一些毫秒级的延迟。让我们说:
{
//A
//here I need sleep
//B
}
我可以使用类似的东西:
{
//A
for(i=0;i<1000;i++);
//B
}
假设我的处理器正在以1Gbps的速度执行,上面的for循环会给我一个1000 usecs的延迟,即1ms?
答案 0 :(得分:0)
你不能在中断处理程序中睡觉。
此外,你应该在中断处理程序中等待很长时间;这将阻止同一CPU上的所有进程和所有其他中断。
如果你的驱动程序需要在不同的时间做两件事,它应该使用第二个中断或计时器来做第二件事。
答案 1 :(得分:0)
我很想知道故意拖延ISR的原因。一般来说,这是禁忌。如果您认为自己需要,那么很可能意味着您需要重新考虑代码设计。
至于引入微观延迟,我使用的一件事是cpu_relax()
。对于某些CPU架构,此函数也在内核中用于实现上述udelay()
和ndelay()
。我建议你看一看,看看Linux内核中这个函数的用途和方式。这可能会为您的具体情况提供一些想法。
答案 2 :(得分:-2)
函数udelay和ndelay实现忙等待延迟,因此您可以在ISR中使用它们。正如Tsyvarev所说。