如何在Linux内核设备驱动程序中使用定时器?

我想在Linux设备驱动程序中实现一个计数器,每隔一段固定的时间间隔后,计数器就会增加。 我想在定时器的帮助下做到这一点。 示例代码片段将非常有用。

Solutions Collecting From Web of "如何在Linux内核设备驱动程序中使用定时器?"

阅读以下文章IBM Developerworks:Timers and Lists

有一个小例子,如何使用内核定时器(为了方便起见,这里包括了它,从我自己来说,删除了printk)

 #include <linux/kernel.h> #include <linux/module.h> #include <linux/timer.h> MODULE_LICENSE("GPL"); static struct timer_list my_timer; void my_timer_callback( unsigned long data ) { /* do your timer stuff here */ } int init_module(void) { /* setup your timer to call my_timer_callback */ setup_timer(&my_timer, my_timer_callback, 0); /* setup timer interval to 200 msecs */ mod_timer(&my_timer, jiffies + msecs_to_jiffies(200)); return 0; } void cleanup_module(void) { /* remove kernel timer when unloading module */ del_timer(&my_timer); return; } 

根据你真正想要做的事情,你可以直接使用jiffies来衡量时间,正如评论中所建议的那样。 你也可以使用内核定时器,并给出你的问题中的信息,他们似乎更适合。

内核定时器API非常直观:

 #include <linux/timer.h> struct timer_list { /* ... */ unsigned long expires; void (*function)(unsigned long); unsigned long data; }; void init_timer(struct timer_list *timer); struct timer_list TIMER_INITIALIZER(_function, _expires, _data); void add_timer(struct timer_list * timer); int del_timer(struct timer_list * timer); 

所以你只需要定义一个定时器功能,然后初始化并启动定时器。

您有几个来源可以进一步了解这个主题:

  • 了解Linux内核 。 这本书是内核的一种圣经。 它在某些领域已经过时了,但仍然是一个非常好的信息来源。
  • Linux设备驱动程序 。 开发设备驱动程序时,这是一本非常有用的书。 这里也有一个在线版本。 关于时间,定时器等的章节是第7章。这本书也可能有点过时,因为它也是从2005年开始的。
  • Linux内核开发 。 我没有检查过这本书,但好处是它比2010年更新,因此与前两本书相比,您可能会发现一些更新的信息。