如何在Linux内核模块中添加定期定时器回调
我正在研究一个Linux内核模块,该模块注册一个来自定制板的中断的回调,并将接收到的数据放入char设备接口后面的队列中,以供应用程序处理。即使没有来自板的中断,该模块也需要不断地监视和测量来自板的中断和数据,因此它具有另一个根据时间触发的回调。
当前的实现使用RTC中断作为恒定的定时器源。我禁用了内核RTC驱动程序(CONFIG_RTC_DRV_CMOS
),并请求IRQ
8,并将计时器回调作为RTC中断处理程序。RTC芯片每秒产生一次中断。
问题是我们必须失去Linux以这种方式管理时间的一些功能,因为一次只能rtc-cmos
加载一个或一个板模块(显然,我们选择了板模块)。
目标体系结构是i386 PC。
我不是内核开发人员,所以对内核模块开发没有太大的了解,但是我试图找到自己的方法,这些是我想到的最接近解决方案的东西:
- 以某种方式在两个模块(或类似
request_irq(8, rtc_handler, IRQF_SHARED, rtc_handler)
)之间共享IRQ 8 或链负载IRQ处理程序。 - 寻找另一种方法将处理程序从内核模块挂接到RTC中断,而不是注册IRQ 8。
- 寻找另一个可以在内核模块中使用的1秒计时器事件的来源,也许我没有标准的内核API。
我想可能会有一个简单而标准的方法来执行此操作,如果有人对这些解决方案中的任何一个发表评论或提出其他建议,我将感到非常高兴。
回答:
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;
}
以上是 如何在Linux内核模块中添加定期定时器回调 的全部内容, 来源链接: utcz.com/qa/410540.html