简介

内核定时器,也称作动态定时器。是管理内核时间的基础,是一种用来推迟执行程序的工具。

  1. include/linux/timer.h
  2. struct timer_list {
  3. /*
  4. * All fields that change during normal runtime grouped to the
  5. * same cacheline
  6. */
  7. struct hlist_node entry;
  8. unsigned long expires;// 定时器到期的tick数,也就是 jiffies这个全局变量中
  9. void (*function)(unsigned long); // 定时器到期执行的函数
  10. unsigned long data; // 传递的参数
  11. u32 flags; //
  12. ...
  13. #ifdef CONFIG_LOCKDEP
  14. struct lockdep_map lockdep_map;
  15. #endif
  16. };

Linux内核系统中,分为硬件时钟(实时时钟)和软件时钟(系统时钟)。内核编程过程中,我们常用到的是软件时钟(系统时钟)。系统时钟时在系统启动的时候,读取的硬件时钟(实时时钟)所得。然后由内核维护。
系统时钟以某种频率触发时钟中断,这个频率就是我们常说的节拍率tick rate。节拍率是通过静态预处理生成的,被定义为HZ。HZ被定义为1秒产生多少个时钟中断。如下,HZ为100,表示一个tick为10ms。

  1. #define HZ 100
  2. /*jiffies 表示从系统运行至今,tick数*/
  3. extern unsigned long volatile __jiffy_data jiffies;

内核定时器

基于时间轮算法的内核定时器。是一个动态的定时器。
内核定时器的精度不高。若是需要实时性比较高的定时器,推荐使用hrtimer,

使用

使用内核定时器的一般步骤为

  • 定义一个timer_list结构,编写回调函数
  • 初始化timer,为其expires、flags参数赋值
  • 调用add_timer。将定时器添加到系统中
  • 回调函数被执行以后,调用del_timer或者mod_timer。删除或者重新修改定时器。

    API

  1. #define DEFINE_TIMER(_name, _function, _expires, _data) # 定义一个timerlist结构体
  2. extern void add_timer(struct timer_list *timer); /*向系统加入timer_list*/
  3. extern int del_timer(struct timer_list * timer);
  4. extern int mod_timer(struct timer_list *timer, unsigned long expires);

使用例子

  1. #include <linux/timer.h>
  2. /*内核定时器*/
  3. static struct timer_list mytimer;
  4. /*回调函数*/
  5. static void qt_task(unsigned long data)
  6. {
  7. struct timer_list *timer = (struct timer_list *)data;
  8. ...
  9. /*重新赋值*/
  10. mod_timer(timer,jiffies+msecs_to_jiffies(1000));
  11. }
  12. static int __init hello_world_init(void) {
  13. setup_timer(&mytimer,qt_task,(unsigned long)&mytimer);
  14. add_timer(&mytimer);
  15. }
  16. static void __exit hello_world_exit(void) {
  17. del_timer(&mytimer);
  18. }

参考资料

Linux驱动技术(七) _内核定时器与延迟工作
Improving the kernel timers API