-1

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

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

我可以使用类似的东西:

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

假设我的处理器以 1Gbps 的速度执行,上面的 for 循环会给我 1000 微秒的延迟,即 1 毫秒吗?

4

3 回答 3

0

您不能在中断处理程序中休眠。

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

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

于 2016-04-05T10:06:11.213 回答
0

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

至于引入微观延迟,我用过的一件事是cpu_relax(). 该函数也用于内核中以实现上述udelay()ndelay()某些 CPU 架构。我建议你看一下这个函数在 Linux 内核中的使用位置和方式。这可能会给你一些关于你的具体情况的想法。

于 2016-04-06T09:24:15.620 回答
-2

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

于 2016-04-05T09:52:03.713 回答