如何在Linux内核模块中添加定期计时器回调
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在Linux内核模块中添加定期计时器回调,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2335字,纯文字阅读大概需要4分钟。
内容图文
![如何在Linux内核模块中添加定期计时器回调](/upload/InfoBanner/zyjiaocheng/948/96993678c60546ffb1f5fde55439e960.jpg)
这个问题已经在这里有了答案: > How to add a peridic timer callback in a linux kernel module 2个
我正在研究一个Linux内核模块,该模块注册一个来自定制板的中断的回调,并将接收到的数据放入char设备接口后面的队列中,以供应用程序处理.即使没有来自板的中断,该模块也需要不断地监视和测量来自板的中断和数据,因此它具有另一个根据时间触发的回调.
当前的实现使用RTC中断作为恒定的定时器源.我禁用内核RTC驱动程序(CONFIG_RTC_DRV_CMOS)并请求IRQ 8,并将计时器回调作为RTC中断处理程序挂起. RTC芯片每秒产生一次中断.
问题是我们必须失去Linux的这种时间管理能力,因为一次只能加载rtc-cmos或板模块中的一个(显然,我们选择了板模块).
Linux内核来自Debian 7.2稳定版随附的linux-source软件包,该软件包的版本为3.246.目标体系结构为i386 PC.
我不是内核开发人员,所以对内核模块开发没有太大的了解,但是我试图找到自己的方法,这些是我想到的最接近解决方案的东西:
>以某种方式在两个模块之间共享IRQ 8(例如,request_irq(8,rtc_handler,IRQF_SHARED,rtc_handler)?)或链加载IRQ处理程序.
>寻找一种将处理程序从内核模块挂接到RTC中断的方法,而不是注册IRQ 8.
>寻找另一个可以在内核模块中使用的1秒计时器事件源,也许我没有标准的内核API.
我想可能会有一个简单而标准的方法来执行此操作,如果有人对这些解决方案中的任何一个发表评论或提出其他建议,我将感到高兴.
解决方法:
maybe there is a standard kernel API for that
当然有.在内核模块中需要计时器可能并不稀奇.
我对该API不太了解,但是我知道它存在.如果您要正确地编写内核模块,则应该有一本书.有几种.1无论如何,一种传统方法是:
#include <linux/timer.h>
schedule_timeout(jiffies);
那是被动的睡眠.抖动是基于处理器内250 HZ刻度的单位,尽管这是可以配置的.该标头具有各种其他功能,这里的a brief discussion涉及2.6内核,但是我认为3.x仍必须与此兼容,因为许多源文件(包括驱动程序)都早于该版本.有一种简单的方法可以找出异常.
如果您想延迟一秒钟,可以使用Jiffies.常规内核由于调度程序延迟而导致毫秒级被动睡眠的粒度是一个问题,但是ktime.h中也有一个纳秒粒度的API(该链接再次来自2.6内核,但该文件在3.11中仍然是2005年的来源,因此未更改).请记住,Linux还具有纳秒级粒度的用户空间计时器,但这并不意味着它们会因调度程序延迟而实际上可以在该级别上计时(假定内核空间中的被动计时器也是如此).
您可以访问RTC而不是使用处理器/内核滴答,但是有一些缺点:
>并非所有系统实际上都有一个.
>表示忙循环.
并没有真正的优势. AFAIK RTC被认为比处理器滴答更准确.
1您最好使用的另一个资源是Linux Kernel Mailing List(LKML),这是开发人员所在的位置,他们确实会回答问题.警告该列表每天有成百上千条消息.
内容总结
以上是互联网集市为您收集整理的如何在Linux内核模块中添加定期计时器回调全部内容,希望文章能够帮你解决如何在Linux内核模块中添加定期计时器回调所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。