在hard irq上下文中使用clock_gettime()无法/不可靠?

时间:2013-06-13 06:24:10

标签: linux time interrupt irq

我使用的是Linux内核3.1.10,我有一个使用中断的驱动程序,我使用了request_irq(irq,my_irq_handler_hard,...)来注册中断; 设备的irq配置为每隔10ms发出一次,我想通过软件方式统计irq的准确度(我知道这可以通过示波器或逻辑分析仪等硬件方式完成,但我需要这样做现在通过软件),因此我可以大致了解设备的时钟精度,irq处理程序非常简单如下,我使用系统callclock_gettime()的后端,即sys_clock_gettime()来捕获时间戳。

然而,在dmesg日志中,我发现了一个奇怪的行为,通常每个中断后打印的时间戳增加大约10000000(ns),但有时候在硬irq处理程序中捕获的时间戳不会增加,直到更多中断。

有谁知道原因?这是否意味着在hard irq上下文中使用clock_gettime()是不可靠的?这是内核的错误吗?

static irqreturn_t my_irq_handler_hard(int irq, void *handle)  
{  
    struct timespec ts_hard;

    sys_clock_gettime(CLOCK_MONOTONIC, &ts_hard);
    printk(KERN_ALERT "in irqh_hard: %lld",
            ts_hard.tv_sec * 1000000000LL + 
            ts_hard.tv_nsec);

    return IRQ_WAKE_THREAD;
}  

0 个答案:

没有答案