如何在linux内核模块中添加peridic计时器回调

如何在linux内核模块中添加peridic计时器回调,第1张

概述我正在研究一个 Linux内核模块,该模块为来自定制板的中断注册回调,并将接收到的数据放在char设备接口后面的队列中,由应用程序处理.即使没有来自电路板的中断,该模块也需要不断监视和测量来自电路板的中断和数据,因此它有另一个根据时间触发的回调. 当前实现使用RTC中断作为常量定时器源.我禁用内核RTC驱动程序(CONFIG_RTC_DRV_CMOS)并请求IRQ 8并将定时器回调挂钩为RTC中断 我正在研究一个 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)?)或chainload 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内核模块中添加peridic计时器回调全部内容,希望文章能够帮你解决如何在linux内核模块中添加peridic计时器回调所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1046108.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存