内核模块处理中断的速度有多快?
How fast can kernel module handle interrupts?
我正在嵌入式 Linux(Yocto 发行版)上编写内核模块,我想处理来自其中一个硬件定时器的一些高频中断。但是,我发现 1us 分辨率对于 Linux(?) 来说太高了——我认为是因为值不正确。
代码很简单:
static irqreturn_t pmodule_ref2_irq(int irq, void *lp)
{
unsigned long int temp;
ns++;
temp = ioread32(temp_base_addr + TTC1_INTERRUPT_REGISTER);
return IRQ_HANDLED;
}
将间隔值更改为高 100 倍可以解决问题,但我的解决方案并不令人满意。
我的问题是:谁能告诉我内核模块中断的处理速度有多快,或者我该如何检查?
延迟取决于您的最终硬件。您可以在此处了解预期结果(使用 preempt-rt 时):
https://www.osadl.org/Combined-latency-plot-of-all-systems-und.qa-latencyplot-all.0.html?latencies=&showno=&slider=159
基本上,您应该预计最大延迟在 30 到 200 微秒之间。该值包括内核空间到用户空间的切换,但这可以给你一个想法。
我正在嵌入式 Linux(Yocto 发行版)上编写内核模块,我想处理来自其中一个硬件定时器的一些高频中断。但是,我发现 1us 分辨率对于 Linux(?) 来说太高了——我认为是因为值不正确。 代码很简单:
static irqreturn_t pmodule_ref2_irq(int irq, void *lp)
{
unsigned long int temp;
ns++;
temp = ioread32(temp_base_addr + TTC1_INTERRUPT_REGISTER);
return IRQ_HANDLED;
}
将间隔值更改为高 100 倍可以解决问题,但我的解决方案并不令人满意。
我的问题是:谁能告诉我内核模块中断的处理速度有多快,或者我该如何检查?
延迟取决于您的最终硬件。您可以在此处了解预期结果(使用 preempt-rt 时): https://www.osadl.org/Combined-latency-plot-of-all-systems-und.qa-latencyplot-all.0.html?latencies=&showno=&slider=159
基本上,您应该预计最大延迟在 30 到 200 微秒之间。该值包括内核空间到用户空间的切换,但这可以给你一个想法。