【问题标题】:How to setup a periodic timer callback in a Linux kernel module如何在 Linux 内核模块中设置周期性定时器回调
【发布时间】:2013-11-30 12:20:12
【问题描述】:

我正在开发一个 Linux 内核模块,该模块为来自定制板的中断注册回调,并将接收到的数据放入 char 设备接口后面的队列中,以供应用程序处理。该模块需要不断地监控和测量来自板子的中断和数据,即使板子没有中断,所以它还有一个根据时间触发的回调。

当前实现使用 RTC 中断作为恒定定时器源。我禁用内核 RTC 驱动程序 (CONFIG_RTC_DRV_CMOS) 并请求 IRQ 8 并将定时器回调挂钩为 RTC 中断处理程序。 RTC 芯片每秒都会产生中断。

问题是我们必须失去一些 Linux 以这种方式管理时间的能力,因为一次只能加载 rtc-cmos 或板模块中的一个(显然我们已经选择了板模块)。

目标架构是 i386 PC。

我不是内核开发人员,因此对内核模块开发没有全面的了解,但我正在努力寻找自己的方式,这些是我想到的最接近解决方案的事情:

  • 以某种方式在两个模块之间共享 IRQ 8(可能像 request_irq(8, rtc_handler, IRQF_SHARED, rtc_handler)?)或链式加载 IRQ 处理程序。
  • 寻找另一种方法将处理程序从内核模块挂钩到 RTC 中断,而不是注册 IRQ 8。
  • 找到另一个可在内核模块中使用的 1 秒计时器事件来源,也许有一个标准的内核 API,我不知道。

我想可能有一种简单而标准的方法可以做到这一点,如果有人对这些解决方案中的任何一个发表评论或提出其他建议,我会很高兴。

【问题讨论】:

    标签: linux linux-kernel linux-device-driver embedded-linux interrupt


    【解决方案1】:

    Linux 内核高分辨率计时器hrtimer 是一个选项。 http://lwn.net/Articles/167897/

    这是我的工作:

    #include <linux/interrupt.h>
    #include <linux/hrtimer.h>
    #include <linux/sched.h>
    
    static struct hrtimer htimer;
    static ktime_t kt_periode;
    
    static void timer_init(void)
    {
        kt_periode = ktime_set(0, 104167); //seconds,nanoseconds
        hrtimer_init (& htimer, CLOCK_REALTIME, HRTIMER_MODE_REL);
        htimer.function = timer_function;
        hrtimer_start(& htimer, kt_periode, HRTIMER_MODE_REL);
    }
    
    static void timer_cleanup(void)
    {
        hrtimer_cancel(& htimer);
    }
    
    static enum hrtimer_restart timer_function(struct hrtimer * timer)
    {
        // @Do your work here. 
    
        hrtimer_forward_now(timer, kt_periode);
    
        return HRTIMER_RESTART;
    }
    

    【讨论】:

      【解决方案2】:

      您可能想使用一个 tasklet,请参阅 linux/interrupt.h

      【讨论】:

        猜你喜欢
        • 2013-12-16
        • 2012-01-08
        • 1970-01-01
        • 2013-08-06
        • 2014-01-06
        • 1970-01-01
        • 1970-01-01
        • 2020-07-27
        • 2011-03-03
        相关资源
        最近更新 更多